本文主要介绍一些常用的借助 docker 快速建立起开发环境。
关于 Docker Compose 及 docker-compose.yml
的描述可以参考: Docker Compose | 菜鸟教程
数据库
MySQL
MySQL 最新版
1 2 3 4 5 6
| docker run \ -p 3306:3306 \ -v mysql-data:/var/lib/mysql \ --name mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -d mysql
|
进入 MySQL 容器:
1 2
| docker exec -it mysql bash mysql -u root -p123456
|
MySQL 5.7
1 2 3 4 5 6
| docker run \ -p 3306:3306 \ -v mysql5.7-data:/var/lib/mysql \ --name mysql5.7 \ -e MYSQL_ROOT_PASSWORD=123456 \ -d mysql:5.7
|
MySQL 主从节点部署
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| version: '2'
services: mysql-master: image: 'bitnami/mysql:latest' ports: - '3306' volumes: - /path/to/mysql-persistence:/bitnami/mysql/data environment: - MYSQL_REPLICATION_MODE=master - MYSQL_REPLICATION_USER=repl_user - MYSQL_REPLICATION_PASSWORD=repl_password - MYSQL_ROOT_PASSWORD=master_root_password - MYSQL_USER=my_user - MYSQL_PASSWORD=my_password - MYSQL_DATABASE=my_database mysql-slave: image: 'bitnami/mysql:latest' ports: - '3306' depends_on: - mysql-master environment: - MYSQL_REPLICATION_MODE=slave - MYSQL_REPLICATION_USER=repl_user - MYSQL_REPLICATION_PASSWORD=repl_password - MYSQL_MASTER_HOST=mysql-master - MYSQL_MASTER_PORT_NUMBER=3306 - MYSQL_MASTER_ROOT_PASSWORD=master_root_password
|
缩放使用的从节点数量,运行:
1
| docker-compose up --detach --scale mysql-master=1 --scale mysql-slave=3
|
上述命令将从节点的数量扩大到 3 个,你可以用同样的方式缩小规模。
不应增加或减少主节点的数量。保证始终只有一个主节点在运行。
参数说明:
参数 |
描述 |
默认值 |
MYSQL_REPLICATION_MODE |
replication 模式,可能的值是 master 或 slave |
无 |
MYSQL_REPLICATION_USER |
第一次运行时在主节点上创建的 replication 用户 |
无 |
MYSQL_REPLICATION_PASSWORD |
replication 用户密码 |
无 |
MYSQL_MASTER_HOST |
replication 主节点的主机名或 IP(从节点参数) |
无 |
MYSQL_MASTER_PORT_NUMBER |
replication 主节点的服务端口(从节点参数) |
3306 |
MYSQL_MASTER_ROOT_PASSWORD |
replication 主节点的 root 用户密码(从节点参数) |
无 |
详细可参考: Docker Hub - bitnami/mysql
自定义配置文件
编写你的 my_custom.cnf
文件,内容如下:
1 2
| [mysqld] max_allowed_packet=32M
|
通过 volume 运行带有此定义的容器
1 2 3 4 5 6
| docker run --name mysql \ -p 3306:3306 \ -e ALLOW_EMPTY_PASSWORD=yes \ -v /path/to/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro \ -v /path/to/mysql-persistence:/bitnami/mysql/data \ bitnami/mysql:latest
|
或者修改 docker-compose.yml
文件:
1 2 3 4 5 6 7
| services: mysql: ... volumes: - /path/to/mysql-persistence:/bitnami/mysql/data - /path/to/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro ...
|
PostgreSQL
PostgreSQL 最新版
1 2 3 4 5 6
| docker run \ -v postgres-data:/var/lib/postgresql/data \ --name postgresql \ -e POSTGRES_PASSWORD=123456 \ -p 5432:5432 \ -d postgres
|
进入 PostgreSQL 容器内部:
1 2 3
| docker exec -it postgresql bash su postgres psql -U postgres -W
|
PostgreSQL 主从节点部署
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| version: '2'
services: postgresql-master: image: 'bitnami/postgresql:latest' ports: - '5432' volumes: - 'postgresql_master_data:/bitnami/postgresql' environment: - POSTGRESQL_REPLICATION_MODE=master - POSTGRESQL_REPLICATION_USER=repl_user - POSTGRESQL_REPLICATION_PASSWORD=repl_password - POSTGRESQL_USERNAME=my_user - POSTGRESQL_PASSWORD=my_password - POSTGRESQL_DATABASE=my_database postgresql-slave: image: 'bitnami/postgresql:latest' ports: - '5432' depends_on: - postgresql-master environment: - POSTGRESQL_REPLICATION_MODE=slave - POSTGRESQL_REPLICATION_USER=repl_user - POSTGRESQL_REPLICATION_PASSWORD=repl_password - POSTGRESQL_MASTER_HOST=postgresql-master - POSTGRESQL_PASSWORD=my_password - POSTGRESQL_MASTER_PORT_NUMBER=5432
volumes: postgresql_master_data:
|
缩放使用的从节点数量,运行:
1
| docker-compose up --detach --scale postgresql-master=1 --scale postgresql-slave=3
|
同样地,上述命令将从节点的数量扩大到 3 个,你可以用同样的方式缩小规模。
不应增加或减少主节点的数量。保证始终只有一个主节点在运行。
参数说明:
参数 |
描述 |
默认值 |
POSTGRESQL_REPLICATION_MODE |
replication 模式,可能的值是 master 或 slave |
无 |
POSTGRESQL_REPLICATION_USER |
第一次运行时在主节点上创建的 replication 用户 |
无 |
POSTGRESQL_REPLICATION_PASSWORD |
replication 用户密码 |
无 |
POSTGRESQL_REPLICATION_PASSWORD_FILE |
包含 replication 用户密码的文件的路径,这将覆盖 POSTGRESQL_REPLICATION_PASSWORD 变量 |
无 |
POSTGRESQL_MASTER_HOST |
主节点的主机名或 IP(从节点参数) |
无 |
POSTGRESQL_MASTER_PORT_NUMBER |
主节点的端口(从节点参数) |
5432 |
详细可参考: Docker Hub - bitnami/postgresql
Redis
1 2 3 4 5
| docker run --name redis -p 6379:6379 -d redis redis-server --appendonly yes
docker exec -it redis /bin/bash redis-cli auth 123456
|
快速开始,允许空密码:
1
| docker run --name redis -e ALLOW_EMPTY_PASSWORD=yes bitnami/redis:latest
|
Redis 主从复制节点部署
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| version: '2'
services: redis-master: image: 'bitnami/redis:latest' ports: - '6379' environment: - REDIS_REPLICATION_MODE=master - REDIS_PASSWORD=my_master_password volumes: - '/path/to/redis-persistence:/bitnami'
redis-replica: image: 'bitnami/redis:latest' ports: - '6379' depends_on: - redis-master environment: - REDIS_REPLICATION_MODE=slave - REDIS_MASTER_HOST=redis-master - REDIS_MASTER_PORT_NUMBER=6379 - REDIS_MASTER_PASSWORD=my_master_password - REDIS_PASSWORD=my_replica_password
|
缩放使用的从节点数量,运行:
1
| docker-compose up --detach --scale redis-master=1 --scale redis-secondary=3
|
同样地,上述命令将从节点的数量扩大到 3 个,你可以用同样的方式缩小规模。
不应增加或减少主节点的数量。保证始终只有一个主节点在运行。
参数说明:
参数 |
描述 |
默认值 |
REDIS_REPLICATION_MODE |
replication 模式,可能的值是 master 或 slave |
无 |
REDIS_REPLICA_IP |
replication 广播 IP |
$(get_machine_ip) ,返回容器的 IP |
REDIS_REPLICA_PORT |
replication 广播端口 |
REDIS_MASTER_PORT_NUMBER |
REDIS_MASTER_HOST |
replication 主节点的主机名或 IP(从节点参数) |
无 |
REDIS_MASTER_PORT_NUMBER |
replication 主节点的端口(从节点参数) |
6379 |
REDIS_MASTER_PASSWORD |
replication 主节点的密码(从节点参数) |
无 |
详细可参考: Docker Hub - bitnami/redis
MongoDB
1 2 3 4 5 6 7
| docker run -itd --name mongo -p 27017:27017 mongo --auth
$ docker exec -it mongo mongo admin # 创建一个名为 admin,密码为 123456 的用户。 > db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]}); # 尝试使用上面创建的用户信息进行连接。 > db.auth('admin', '123456')
|
快速开始(允许空密码):
1
| docker run --name mongodb -e ALLOW_EMPTY_PASSWORD=yes -e MONGODB_EXTRA_FLAGS='--wiredTigerCacheSizeGB=2' bitnami/mongodb:latest
|
参数说明:
MONGODB_EXTRA_FLAGS
: 将附加到 mongod
启动命令的选项。没有默认值
MONGODB_CLIENT_EXTRA_FLAGS
: 用于连接到(本地或远程)mongod 守护进程的 mongo 命令所附加的选项。没有默认值
MongoDB 主从复制节点部署
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| version: '2'
services: mongodb-primary: image: 'bitnami/mongodb:latest' environment: - MONGODB_ADVERTISED_HOSTNAME=mongodb-primary - MONGODB_REPLICA_SET_MODE=primary - MONGODB_ROOT_PASSWORD=password123 - MONGODB_REPLICA_SET_KEY=replicasetkey123
volumes: - 'mongodb_master_data:/bitnami'
mongodb-secondary: image: 'bitnami/mongodb:latest' depends_on: - mongodb-primary environment: - MONGODB_ADVERTISED_HOSTNAME=mongodb-secondary - MONGODB_REPLICA_SET_MODE=secondary - MONGODB_INITIAL_PRIMARY_HOST=mongodb-primary - MONGODB_INITIAL_PRIMARY_PORT_NUMBER=27017 - MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD=password123 - MONGODB_REPLICA_SET_KEY=replicasetkey123
mongodb-arbiter: image: 'bitnami/mongodb:latest' depends_on: - mongodb-primary environment: - MONGODB_ADVERTISED_HOSTNAME=mongodb-arbiter - MONGODB_REPLICA_SET_MODE=arbiter - MONGODB_INITIAL_PRIMARY_HOST=mongodb-primary - MONGODB_INITIAL_PRIMARY_PORT_NUMBER=27017 - MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD=password123 - MONGODB_REPLICA_SET_KEY=replicasetkey123
volumes: mongodb_master_data: driver: local
|
然后运行 docker-compose:
1
| docker-compose up --detach
|
参数说明:
参数 |
描述 |
默认值 |
MONGODB_ADVERTISED_HOSTNAME |
MongoDB® 服务器的主机名或 IP 地址。 |
无 |
MONGODB_REPLICA_SET_MODE |
replication 模式,可能的值是 primary 或 secondary 或 arbiter。 |
无 |
MONGODB_REPLICA_SET_NAME |
MongoDB® replication 集群名称。 |
replicaset |
MONGODB_PORT_NUMBER |
MongoDB® 端口。 |
27017 |
MONGODB_INITIAL_PRIMARY_HOST |
MongoDB® 初始主节点,一旦 replication 集群被创建,任何节点都可以最终被提升为主节点。 |
无 |
MONGODB_INITIAL_PRIMARY_PORT_NUMBER |
MongoDB® 初始主节点端口。 |
27017 |
MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD |
MongoDB® 初始主节点 root 用户密码。 |
无 |
MONGODB_REPLICA_SET_KEY |
MongoDB® replication 集群密钥。 |
无 |
详细可参考: Docker Hub - bitnami/mongodb
在一个复制集群中,你可以有一个主节点,零个或多个 secondaries 节点和零个或一个 arbiter 节点。
一个 replication 集群方案上的节点总数不能高于 8 个(1 个主节点,6 secondaries 和 arbiter 节点)。
缩放使用的 secondaries 节点数量,
如果你想使用 docker-compose 参数 --scale
来扩展 secondaries 节点的数量,那么在 mongodb-secondary 和 mongodb-arbiter 的定义中不能设置 MONGODB_ADVERTISED_HOSTNAME
。
运行:
1
| docker-compose up --detach --scale mongodb-primary=1 --scale mongodb-secondary=3 --scale mongodb-arbiter=1
|
同样地,上述命令将 secondaries 节点的数量扩大到 3 个,你可以用同样的方式缩小规模。
- 不应增加或减少主节点的数量。保证始终只有一个主节点在运行。
- 在这种情况下,客户端必须在同一个 docker 网络中,才能访问到所有节点。
RabbitMQ
快速开始:
1
| docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.11-management
|
详细可参考 Docker Hub - rabbitmq
Apache Kafka
docker-compose 部署:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| version: "3" services: zookeeper: image: 'bitnami/zookeeper:latest' ports: - '2181:2181' environment: - ALLOW_ANONYMOUS_LOGIN=yes kafka: image: 'bitnami/kafka:latest' ports: - '9092:9092' environment: - KAFKA_BROKER_ID=1 - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092 - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://127.0.0.1:9092 - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181 - ALLOW_PLAINTEXT_LISTENER=yes depends_on: - zookeeper
|
要部署它,在 docker-compose.yml
文件所在的目录中运行以下命令:
详细可参考: Docker Hub - bitnami/kafka
HashiCorp Consul
如果没有指定,Docker Compose 会自动建立一个新的网络,并将所有部署的服务附加到该网络上。然而,我们将明确定义一个新的桥梁网络,名为 consul-network。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| version: '2'
networks: consul-network: driver: bridge
services: consul: image: bitnami/consul:latest networks: - consul-network ports: - '8300:8300' - '8301:8301' - '8301:8301/udp' - '8500:8500' - '8600:8600' - '8600:8600/udp'
|
然后,用以下方法启动容器:
集群部署
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| version: '2'
services: consul-node1: image: bitnami/consul environment: - CONSUL_BOOTSTRAP_EXPECT=3 - CONSUL_CLIENT_LAN_ADDRESS=0.0.0.0 - CONSUL_DISABLE_KEYRING_FILE=true - CONSUL_RETRY_JOIN_ADDRESS=consul-node1 ports: - '8300:8300' - '8301:8301' - '8301:8301/udp' - '8500:8500' - '8600:8600' - '8600:8600/udp' volumes: - 'consul-node1_data:/bitnami'
consul-node2: image: bitnami/consul environment: - CONSUL_BOOTSTRAP_EXPECT=3 - CONSUL_CLIENT_LAN_ADDRESS=0.0.0.0 - CONSUL_DISABLE_KEYRING_FILE=true - CONSUL_RETRY_JOIN_ADDRESS=consul-node1 - CONSUL_ENABLE_UI=false volumes: - 'consul-node2_data:/bitnami'
consul-node3: image: bitnami/consul environment: - CONSUL_BOOTSTRAP_EXPECT=3 - CONSUL_CLIENT_LAN_ADDRESS=0.0.0.0 - CONSUL_DISABLE_KEYRING_FILE=true - CONSUL_RETRY_JOIN_ADDRESS=consul-node1 - CONSUL_ENABLE_UI=false volumes: - 'consul-node3_data:/bitnami'
volumes: consul-node1_data: driver: local consul-node2_data: driver: local consul-node3_data: driver: local
|
详细可参考: Docker Hub - bitnami/consul
Nacos
快速开始:
1
| docker run --name nacos-quick -e MODE=standalone -p 8848:8848 -p 9848:9848 -d nacos/nacos-server:v2.2.0
|
关于其高级用法可参考: GitHub - nacos-group/nacos-docker
Seata
快速开始:
1
| docker run --name seata-server -p 8091:8091 seataio/seata-server:latest
|
使用自有配置文件:
1 2 3 4 5
| docker run --name seata-server \ -p 8091:8091 \ -e SEATA_CONFIG_NAME=file:/root/seata-config/registry \ -v /PATH/TO/CONFIG_FILE:/root/seata-config \ seataio/seata-server
|
Docker compose 启动:
1 2 3 4 5 6 7 8 9 10 11 12 13
| version: "3.1"
services:
seata-server: image: seataio/seata-server:latest hostname: seata-server ports: - 8091:8091 environment: - SEATA_PORT=8091 expose: - 8091
|
详细可参考: Docker Hub - seataio/seata-server
ElasticSearch 和 Kibana
快速开始:
单节点启动 elasticsearch:
1
| docker run --name elasticsearch --net elastic -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" docker.elastic.co/elasticsearch/elasticsearch:8.5.3
|
从启动日志获取 elastic
用户密码和 enrollment token 用于 Kibana。
启动 kiabana:
1
| docker run --name kibana --net elastic -p 5601:5601 docker.elastic.co/kibana/kibana:8.5.3
|
详细可参考 Elasticsearch 安装与配置。