本篇博文中的操作系统:CentOS Linux release 7.6.1810 (Core)
一、compose介绍
Compose是Docker的服务编排工具,主要用来构建基于Docker的复杂应用,Compose 通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景。
docker-compose是编排容器的。例如,你有一个php镜像,一个mysql镜像,一个nginx镜像。如果没有docker-compose,那么每次启动的时候,你需要敲各个容器的启动参数,环境变量,容器命名,指定不同容器的链接参数等等一系列的操作,相当繁琐。而用了docker-compose之后,你就可以把这些命令一次性写在docker-compose.yml(文件扩展名必须是.yml 或 .yaml)文件中,以后每次启动这一整个环境(含3个容器)的时候,你只要敲一个docker-compose up命令就ok了。
dockerfile的作用是从无到有的构建镜像。它包含安装运行所需的环境、程序代码等。这个创建过程就是使用 dockerfile 来完成的。dockerfile 是为 docker build 命令准备的,用于建立一个独立的 image ,在 docker-compose 里也可以用来实施 build。
Compose 项目是由 Python 编写,所以下面的安装我们需要使用pip(Python包管理工具)来安装。Centos系统默认会安装Python相关环境的,所以这里直接就可以用pip命令
二、安装Compose
通过pip安装:pip install --upgrade pip
指定版本安装:pip install docker-compose==1.22
安装过程中如果出现如下报错:
原因:python库中urllib3 (1.22) or chardet (2.2.1) 的版本不兼容
解决如下:
pip uninstall urllib3
pip uninstall chardet
pip install requests
Curl方式下载新的版本:
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
修改权限:
chmod +x /usr/local/bin/docker-compose
安装完成后可以查看版本:
docker-compose --version 或 docker-compose -v 都可以查看版本
一般使用步骤:
1、定义Dockerfile,方便迁移到任何地方;
2、编写docker-compose.yml文件;
3、运行docker-compose up启动服务
示例:
新建一个空白目录,在目录新建一个docker-compose.yaml 本文中的路径:/root/docker-compose.yaml
docker-compose.yaml文件内容如下:
version: "3.6" services: nginx: image: nginx container_name: nginx-test ports: - "8080:80" depends_on: - redis-compose stdin_open: true tty: true privileged: true command: ['/bin/bash'] redis-compose: image: redis container_name: redis444 ports: - "6399:6379" stdin_open: true tty: true privileged: true command: ['/bin/bash']
以上命令的意思是新建nginx和redis容器。注意:回车和空格。
yaml基本语法
基本格式要求:
yaml大小写敏感。
使用缩进代表层级关系。
缩进只能使用空格,不能使用TAB,不要求空格个数,只需要相同层级左对齐(一般2个或4个空格)
#作为注释,yaml中只有行注释。
YAML中允许表示三种格式,分别是,对象、数组、常量值
对象
使用冒号代表,格式为key: value。冒号后面要加一个空格:
key: value
可以使用缩进表示层级关系
key:
child-key: value
child-key2: value2
数组
使用一个短横线加一个空格代表一个数组项
hobby:
- Java
- LOL
常量
YAML中提供了多种常量结构,包括:整数,浮点数,字符串,NULL,日期,布尔,时间
pi: 3.14 #定义一个数值3.14
hasChild: true #定义一个boolean值
name: '你好YAML' #定义一个字符串
yaml语法也可以参考:yaml基本语法
好,接下来我们启动应用:
cd /root
docker-compose up
就成功了。浏览器访问 即可。
默认是前台运行并打印日志到控制台。如果想后台运行,可以加入-d选项,示例如下:
docker-compose up –d
服务后台后,可以使用下列命令查看状态:
docker-compose ps
停止服务:
docker-compose stop
重新启动服务:
docker-compose restart
查看服务日志输出
docker-compose logs
删除容器
docker-compose rm 服务名
down 停止并删除容器,网络,镜像和数据卷
三、docker-compose.yml模板文件中的常用命令(指令)参考
模板文件是使用compose的核心,涉及到的命令(指令)关键字比较多,和Dockerfile一样,它也是有自己的语法命令的。其中定义的每个服务都必须通过image指令指定镜像或build指令(需要Dockerfile)来自动构建。其它大部分指令都跟docker run的相关参数的含义都是类似的。compose默认的模板文件名称为docker-compose.yml,为yaml格式。
如果使用build指令,在Dockerfile中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml 中重复设置。
3.1、Compose和Docker兼容性如下图所示:
每个docker-compose.yml必须定义image或者build中的一个,其它的是可选的。
3.2、docker-compose.yml模板文件中的常用命令:
3.2.1、image
指定为镜像名称或镜像 ID。如果镜像在本地不存在,compose 将会尝试拉取这个镜像。示例:
3.2.2、build
指定Dockerfile所在文件夹的路径(可以是绝对路径,或者相对docker-compose.yml文件的路径)。compose将会利用它自动构建这个镜像,然后使用这个镜像。
注意:在version 1里bulid仅支持值为字符串。version 2里支持对象格式。
也可以使用context指定dockerfile所在文件夹的路径,使用dockerfile指令指定dockerfile文件名,使用arg指令指定构建镜像时的变量。示例如下:
使用cache_from指定构建镜像的缓存,示例如下:
3.2.3、command
覆盖容器启动后默认执行的命令。示例:command: bundle exec thin -p 3000
command也支持数组形式:command: [bundle, exec, thin, -p, 3000]
3.2.4、links
用于链接另一容器服务,如需要使用到另一容器的mysql服务。可以给出服务名和别名;也可以仅给出服务名,这样别名将和服务名相同。同docker run --link。示例:
使用了别名会自动在容器的/etc/hosts文件里创建相应记录:
所以我们在容器里就可以直接使用别名作为服务的主机名。
3.2.5、ports
暴露端口信息。
使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。同docker run -p。示例:
注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。
3.2.6、expose
expose提供container之间的端口访问,不会暴露给宿主机使用。同docker run --expose。
3.2.7、volumes
数据卷所挂载路径设置。可以设置为宿主机路径(HOST:CONTAINER)或者数据卷名称(VOLUME:CONTAINER),并且可以设置访问模式 (HOST:CONTAINER:ro)。示例:
如果路径为数据卷名称,必须在文件中配置数据卷。如下:
3.2.8、volumes_from
挂载数据卷容器,挂载是容器。同docker run --volumes-from。示例:
container:container_name格式仅支持version 2。
3.2.9、environment
设置环境变量。同docker run -e。可以是数组或者字典格式。
只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据,如下所示:
3.2.10、depends_on
解决容器的依赖、启动先后的问题,一般是mysql、redis等。指定了依赖,将会优先于服务创建并启动依赖。links也可以指定依赖。
以下文件中会先启动 redis、db,再启动 web。如下所示:
注意:web 服务不会等待 redis、db、完全启动之后才启动。
3.2.11、external_links
链接到docker-compose.yml外部的容器,甚至并非compose管理的外部容器。通常是提供共享或公共服务。格式与links相似:
注意,external_links链接的服务与当前服务必须是同一个网络环境。
3.2.12、extra_hosts
类似 Docker 中的 --add-host 参数,指定额外的 host 名称映射信息。
将会在/etc/hosts创建记录:
3.2.13、extends
继承自当前yml文件或者其它文件中定义的服务,可以选择性的覆盖原有配置。
service必须有,file可选。service是需要继承的服务,例如web、database。
3.2.14、net
设置网络模式。同docker的--net参数。
3.2.15、dns
自定义 DNS 服务器。可以是一个值,也可以是一个列表。
3.2.16、dns_search
配置 DNS 搜索域。可以是一个值,也可以是一个列表。
dns_search: example.com 或者: dns_search: - domain1.example.com - domain2.example.com
3.2.17、healthcheck
通过命令检查容器是否健康运行。
healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 1m30s timeout: 10s retries: 3
interval:指定每次检测间隔时间;
timeout:指定超时时间,超过这个时间这次检测就被认为失败;
retries:指定重试次数。
3.2.18、labels
为容器添加 Docker 元数据(metadata)信息。例如可以为容器添加辅助说明信息。
labels: com.startupteam.description: "webapp for a startup team" com.startupteam.department: "devops department" com.startupteam.release: "rc3 for v1.0"
3.2.19、loggin
配置日志选项。
logging: driver: syslog options: syslog-address: "tcp://192.168.0.42:123"
目前支持三种日志驱动类型。如下:
driver: "json-file"
driver: "syslog"
driver: "none"
options 配置日志驱动的相关参数如下: options: max-size: "200k" max-file: "10"
3.2.20、network_mode
设置网络模式。使用和 docker run 的 --network 参数一样的值。
network_mode: "bridge" network_mode: "host" network_mode: "none" network_mode: "service:[service name]" network_mode: "container:[container name/id]"
3.2.21、networks
配置容器连接的网络。
version: "3" services: some-service: networks: - some-network - other-network networks: some-network: other-network:
3.2.22、pid
跟主机系统共享进程命名空间。打开该选项的容器之间,以及容器和宿主机系统之间可以通过进程 ID 来相互访问和操作。
pid: "host"
3.2.23、secrets
存储敏感数据,例如 mysql 服务密码。
version: "3.1" services: mysql: image: mysql environment: MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password secrets: - db_root_password - my_other_secret secrets: my_secret: file: ./my_secret.txt my_other_secret: external: true
3.2.24、security_opt
指定容器模板标签(label)机制的默认属性(用户、角色、类型、级别等)。例如配置标签的用户名和角色名。
security_opt: - label:user:USER - label:role:ROLE
3.2.25、stop_signal
设置另一个信号来停止容器。在默认情况下使用的是 SIGTERM 停止容器。
stop_signal: SIGUSR1
3.2.26、sysctls
配置容器内核参数。
sysctls: net.core.somaxconn: 1024 net.ipv4.tcp_syncookies: 0 或者: sysctls: - net.core.somaxconn=1024 - net.ipv4.tcp_syncookies=0
3.2.27、ulimits
指定容器的 ulimits 限制值。
例如,指定最大进程数为 65535,指定文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制) 和 40000(系统硬限制,只能 root 用户提高)。
ulimits: nproc: 65535 nofile: soft: 20000 hard: 40000
3.2.28、container_name
指定容器名称,默认将会使用“项目名称_服务名称_序号” 这样的格式。
container_name: docker-web-container
注意: 指定容器名称后,该服务将无法进行扩展(scale),因为 Docker 不允许多个容器具有相同的名称。
3.2.29、env_file
从文件中获取环境变量,可以为单独的文件路径或列表。
如果通过docker-compose -f FILE方式来指定compose模板文件,则env_file中变量的路径会基于模板文件路径。
如果有变量名称与environment指令冲突,则按照惯例,以后者为准。
env_file: .env env_file: - ./common.env - ./apps/web.env - /opt/secrets.env
环境变量文件中每一行必须符合格式,支持#开头的注释行,如下所示:
# common.env: Set development environment PROG_ENV=development
cpu_shares, cpu_quota, cpuset, domainname, hostname, ipc, mac_address, mem_limit, memswap_limit, privileged, read_only, restart, shm_size, stdin_open, tty, user, working_dir等......这些命令(指令)都是单个值,含义基本跟 docker run 中对应参数的功能一致。
四、其它命令(指令)
4.1、指定服务容器启动后执行的入口文件。
entrypoint: /code/entrypoint.sh
4.2、指定容器中运行应用的用户名。
user: nginx
4.3、指定容器中工作目录。
working_dir: /code
4.4、指定容器中搜索域名、主机名、mac 地址等。
domainname: your_website.com hostname: test mac_address: 08-00-27-00-0C-0A
4.5、允许容器中运行一些特权命令。
privileged: true
指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效。
重启策略有以下几种:
no:默认策略,在容器退出时不重启容器。
on-failure:在容器非正常退出时(退出状态非0),才会重启容器(生产环境建议配置此重启策略)。
on-failure:3:在容器非正常退出时重启容器,最多重启3次。
always:在容器退出时总是重启容器。
unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器。
示例:
restart: on-failure:3
docker run的退出状态码如下:
0:表示正常退出
非0:表示异常退出(退出状态码采用chroot标准)
125:Docker守护进程本身的错误
126:容器启动后,要执行的默认命令无法调用
127:容器启动后,要执行的默认命令不存在
其他命令状态码,容器启动后正常执行命令,退出命令时该命令的返回状态码作为容器的退出状态码
4.6、以只读模式挂载容器的 root 文件系统,意味着不能对容器内容进行修改。
read_only: true
4.7、打开标准输入,可以接受外部输入。
stdin_open: true
4.8、模拟一个伪终端。
tty: true
4.9、读取变量
compose模板文件支持动态读取主机的系统环境变量和当前目录下的 .env 文件中的变量。
例如:下面的 Compose 文件将从运行它的环境中读取变量 ${MONGO_VERSION} 的值,并写入执行的指令中。
version: "3" services: db: image: "mongo:${MONGO_VERSION}"
如果执行 MONGO_VERSION=3.2 docker-compose up 则会启动一个 mongo:3.2 镜像的容器;如果执行 MONGO_VERSION=2.8 docker-compose up 则会启动一个 mongo:2.8 镜像的容器。
若当前目录存在 .env 文件,执行 docker-compose 命令时将从该文件中读取变量。
在当前目录新建 .env 文件并写入以下内容。
# 支持 # 号注释 MONGO_VERSION=3.6
执行 docker-compose up 则会启动一个 mongo:3.6 镜像的容器。
五、批处理脚本
# 关闭所有正在运行容器
docker ps | awk '{print $1}' | xargs docker stop
# 删除所有容器应用
docker ps -a | awk '{print $1}' | xargs docker rm
# 或者
docker rm $(docker ps -a -q)
更多命令请自行查阅相关资料
失去的时间 失去的人 失去的自己 最后都变成了故事 -->木小瓷【撒野】
声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。
精彩评论