使用docker快速撸个springboot / springcloud开发环境

业务越来越复杂,保障程序愉快运行的各种基础设施依赖数不胜数;开发、测试、生产各种环境各种软件,一个软件版本不对甚至能让服务雪崩……我猜,作为代码狗的你也一定很厌倦!

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
# 定义容器启动命令。We can append -datacenter=dc1 to set datacenter in command
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
# 当前镜像依赖于第一个镜像(consul0)
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
# 暴露端口(consul的UI界面端口) 宿主:容器
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

同时对于网络的命名,这里也是根据你自己的喜好随意。建议定义成和项目相关的。

如此一来,通过代码连接基础服务就变得异常简单,而通过提交代码将文件置入代码仓库,开发环境就完全不差异化了。