TiDBローカル環境構築③
TiDBのローカル環境の構築を3回目行なっていきます。
前回DB環境の構築が出来たましたが、今回はDockerでTiDBのDB構築を行っていきます。
コンテナ環境のツリー構成
DB構築時のツリー構造は以下のようにしてます。
.
├── docker-compose.yml
└── src
└── infra
└── db
├── Dockerfile
├── data
│ └── test_db.sql
├── docker-compose.yml
└── entrypoint.sh
ソースコードを作成
各ファイルのコードを記載していきます。
前回のymlと変更点はあまりないです。
"3000:3000"は、今後フロント側作成の際に Portの競合が発生するのと今すぐ必要ではないので削除しました。
services:
tiup-playground:
extends:
file: ./src/infra/db/docker-compose.yml
service: tiup-playground
networks:
tidb-net:
name: tidb-net
driver: bridge
TiDBのコンテナ用のDockerファイルになります。
主にやっていることとすれば、以下の順番で処理を行ってます。
- Linuxの必要パッケージのインストール
- tiupというTiDB用の公式ツールチェインマネージャーをインストールし、TiDBの環境に必要なツールのインストールを行う。tidb、tikv、pd、tiflashの説明は以下の表で行ってます。
- entrypoint.shのコピー
- TiDBの環境変数の設定
- コンテナ外部通信の定義
- entrypoint.shの実行
| コンポーネント | 役割 | 説明 |
|---|---|---|
| TiDB | SQLレイヤー | MySQL互換のSQLエンジン。アプリやMySQLクライアントからのクエリを受け取り、TiKVやTiFlashへ処理を振り分ける。 |
| TiKV | 分散KVストレージ | データを分散して保存するキー・バリューストア。トランザクションや高可用性を提供する。 |
| PD (Placement Driver) | メタデータ管理 & スケジューリング | TiKVクラスタ全体のメタ情報(どのデータがどのノードにあるか)を管理し、データ配置や負荷分散を制御する。 |
| TiFlash | 列指向ストレージ | 分析処理向けのカラム型ストレージエンジン。TiKVと同期しつつ、OLAPクエリの性能を向上させる。 |
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive \
TZ=Asia/Tokyo
RUN apt-get update && apt-get install -y --no-install-recommends \
curl gnupg2 ca-certificates lsb-release bash sudo ssh \
mariadb-client tzdata \
&& rm -rf /var/lib/apt/lists/*
RUN curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh && \
export PATH=/root/.tiup/bin:$PATH && \
tiup update --self && \
tiup update playground && \
tiup install tidb:v7.1.1 tikv:v7.1.1 pd:v7.1.1 tiflash:v7.1.1
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
ENV TIDB_VERSION=v7.1.1 \
TIDB_HOST=0.0.0.0 \
TIDB_TAG=test-cluster \
DB_HOST=127.0.0.1 \
DB_PORT=4000 \
DB_USER=root \
DB_NAME=test
EXPOSE 4000 2379 3000
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
上記の6で実行するentrypoint.shの内容は以下になります。
#!/usr/bin/env bash
set -euo pipefail
export PATH="/root/.tiup/bin:${PATH}"
# 1) TiDB playground をバックグラウンド起動
echo "[db] starting tiup playground ${TIDB_VERSION} ..."
tiup playground "${TIDB_VERSION}" --host "${TIDB_HOST}" --tag "${TIDB_TAG}" &
PLAY_PID=$!
# 2) SQLポート待機(mysqladmin ping / ポートが開くまで)
echo "[db] waiting TiDB on ${DB_HOST}:${DB_PORT} ..."
for i in $(seq 1 120); do
if mysqladmin ping -h"${DB_HOST}" -P"${DB_PORT}" --silent 2>/dev/null; then
echo "[db] TiDB is up"
break
fi
sleep 2
done
# 3) DB作成(なければ)
echo "[db] ensuring database '${DB_NAME}' exists ..."
mysql -h "${DB_HOST}" -P "${DB_PORT}" -u "${DB_USER}" -e "CREATE DATABASE IF NOT EXISTS \`${DB_NAME}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
# 4) 初期DDL投入(/docker-entrypoint-initdb.d/*.sql / *.sql.gz を順次流す)
INIT_DIR="/docker-entrypoint-initdb.d"
if [ -d "${INIT_DIR}" ]; then
shopt -s nullglob
for f in "${INIT_DIR}"/*.sql "${INIT_DIR}"/*.sql.gz; do
case "$f" in
*.sql)
echo "[db] applying: $f"
mysql --default-character-set=utf8mb4 -h "${DB_HOST}" -P "${DB_PORT}" -u "${DB_USER}" -D "${DB_NAME}" < "$f"
;;
*.sql.gz)
echo "[db] applying (gz): $f"
gunzip -c "$f" | mysql --default-character-set=utf8mb4 -h "${DB_HOST}" -P "${DB_PORT}" -u "${DB_USER}" -D "${DB_NAME}"
;;
esac
done
fi
echo "[db] init done. following playground ..."
# 5) playground をフォアグラウンド化(終了待ち)
wait "${PLAY_PID}"
entrypoint.shde実行するDDLになります。
CREATE DATABASE IF NOT EXISTS test_db;
USE test_db;
CREATE TABLE IF NOT EXISTS my_table (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO my_table (name) VALUES ('Test Data 1'), ('Test Data 2');
この状態で以下のコマンドを実行します。
docker-compose up -d
そうするとコンテナが立ち上がり、ダッシュボードの確認ができます。
作成したtidb、tikv、pd、tiflashが使われているのが左側の

以下のスクショで確認できました。

以下のURLにアクセスするとダッシュボードが確認できました。
DBが作成されている確認します。
以下のコマンドでちDBコンテナにアクセスします。
docker exec -it tidb-test sh
アクセスしたコンテナ上で以下のコマンドでTiDBにアクセスしログインします。
mysql -h "${DB_HOST}" -P "${DB_PORT}" -u "${DB_USER}"
DBの存在確認します。
show databases;
そうすると以下のように出力されます。
+--------------------+
| Database |
+--------------------+
| INFORMATION_SCHEMA |
| METRICS_SCHEMA |
| PERFORMANCE_SCHEMA |
| mysql |
| test |
| test_db |
+--------------------+
6 rows in set (0.001 sec)
カラム名やデータベースの詳細を確認したい場合は、MySQL クライアントと同じ操作方法で確認できます。
詰まった箇所
以下のtiupツールを使ってインストールした際にエラーが起こりました。
tiup install tidb:latest tikv:latest pd:latest tiflash:latest
最新バージョンでインストールが完了する想定でしたが、バージョン指定しないとインストール時にエラーが起こるみたいです。
ちなみに以下のエラーが起こってました。
4.776 Error: version latest on linux/arm64 for component tidb not found: unknown version
------
Dockerfile:11
--------------------
10 |
11 | >>> RUN curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh && \
12 | >>> export PATH=/root/.tiup/bin:$PATH && \
13 | >>> tiup update --self && \
14 | >>> tiup update playground && \
15 | >>> tiup install tidb:latest tikv:latest pd:latest tiflash:latest
16 |
--------------------
target tiup-playground: failed to solve: process "/bin/sh -c curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh && export PATH=/root/.tiup/bin:$PATH && tiup update --self && tiup update playground && tiup install tidb:latest tikv:latest pd:latest tiflash:latest" did not complete successfully: exit code: 1
まとめ
TiDBローカル環境構築の第3回では、docker-compose と tiup を使って TiDB のDB環境をDocker上に構築しました。
tidb・tikv・pd・tiflash の4コンポーネントをインストールし、entrypoint.sh でDB初期化やDDL投入を自動化。
ダッシュボード(http://127.0.0.1:2379/dashboard)から稼働状況を確認し、MySQLクライアントからDB作成とテーブル構造を確認しました。
インストール時には latest 指定でエラーになるため、バージョンを明示的に指定する必要がある 点に注意が必要です。
今回は以上になります。続きは後ほど投稿します。
Discussion