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