Docker中docker-compose的使用

对于定制镜像我们可以使用Dockerfile文件,那对于容器的启动时也会有定制的需求,就需要添加很多对应的启动参数,当然我们可以将启动命令直接写成一个脚本,这样不用每次都要输入一次,而Docker更是提供了类似的功能---docker compose,可以通过yml文件记录多个参数,更是可以管理多个服务

一、简介

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境(如果公共镜像能满足需求,就不需要再用Dockerfile来做定制)。
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行(我工作中更多的是对多个服务分别创建对应的docker-compose.yml文件,这样需要管理的文件会变多,但是看得更加清晰)。
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序(可以通过-d参数后台运行)。

二、安装docker compose

1、下载

  • 可以通过Github上的地址下载自己所需的版本,然后上传至服务器"/usr/local/bin/docker-compose"

  • 直接在服务器上执行 curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose进行下载,需要安装其他版本的compose,将1.27.4修改成对应版本号即可

2、添加执行权限

chmod a+x /usr/local/bin/docker-compose

3、创建软连接

ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

4、测试确认

docker-compose --version

三、yml配置说明

这里先看一个PostgreSQL测试库的docker-compose.yml文件:

version: '2.2'
services:
  postgresql:
    build: /u01/postgresql
    image: postgres:11.8-lz4-postgis
    container_name: postgresql-11.8
    restart: always
    ports:
      - "55432:5432"
    volumes:
      - /u01/postgresql/data:/var/lib/postgresql/data
      - /u01/postgresql/backups:/var/backups
      - /u01/postgresql/dumpfile:/dumpfile
    environment:
      - POSTGRES_PASSWORD=greaPSQL11
      - TZ=Asia/Shanghai
    mem_limit: 10G

[NOTE]
生产环境下的数据库不建议用docker的方式来部署。

对于一份标准配置文件应该包含 version、services和networks 三个大部分,其中主要是services的部分,定义了容器的主要参数,其次是networks的部分,根据要求配置容器的网络相关。

1、version

指定本 yml 依从的 compose 哪个版本制定的。目前文件格式有3个版本,分别为1,2.x和3.x,与Docker版本的兼容等可以查看官方文档,还有不同的版本中有些参数的语法会有所不同。

2、services

定义了容器的主要参数,常用的有:

  • 服务名称
    在services标签下的第二级标签,如例子中的postgresql,这个名字是自己定义的,它就是服务名称,一个yml文件里面可以配置多个服务,可以以此来做区分。在这下面的第三级标签就是对应这个服务的参数。

  • image
    是指定服务的镜像名称或镜像ID,如果镜像在本地不存在,compose将会尝试拉取这个镜像。

  • build
    服务除了可以基于指定的镜像,还可以基于一份Dockerfile,可以是相对路径或者绝对路径,在up的时候,compose会从指定的路径下找到Dockerfile先执行构建的任务。

    [NOTE]
    build是指定一个目录,如果要指定Dockerfile文件,需要在build下再添加一个下一级的标签dockerfile来指定;
    如果同时指定了image和build,那么compose会先构建镜像,然后将构建好的镜像命名为image后面的名字。
    关于build的设置大多数都会写在Dockerfile中,也有写参数可以写在docker-compose.yml文件中,例如arg这个就可以写在build下属标签中,值的话就写在arg的下属标签下。

  • container_name
    指定容器的名称

  • command
    覆盖容器启动后默认执行的命令

  • depends_on
    设置依赖关系,没有设置依赖关系的情况下,compose启动时会从上到下的启动容器,若容器有依赖需求,就可能导致启动失败,例如在没启动数据库容器的时候启动了应用容器,这时候应用容器会因为找不到数据库而退出,为了避免这种情况我们需要加入一个标签,就是 depends_on,这个标签解决了容器的依赖、启动先后的问题。

    version: "3.7"
    services:
      web:
        build: .
        depends_on:
          - db
          - redis
      redis:
        image: redis
      db:
        image: postgres
    

    上面容器会先启动 redis 和 db 两个服务,最后才启动 web 服务,即使是 docker-compose up web 这样的方式启动web容器时,也会先启动redis和db两个容器。

  • entrypoint
    覆盖容器默认的 entrypoint

  • environment
    添加环境变量。可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。

  • logging
    服务的日志记录配置。主要由driver和options来设置。

    • driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项:"json-file"、"syslog"、"none" (只有json-file可以通过docker-compose logs显示日志,其他方式有其他日志查看方式)。
    • options:仅在 json-file 驱动程序下,可以使用max-size和max-file限制日志得数量和大小,当达到文件限制上限,会自动删除旧得文件;syslog 驱动程序下,可以使用 syslog-address 指定日志接收地址,如:syslog-address: "tcp://192.168.2.12:8080"
  • ports
    映射端口的标签,使用HOST:CONTAINER格式或者只是指定容器的端口,宿主机会随机映射端口。

  • volumes
    挂载一个目录或者一个已存在的数据卷容器,可以直接使用 [HOST:CONTAINER] 这样的格式,或者使用 [HOST:CONTAINER:ro] 这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统。Compose的数据卷指定路径可以是相对路径,使用 . 或者 .. 来指定相对目录。

  • restart

    • no:是默认的重启策略,在任何情况下都不会重启容器。
    • always:容器总是重新启动。
    • on-failure:在容器非正常退出时(退出状态非0),才会重启容器。
    • unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
  • mem_limit
    限制容器使用主机内存大小。

  • 其他
    还有很多参数可以进行设置。

3、networks

设置容器加入的网络,首先手动创建网络,指定子网,如 docker network create --subnet 172.88.88.0/24 devops

networks:
 default:
   external:
     name: devops

更多的内容可以登录达梦的社区进行查看:https://eco.dameng.com

posted @ 2020-10-30 10:32  灬夜露沁心灬  阅读(598)  评论(0编辑  收藏  举报