前言

作为后端开发者,日常开发中总是需要依赖到各种各样的环境,如数据库、消息队列、配置中心,有时候还需要调试负载均衡和反向代理等。代码开发可能只是小问题,如何搞定开发环境才是比较麻烦的。

在 docker 出现之前,如果要用到数据库,可能就只能在本地装一个数据库,但如果是初学者的话,总是很容易在安装的时候四处碰壁,需要各种各样的问题,浏览器打开一篇又一篇的博客,搜索如何解决问题。但在 docker 出现之后,一切都可以简化了。不仅构建各种各样的依赖服务简化了,由于容器的隔离性质,各服务之间出现冲突的概率也降低了,这是后端开发者的福音!

这篇文章主要收集和汇总一些常用服务通过 docker 进行部署的方法。

Tips:虽然 docker 容器本身相对于虚拟机来说更加轻量化,但是每个容器依旧需要一些额外的内存和 CPU 资源来维护容器的运行状态和隔离机制。若是个人计算机的性能不是特别高的话,不建议启动太多的容器。你也可以在容器启动的时候,设置每个容器的 CPU 和 内存限制,确保资源的有效利用。

mysql

1
2
3
4
5
6
docker run --name mysql \
-p 3306:3306 \
-v ~/mysql/data:/var/lib/mysql \
-v ~/mysql/conf.d:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=password \
-d mysql:8.0.28

根据需要可以修改 mysql 镜像的版本,映射卷的位置也根据个人习惯修改。

redis

1
2
3
docker run -d -p 6379:6379 \
-v ~/redis/data:/data \
--name redis redis:alpine

rabbitmq

1
docker run -d --name rabbit -p 15672:15672 -p 5673:5672 rabbitmq:latest

nginx

1
2
3
4
5
docker run -itd -p 8008:80 --name nginx \
-v ~/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v ~/nginx/conf/conf.d:/etc/nginx/conf.d \
-v ~/nginx/html:/usr/share/nginx/html \
-v ~/nginx/log:/var/log/nginx nginx:latest

mongo

单机版本

1
2
3
4
5
docker run -itd -p 27017:27017 --name mongo \
-v ~/mongo/data:/data/db \
-v ~/mongo/log:/data/log \
-v ~/mongo/conf:/data/configdb \
mongo:4.2.23 --auth --bind_ip_all

副本集群

1.编写 docker-compose 文件

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
version: "3.9"
services:

mongo1:
image: mongo:4.2.23
ports:
- "30001:27017"
container_name: "mrs1"
command: ["/bin/bash","-c","mongod -f /data/configdb/mongo.conf --bind_ip_all --replSet RS"]
volumes:
- "~/mongo/mrs1/conf:/data/configdb"
- "~/mongo/mrs1/db:/data/db"
- "~/mongo/mrs1/logs:/data/log"

mongo2:
image: mongo:4.2.23
ports:
- "30002:27017"
container_name: "mrs2"
command: ["/bin/bash","-c","mongod -f /data/configdb/mongo.conf --bind_ip_all --replSet RS"]
volumes:
- "~/mongo/mrs2/conf:/data/configdb"
- "~/mongo/mrs2/db:/data/db"
- "~/mongo/mrs2/logs:/data/log"

mongo3:
image: mongo:4.2.23
ports:
- "30003:27017"
container_name: "mrs3"
command: ["/bin/bash","-c","mongod -f /data/configdb/mongo.conf --bind_ip_all --replSet RS"]
volumes:
- "~/mongo/mrs3/conf:/data/configdb"
- "~/mongo/mrs3/db:/data/db"
- "~/mongo/mrs3/logs:/data/log"

2.编写配置文件

1
2
3
4
5
6
7
dbpath = /data/db #数据库文件位置
logpath = /data/log/mongo.log #日志存放位置
logappend = true #日志追加
port = 27017 #端口号
#auth = true #开启认证,首次使用记得注释掉
#keyFile = /data/configdb/mongo.key #认证key
bind_ip = 0.0.0.0

3.启动容器

1
docker-compose up -d

4.初始化副本集群

1
2
3
docker exec -it mrs1 bash

mongo
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
conf = {
_id:"RS",
members:[
{
_id:0,
host:"host-ip:30001"
},
{
_id:1,
host:"host-ip:30002"
},
{
_id:2,
host:"host-ip:30003"
}
]
}

# 初始化副本集
rs.initiate(conf)

# 新建用户,用户名、密码和数据库角色酌情分配
db.createUser({
user:"root",
pwd:"123456",
roles:["root"]
})

# 退出 mongo shell
exit
1
2
3
4
5
6
# 创建 base64 的 key file
openssl rand -base64 756 > /data/configdb/mongo.key
chmod 400 /data/configdb/mongo.key

# 退出 bash
exit

之后将上述生成的 keyfile 拷贝到所有节点的相同位置,并将配置文件中的 auth 以及 keyFile 前的注释删除,重启所有的 mongo 容器,完成副本集配置。

ETCD

1
2
3
docker run -itd --name etcd -p 2379:2379 -p 2380:2380 \
-e ETCDCTL_API=3 \
bitnami/etcd:latest

eleasticsearch + kibana

测试的时候使用官方镜像(docker.elastic.co/elasticsearch/elasticsearch:7.3.2)拉取速度感人,于是选择从 dockerhub.icu 这个镜像源中拉取镜像:

1
2
docker pull dockerhub.icu/library/elasticsearch:7.3.2
docker pull dockerhub.icu/library/kibana:7.3.2

docker-compose.yaml

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
services:
es01:
image: dockerhub.icu/library/elasticsearch:7.3.2
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms512m -Xmx512m
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata01:/usr/share/elasticsearch/data
ports:
- 9200:9200
- 9300:9300
networks:
- esnet
mem_limit: 1g
cpus: '1.0'
kibana:
image: dockerhub.icu/library/kibana:7.3.2
container_name: kibana
ports:
- 5601:5601
networks: ['esnet']
environment:
- SERVER_NAME=kibana.localhost
- ELASTICSEARCH_HOSTS=http://es01:9200
- I18N_LOCALE=zh-CN
- ELASTICSEARCH_USERNAME='elastic'
- ELASTICSEARCH_PASSWORD='yourPassword'
depends_on: ['es01']
mem_limit: 300m
cpus: '1.0'

volumes:
esdata01:
driver: local
driver_opts:
type: none
o: bind
device: /home/xxxx/docker/elastic/es

networks:
esnet:
driver: bridge

shell

1
docker compose up -d

Tips:实测在 2核2G 的服务器上跑不动,Elasticsearch 是基于 Java 的应用程序,JVM 会占用大量内存,要是想运行该容器还是建议使用 2核4G 以上配置的服务器。

database(mysql+redis+mongo)

使用 docker compose 快捷搭建开发环境需要使用的数据库依赖。

docker-compose.yaml:

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
version: '3.8'

services:
mysql:
image: mysql:8.0.23
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: <YOUR_PASSWORD>
ports:
- "127.0.0.1:3306:3306" # 仅开放本地地址
volumes:
- ~/docker/database/mysql/data:/var/lib/mysql
- ~/docker/database/mysql/conf.d:/etc/mysql/conf.d
networks:
- dbnet

redis:
image: redis:7-alpine
container_name: redis
ports:
- 127.0.0.1:6379:6379
volumes:
- ~/docker/database/redis/data:/data
networks:
- dbnet

mongodb:
image: mongo:4.0.23
container_name: mongo
ports:
- 127.0.0.1:27017:27017
volumes:
- ~/docker/database/mongo/data:/data/db
networks:
- dbnet

networks:
dbnet:
driver: bridge

运行 docker compose up -d 启动数据库服务。