docker三剑客之compose(服务编排工具)

本篇博文中的操作系统: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


安装过程中如果出现如下报错:

d1.png

原因: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 都可以查看版本

d2.png


一般使用步骤:

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兼容性如下图所示:

d3.png


每个docker-compose.yml必须定义image或者build中的一个,其它的是可选的。

3.2、docker-compose.yml模板文件中的常用命令:

3.2.1、image

指定为镜像名称或镜像 ID。如果镜像在本地不存在,compose 将会尝试拉取这个镜像。示例:

d4.png

3.2.2、build

指定Dockerfile所在文件夹的路径(可以是绝对路径,或者相对docker-compose.yml文件的路径)。compose将会利用它自动构建这个镜像,然后使用这个镜像。

注意:在version 1里bulid仅支持值为字符串。version 2里支持对象格式。

d5.png


也可以使用context指定dockerfile所在文件夹的路径,使用dockerfile指令指定dockerfile文件名,使用arg指令指定构建镜像时的变量。示例如下:

d6.png


使用cache_from指定构建镜像的缓存,示例如下:

9999999.png


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。示例:

d8.png

使用了别名自动在容器的/etc/hosts文件里创建相应记录:

d9.png

所以我们在容器里就可以直接使用别名作为服务的主机名。


3.2.5、ports

暴露端口信息。

使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。同docker run -p。示例:

d10.png

注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。


3.2.6、expose

expose提供container之间的端口访问,不会暴露给宿主机使用。同docker run --expose。

d11.png


3.2.7、volumes 

数据卷所挂载路径设置。可以设置为宿主机路径(HOST:CONTAINER)或者数据卷名称(VOLUME:CONTAINER),并且可以设置访问模式 (HOST:CONTAINER:ro)。示例:

d12.png

如果路径为数据卷名称,必须在文件中配置数据卷。如下:

6666666.png


3.2.8、volumes_from

挂载数据卷容器,挂载是容器。同docker run --volumes-from。示例:

d13.png

container:container_name格式仅支持version 2。


3.2.9、environment

设置环境变量。同docker run -e。可以是数组或者字典格式。

只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据,如下所示:

d14.png


3.2.10、depends_on

解决容器的依赖、启动先后的问题,一般是mysql、redis等。指定了依赖,将会优先于服务创建并启动依赖。links也可以指定依赖。

以下文件中会先启动 redis、db,再启动 web。如下所示:

888888.png

注意:web 服务不会等待 redis、db、完全启动之后才启动。


3.2.11、external_links

链接到docker-compose.yml外部的容器,甚至并非compose管理的外部容器。通常是提供共享或公共服务。格式与links相似:

d15.png

注意,external_links链接的服务与当前服务必须是同一个网络环境。


3.2.12、extra_hosts

类似 Docker 中的 --add-host 参数,指定额外的 host 名称映射信息。

d16.png

将会在/etc/hosts创建记录:

d17.png


3.2.13、extends

继承自当前yml文件或者其它文件中定义的服务,可以选择性的覆盖原有配置。

d18.png

service必须有,file可选。service是需要继承的服务,例如web、database。


3.2.14、net

设置网络模式。同docker的--net参数。

d19.png


3.2.15、dns

自定义 DNS 服务器。可以是一个值,也可以是一个列表。

d20.png


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 中对应参数的功能一致。

d21.png


四、其它命令(指令)

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)

d22.png


更多命令请自行查阅相关资料




失去的时间  失去的人  失去的自己  最后都变成了故事    -->木小瓷【撒野



声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

小周博客
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复 0人评论 7,777人参与

loading