docker-compose解惑

原文: 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的形式写等等诸如此类