前言
作为后端开发者,日常开发中总是需要依赖到各种各样的环境,如数据库、消息队列、配置中心,有时候还需要调试负载均衡和反向代理等。代码开发可能只是小问题,如何搞定开发环境才是比较麻烦的。
在 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.启动容器
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
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
启动数据库服务。