C++GO语言微服务之Dockerfile docker-compose②
目录
01 12-yaml文件书写规则01 12-yaml文件书写规则
02 13-yaml中的数据类型
03 14-docker-compose配置文件格式
04 15-docker-compose中的关键字
05 16-prots和volumes关键字的使用
06 17-volumes_from的使用
07 18-extends的使用
08 19-networks的使用
09 20-docker-compose启动和关闭容器
10 21-docker-compose的start stop rm命令
01 12-yaml文件书写规则01 12-yaml文件书写规则
 2. docker-compose  
 
Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器,使用Docker 
 
Compose不再需要使用shell脚本来启动容器。 
 
Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用 
 
docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用 
 
多个容器进行开发的场景。 
 
知道yaml文件格式 
 
docker-compose工具工作的时候需要使用一个配置文件 
 
默认的名字: docker-compose.yaml/yml 
 
docker-compose中常用关键字 
 
docker-compose操作命令 
 
启动, 关闭, 查看 
 
02 13-yaml中的数据类型
 2.1 docker-compose 的安装  
 
 #  
 
# 当一个镜像A被作为其他镜像B的基础镜像时,这个触发器才会被执行, 
 
# 新镜像B在构建的时候,会插入触发器中的指令。 
 
ONBUILD [command] 
 
# 原始镜像 -> 纯净版 
 
-> 修改 ONBUILD ["echo", "hello,linux"] 
 
# 基于原始镜像制作新镜像 -> 镜像A 
 
-> 启动镜像A -> 不会输出hello, linux 
 
# 基于镜像A制作了镜像B 
 
-> 启动镜像B -> 会输出 hello, linux 
 
1 
 
2 
 
3 
 
4 
 
5 
 
6 
 
7 
 
8 
 
9 
 
10 
 
11 
 
12 
 
构建新镜像的时候不使用缓存机制 
 
docker build -t 新镜像名:版本号 --no-cache 
 
1 
 
2 2.2 yaml 文件格式  
 
 #  
 
YAML有以下基本规则: 1、大小写敏感 2、使用缩进表示层级关系 3、禁止使用tab缩进, 只能使用空格键  
 
4、缩进长度没有限制(只能使用空格缩进),只要元素对齐就表示这些元素属于一个层级。 5、使用#表示注 
 
释 6、字符串可以不用引号标注 
 
"字符串" 
 
'字符串' 
 
字符串 
 
123 -> 整数 
 
123a 
 
yaml中的三种数据结构 
 
map - 散列表 
 
list - 数组 
 
scalar - 纯量 
 
#安装依赖工具 
 
sudo apt-get install python-pip -y 
 
#安装编排工具 
 
sudo pip install docker-compose 
 
#查看编排工具版本 
 
sudo docker-compose version 
 
#查看命令帮助 
 
docker-compose --help 
 
03 14-docker-compose配置文件格式
04 15-docker-compose中的关键字
 2.2 yaml 文件格式  
 
 #  
 
YAML有以下基本规则: 1、大小写敏感 2、使用缩进表示层级关系 3、禁止使用tab缩进, 只能使用空格键  
 
4、缩进长度没有限制(只能使用空格缩进),只要元素对齐就表示这些元素属于一个层级。 5、使用#表示注 
 
释 6、字符串可以不用引号标注 
 
"字符串" 
 
'字符串' 
 
字符串 
 
123 -> 整数 
 
123a 
 
yaml中的三种数据结构 
 
map - 散列表 
 
list - 数组 
 
scalar - 纯量 
 
05 16-prots和volumes关键字的使用
字符串 
 
布尔值 
 
- true 
 
- false 
 
整数 
 
浮点数 
 
- 12.1 
 
NULL 
 
- 使用 ~ 来表示 
 
1 
 
2 
 
3 
 
4 
 
5 
 
6 
 
7 
 
8 
 
9 
 
# 1 
 
Websites: 
 
YAML: yaml.org 
 
Ruby: ruby-lang.org 
 
Python: python.org 
 
Perl: use.perl.org 
 
# 使用json表示 
 
{"Websites":{"YAML": "yaml.org", "Ruby": "ruby-lang.org" }} 
 
# 2 
 
languages: 
 
- Ruby 
 
- Perl 
 
- Python 
 
- c 
 
# 使用json表示 
 
{"languages":["Ruby", "Perl", "Python", "c"]} 
 
# 3 
 
- 
 
- Ruby 
 
- Perl 
 
- Python 
 
- 
 
- c 
 
- c++ 
 
- java 
 
# 使用json表示 
 
[["Ruby", "Perl", "Python"], ["c", "c++", "java"]] 
 
# 4 
 
- 
 
id: 1 
 
name: huang 
 
- 
 
id: 2 
 
name: liao 
 
# 使用json表示 
 
[{"id":1, "name":"huang"}, {"id":2, "name":"liao"}] 
 
06 17-volumes_from的使用
 2.3 docker-compose 配置文件  
 
 #  
 
一份标准配置文件应该包含 
 
version 
 
services 
 
networks 
 
version: '2' # docker-compose的版本 
 
services: # 服务 
 
web: # 服务名, 自己起的, 每个服务器名对应一个启动的容器 
 
image: nginx:latest # 容器是基于那个镜像启动 的 
 
container_name: myweb 
 
ports: # 向外开发的端口 
 
- 8080 
 
networks: # 容器启动之后所在的网络 
 
- front-tier 
 
environment: # ENV 
 
RACK_ENV: development 
 
SHOW: 'true' 
 
SESSION_SECRET: docker-compose 
 
command: tree -L 3 
 
extends: 
 
file: common.yml 
 
service: webapp 
 
lb: 
 
image: dockercloud/haproxy 
 
ports: 
 
- 80:80 
 
networks: 
 
- front-tier 
 
- back-tier 
 
volumes: # 数据卷挂载 docker run -v xxxx:xxxx 
 
- /var/run/docker.sock:/var/run/docker.sock 
 
depend_on: 
 
- web 
 
- redis 
 
- lb 
 
redis: 
 
image: redis 
 
networks: 
 
- back-tier 
 
networks: 
 
front-tier: 
 
driver: bridge 
 
back-tier: 
 
driver: bridge 
 
07 18-extends的使用
一份标准配置文件应该包含 
 
version 
 
services 
 
networks 
 
version: '2' # docker-compose的版本 
 
services: # 服务 
 
web: # 服务名, 自己起的, 每个服务器名对应一个启动的容器 
 
image: nginx:latest # 容器是基于那个镜像启动 的 
 
container_name: myweb 
 
ports: # 向外开发的端口 
 
- 8080 
 
networks: # 容器启动之后所在的网络 
 
- front-tier 
 
environment: # ENV 
 
RACK_ENV: development 
 
SHOW: 'true' 
 
SESSION_SECRET: docker-compose 
 
command: tree -L 3 
 
extends: 
 
file: common.yml 
 
service: webapp 
 
lb: 
 
image: dockercloud/haproxy 
 
ports: 
 
- 80:80 
 
networks: 
 
- front-tier 
 
- back-tier 
 
volumes: # 数据卷挂载 docker run -v xxxx:xxxx 
 
- /var/run/docker.sock:/var/run/docker.sock 
 
depend_on: 
 
- web 
 
- redis 
 
- lb 
 
redis: 
 
image: redis 
 
networks: 
 
- back-tier 
 
networks: 
 
front-tier: 
 
driver: bridge 
 
back-tier: 
 
driver: bridge 
 
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三大部分,其中最关键的就是 services 和 networks 两个部分,下面先来看 services 的书写规则。 
 
 Image  
 
在 services 标签下的第二级标签是 web,这个名字是用户自己自定义,它就是服务名称。 image 则是指定 
 
服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。 
 
 command  
 
使用 command 可以覆盖容器启动后默认执行的命令。 
 
 container_name  
 
容器启动之后的名字 
 
如何查看: 
 
docker ps 
 
 depends_on  
 
一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失 
 
败。例如在没启动数据库容器的时候启动了应用容器,这时候应用容器会因为找不到数据库而退出,为了 
 
避免这种情况我们需要加入一个标签,就是 depends_on,这个标签解决了容器的依赖、启动先后的问题。 
 
 environment  
 
environment 和 Dockerfile 中的 ENV 指令一样会把变量一直保存在镜像、容器中。 
 
services: 
 
web: 
 
image: 镜像名/镜像ID 
 
1 
 
2 
 
3 
 
command: tree -L 3 
 
# 也可以写成类似 Dockerfile 中的格式: 
 
command: [tree, -L, 3] 
 
08 19-networks的使用
environment: 
 
RACK_ENV: development 
 
SHOW: 'true' 
 
SESSION_SECRET: docker-compose 
 
1 
 
2 
 
3 
 
4 
 
ports: 
 
- "3000" # 宿主机的端口是随机分配的, 3000是容器开发的对外端口 // -P 
 
- "8000:8000" -> 一般这样写就可以 
 
- "127.0.0.1:8001:8001" 
 
- 55:55 -> 不推荐这样写 
 
1 
 
2 
 
3 
 
4 
 
5 
 
docker run -v /home/go:/xxx 
 
# 宿主机或容器的映射路径如果不存在, 会自动创建出来 
 
volumes: 
 
# 这是宿主机目录, 容器的映射目录会自动创建 
 
- /var/lib/mysql 
 
# 按照绝对路径映射 
 
- /opt/data:/var/lib/mysql 
 
# 相对路径的映射 
 
# ./ 目录是docker-compose配置文件所在的目录 
 
# 如果是相对路径, ./是必须要写的, ../ 
 
- ./cache:/tmp/cache 
 
# 指定容器中对文件的操作权限, 默认rw 
 
- /home/go/configs:/etc/configs/:ro 
 
# 文件映射 
 
- ./temp/a.txt:/temp/b.sh 
 
09 20-docker-compose启动和关闭容器
 volumes_from  
 
从其它容器或者服务挂载数据卷,可选的参数是 :ro或者 :rw,前者表示容器只读,后者表示容器对数据卷 
 
是可读可写的。默认情况下是可读可写的。 
 
 extends  
 
environment: 
 
RACK_ENV: development 
 
SHOW: 'true' 
 
SESSION_SECRET: docker-compose 
 
1 
 
2 
 
3 
 
4 
 
ports: 
 
- "3000" # 宿主机的端口是随机分配的, 3000是容器开发的对外端口 // -P 
 
- "8000:8000" -> 一般这样写就可以 
 
- "127.0.0.1:8001:8001" 
 
- 55:55 -> 不推荐这样写 
 
1 
 
2 
 
3 
 
4 
 
5 
 
docker run -v /home/go:/xxx 
 
# 宿主机或容器的映射路径如果不存在, 会自动创建出来 
 
volumes: 
 
# 这是宿主机目录, 容器的映射目录会自动创建 
 
- /var/lib/mysql 
 
# 按照绝对路径映射 
 
- /opt/data:/var/lib/mysql 
 
# 相对路径的映射 
 
# ./ 目录是docker-compose配置文件所在的目录 
 
# 如果是相对路径, ./是必须要写的, ../ 
 
- ./cache:/tmp/cache 
 
# 指定容器中对文件的操作权限, 默认rw 
 
- /home/go/configs:/etc/configs/:ro 
 
# 文件映射 
 
- ./temp/a.txt:/temp/b.sh 
 
 
volumes_from: 
 
- service_name # 服务名 
 
- service_name:ro 
 
- container:container_name # 挂载容器 
 
- container:container_name:rw 
 
10 21-docker-compose的start stop rm命令
# 在一个yaml文件中引用另外一个yaml中的设置 
 
extends: 
 
file: common.yml 
 
service: webapp 
 
 
# docker-compose.yaml 
 
version: '2' # docker-compose的版本 
 
services: # 服务 
 
web: # 服务名, 自己起的, 每个服务器名对应一个启动的容器 
 
extends: 
 
file: sub-compose.yaml 
 
service: demo1 
 
web1: # 服务名, 自己起的, 每个服务器名对应一个启动的容器 
 
image: nginx:latest # 容器是基于那个镜像启动 的 
 
container_name: myweb 
 
ports: # 向外开发的端口 
 
- 8080 
 
networks: # 容器启动之后所在的网络 
 
- front-tier 
 
- back-tier 
 
environment: # ENV 
 
RACK_ENV: development 
 
SHOW: 'true' 
 
SESSION_SECRET: docker-compose 
 
command: tree -L 3 
 
