原文: https://blog.csdn.net/xyz_dream/article/details/86694491
之前不是很理解docker-compose的用处。现在来想想,突然感觉茅塞顿开的感觉。之前有过docker基础,日常自己部署一些小站点,博客,或者学习之类的都有用到。都是一把梭,很简单的docker run 几个命令搞定了。用docker-compose感觉大材小用了。然后自己想想可以通过shell脚本来做一些自动化的事情,这个可能是初学者之后的一点领悟。但是后来你会发现通过shell来写一些脚本控制docker或者几个容器之间协作运行,也不是说做不了,但是绝对是没有docker-compose那么方便。
在我理解看来, docker-compose其实本质上和我们拿shell脚本去做容器协作是一样的。但是呢,docker-compose是通过python实现,已经有人帮我们写好这个脚本了,并且编译成了可执行文件docker-compose。 我们需要做的事情是, 将本来写code的事情,现在转为去写yaml配置文件的事情了。 只要你把要协作运行容器所需参数(类似docker run所需参数)填写在docker-compose.ymal, 以及各个容器启动的先后顺序, 网络配置等等,即可通过docker-compose up 即可帮你把这些容器启动起来。 通过docker-compose down停止并且删除容器。 docker-compose stop停止容器,restart重启等等。下面通过看一下docker-compose的yaml配置文件,大致日常使用就够了。 我们学习是要学会大部分基础的使用即可,如果遇到更多的功能再去查询相关文档即可。 就像学中文学了这么久,不见得你已学会字典上所有的字, 去背文档和去背字典本质是一样的。因为字典是用来查的,不是用来背的。
通过docker-compose –help就能查看相关命令。和docker命令差不多,自己不懂的去看看,也不是很难。主要看一下docker-compose.yaml的常用参数解释。 例如下面是一个nginx+php-fpm+mysql的例子
#docker-compose配置文件详情 官网文档
#https://docs.docker.com/compose/compose-file/#collapseSample1
# 常用配置文件分为2大部分 version 以及 services。 其实重点都是在services了
version: "3" # 版本信息 这个不能乱写。目前支持 1 2 3 详情参考文档,一般现在写3了吧
services:
nginx: # nginx容器服务名称
build:
context: ./ # 指明docker build在哪个目录上下文
dockefile: Dockerfile #指明Dockerfile名称 如果名称是Dockerfile 则可以忽略不写
image: my-nginx:1.0 # docker build -t my-nginx:1.0 . 镜像命名
args:
key: val # 向docker build传递参数 --build-agrs key=val
links: # 连接php-fpm服务
- php-fpm
volumes: # 挂载目录 类似 -v /data/:/container/data
- /data/:/container/data
php-fpm: # php-fpm服务名称
image: php
depends_on: # 依赖mysql-svc 首先mysql-svc先部署起来
- mysql-svc
ports:
- 8000
links:
- mysql-svc #网络连接到mysql-svc 类似 --link
command: ["tail","-f","/dev/null"] # 覆盖command命令
entrypoint: ["tail","-f","/dev/null"] # 覆盖entrypoint 类似 --entrypoint= "tail -f /dev/null"
mysql-svc: # mysql服务名称
image: mysql:5.6 # 指明镜像名称:版本
ports:
- "3306:3306" # 类似 docker run -p 3306:3306 端口映射
environment: # 类似 环境变量 docker run -e MYSQL_ROOT_PASSWORD=root
MYSQL_ROOT_PASSWORD: "root"
restart: always # 类似 docker run --restart=always 重启机制
dns: #类似 docker run --dns=8.8.8.8.8
- 8.8.8.8
- 114.114.114.114
控制容器的启动顺序: 虽然我们可以通过depends_on来确定启动依赖关系,但是只能保证启动顺序,而不能保证先启动的容器是否处于”就绪状态”给后续的容器,所以可以有工具类似定时/每隔一段时间去检查依赖的容器是否处于就绪状态,例如时隔几秒,curl一个http服务,或者telnet等等 。 类似的开源工具 已经存在 例如 wait-for-it.sh, dockerize, 等。 具体详情参考文档: https://docs.docker.com/compose/startup-order/#title
总之简单一句话总结: 平时你怎么启动容器的 docker run -p 3306:3306 -v /data:/data …等等命令,只不过是在docker-compose.yaml文件上,把启动容器的命令记录下来。找到对应的位置,通过制定的key去写就好了。类似 docker run使用 -p 的实现端口映射, 但是在docker-compose使用 ports作为key的形式继写下来。-v就用volumes的形式写等等诸如此类