业务越来越复杂,保障程序愉快运行的各种基础设施依赖数不胜数;开发、测试、生产各种环境各种软件,一个软件版本不对甚至能让服务雪崩……我猜,作为代码狗的你也一定很厌倦!
Docker大行其道,k8s如日中天,不整下这些技术都不好意思说自己是个程序员……既然这样,那就用docker解决段落1的痛吧。
我们假设自己在开发一个基于Java/SpringCloud + MySQL + Redis + Consul的应用,为此我们用docker解决下开发环境这等大事。
首先的首先,我们需要在机器上安装docker。
检验机器上是否正确安装并启动docker,请使用:
1 2 3 4 5 6 7 8
| # 检测docker是否已经安装 > docker --version
# 检测docker是否启动正常 > docker info
# 更多的Docker命令 > docker --help
|
检查机器上是否正确安装docker-compose,请使用:
1
| docker-compose --version
|
新建一个文件,并(建议)命名成为docker-compose.yml
,写入一下内容:
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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| version: "3.7" services: consul0: image: consul:latest container_name: consul-node0 restart: on-failure command: agent -server -bootstrap-expect=3 -node=consul-node0 -bind=0.0.0.0 -client=0.0.0.0 networks: - elk-network volumes: - ./.docker/consul/node0:/consul/data consul1: image: consul:latest container_name: consul-node1 restart: on-failure command: agent -server -retry-join=consul-node0 -node=consul-node1 -bind=0.0.0.0 -client=0.0.0.0 networks: - elk-network volumes: - ./.docker/consul/node1:/consul/data depends_on: - consul0 consul2: image: consul:latest container_name: consul-node2 restart: on-failure command: agent -server -retry-join=consul-node0 -node=consul-node2 -bind=0.0.0.0 -client=0.0.0.0 networks: - elk-network volumes: - ./.docker/consul/node2:/consul/data depends_on: - consul0 consul3: image: consul:latest container_name: consul-node3 restart: on-failure command: agent -server -retry-join=consul-node0 -node=consul-node3 -bind=0.0.0.0 -client=0.0.0.0 networks: - elk-network volumes: - ./.docker/consul/node3:/consul/data depends_on: - consul0 consul4: image: consul:latest container_name: consul-node4 restart: on-failure command: agent -retry-join=consul-node0 -node=consul-node4 -bind=0.0.0.0 -client=0.0.0.0 -ui networks: - elk-network volumes: - ./.docker/consul/node4:/consul/data depends_on: - consul1 - consul2 - consul3 ports: - 8500:8500 mysql: image: mysql:latest container_name: mysql command: --default-authentication-plugin=mysql_native_password restart: always volumes: - ./.docker/mysql/system:/var/lib/mysql - ./.docker/mysql/root:/root environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: app_dummy MYSQL_USER: default MYSQL_PASSWORD: secret networks: - elk-network ports: - 3306:3306 redis: image: redis:latest container_name: redis networks: - elk-network ports: - 6379:6379 networks: elk-network:
|
ps:这里的consul采用了4个容器的集群形式。
由于docker-compose文件中定义了一些宿主机和容器映射的关系,因此达到了持久化数据的效果。后续无论怎么重启docker,数据会一直存在。上述docker-compose,存放文件的文件夹是在 .data
。
同时对于网络的命名,这里也是根据你自己的喜好随意。建议定义成和项目相关的。
如此一来,通过代码连接基础服务就变得异常简单,而通过提交代码将文件置入代码仓库,开发环境就完全不差异化了。