常用开发环境的 docker 部署

本文主要介绍一些常用的借助 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

自定义配置文件

  1. 编写你的 my_custom.cnf 文件,内容如下:

    1
    2
    [mysqld]
    max_allowed_packet=32M
  2. 通过 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 个,你可以用同样的方式缩小规模。

  1. 不应增加或减少主节点的数量。保证始终只有一个主节点在运行。
  2. 在这种情况下,客户端必须在同一个 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 文件所在的目录中运行以下命令:

1
docker-compose up -d

详细可参考: 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
docker-compose up -d

集群部署

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

快速开始:

  1. 单节点启动 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。

  2. 启动 kiabana:

    1
    docker run --name kibana --net elastic -p 5601:5601 docker.elastic.co/kibana/kibana:8.5.3

详细可参考 Elasticsearch 安装与配置


常用开发环境的 docker 部署
https://blog.lihangqi.top/2023/03/30/development-environment/
作者
凌洛
发布于
2023年3月30日
许可协议