Deploy TiDB Using Docker

This document shows you how to manually deploy a multi-node TiDB cluster on multiple machines using Docker.

To learn more, see TiDB architecture and Software and Hardware Recommendations.

Preparation

Before you start, make sure that you have:

  • Installed the latest version of Docker

  • Pulled the latest images of TiDB, TiKV and PD from Docker Hub. If not, pull the images using the following commands:

    docker pull pingcap/tidb:latest docker pull pingcap/tikv:latest docker pull pingcap/pd:latest

Multi nodes deployment

Assume we have 6 machines with the following details:

Host NameIPServicesData Path
host1192.168.1.101PD1 & TiDB/data
host2192.168.1.102PD2/data
host3192.168.1.103PD3/data
host4192.168.1.104TiKV1/data
host5192.168.1.105TiKV2/data
host6192.168.1.106TiKV3/data

1. Start PD

Start PD1 on the host1

docker run -d --name pd1 \ -p 2379:2379 \ -p 2380:2380 \ -v /etc/localtime:/etc/localtime:ro \ -v /data:/data \ pingcap/pd:latest \ --name="pd1" \ --data-dir="/data/pd1" \ --client-urls="http://0.0.0.0:2379" \ --advertise-client-urls="http://192.168.1.101:2379" \ --peer-urls="http://0.0.0.0:2380" \ --advertise-peer-urls="http://192.168.1.101:2380" \ --initial-cluster="pd1=http://192.168.1.101:2380,pd2=http://192.168.1.102:2380,pd3=http://192.168.1.103:2380"

Start PD2 on the host2

docker run -d --name pd2 \ -p 2379:2379 \ -p 2380:2380 \ -v /etc/localtime:/etc/localtime:ro \ -v /data:/data \ pingcap/pd:latest \ --name="pd2" \ --data-dir="/data/pd2" \ --client-urls="http://0.0.0.0:2379" \ --advertise-client-urls="http://192.168.1.102:2379" \ --peer-urls="http://0.0.0.0:2380" \ --advertise-peer-urls="http://192.168.1.102:2380" \ --initial-cluster="pd1=http://192.168.1.101:2380,pd2=http://192.168.1.102:2380,pd3=http://192.168.1.103:2380"

Start PD3 on the host3

docker run -d --name pd3 \ -p 2379:2379 \ -p 2380:2380 \ -v /etc/localtime:/etc/localtime:ro \ -v /data:/data \ pingcap/pd:latest \ --name="pd3" \ --data-dir="/data/pd3" \ --client-urls="http://0.0.0.0:2379" \ --advertise-client-urls="http://192.168.1.103:2379" \ --peer-urls="http://0.0.0.0:2380" \ --advertise-peer-urls="http://192.168.1.103:2380" \ --initial-cluster="pd1=http://192.168.1.101:2380,pd2=http://192.168.1.102:2380,pd3=http://192.168.1.103:2380"

2. Start TiKV

Start TiKV1 on the host4

docker run -d --name tikv1 \ -p 20160:20160 \ -v /etc/localtime:/etc/localtime:ro \ -v /data:/data \ pingcap/tikv:latest \ --addr="0.0.0.0:20160" \ --advertise-addr="192.168.1.104:20160" \ --data-dir="/data/tikv1" \ --pd="192.168.1.101:2379,192.168.1.102:2379,192.168.1.103:2379"

Start TiKV2 on the host5

docker run -d --name tikv2 \ -p 20160:20160 \ -v /etc/localtime:/etc/localtime:ro \ -v /data:/data \ pingcap/tikv:latest \ --addr="0.0.0.0:20160" \ --advertise-addr="192.168.1.105:20160" \ --data-dir="/data/tikv2" \ --pd="192.168.1.101:2379,192.168.1.102:2379,192.168.1.103:2379"

Start TiKV3 on the host6

docker run -d --name tikv3 \ -p 20160:20160 \ -v /etc/localtime:/etc/localtime:ro \ -v /data:/data \ pingcap/tikv:latest \ --addr="0.0.0.0:20160" \ --advertise-addr="192.168.1.106:20160" \ --data-dir="/data/tikv3" \ --pd="192.168.1.101:2379,192.168.1.102:2379,192.168.1.103:2379"

3. Start TiDB

Start TiDB on the host1

docker run -d --name tidb \ -p 4000:4000 \ -p 10080:10080 \ -v /etc/localtime:/etc/localtime:ro \ pingcap/tidb:latest \ --store=tikv \ --path="192.168.1.101:2379,192.168.1.102:2379,192.168.1.103:2379"

4. Use the MySQL client to connect to TiDB

Install the MySQL client on host1 and run:

$ mysql -h 127.0.0.1 -P 4000 -u root -D test mysql> show databases; +--------------------+ | Database | +--------------------+ | INFORMATION_SCHEMA | | PERFORMANCE_SCHEMA | | mysql | | test | +--------------------+ 4 rows in set (0.00 sec)

How to customize the configuration file

The TiKV and PD can be started with a specified configuration file, which includes some advanced parameters, for the performance tuning.

Assume that the path to configuration file of PD and TiKV on the host is /path/to/config/pd.toml and /path/to/config/tikv.toml

You can start TiKV and PD as follows:

docker run -d --name tikv1 \ -p 20160:20160 \ -v /etc/localtime:/etc/localtime:ro \ -v /data:/data \ -v /path/to/config/tikv.toml:/tikv.toml:ro \ pingcap/tikv:latest \ --addr="0.0.0.0:20160" \ --advertise-addr="192.168.1.104:20160" \ --data-dir="/data/tikv1" \ --pd="192.168.1.101:2379,192.168.1.102:2379,192.168.1.103:2379" \ --config="/tikv.toml"
docker run -d --name pd1 \ -p 2379:2379 \ -p 2380:2380 \ -v /etc/localtime:/etc/localtime:ro \ -v /data:/data \ -v /path/to/config/pd.toml:/pd.toml:ro \ pingcap/pd:latest \ --name="pd1" \ --data-dir="/data/pd1" \ --client-urls="http://0.0.0.0:2379" \ --advertise-client-urls="http://192.168.1.101:2379" \ --peer-urls="http://0.0.0.0:2380" \ --advertise-peer-urls="http://192.168.1.101:2380" \ --initial-cluster="pd1=http://192.168.1.101:2380,pd2=http://192.168.1.102:2380,pd3=http://192.168.1.103:2380" \ --config="/pd.toml"