xml地图|网站地图|网站标签 [设为首页] [加入收藏]
来自 每日资讯 2019-10-06 10:42 的文章
当前位置: 新濠国际登录平台 > 每日资讯 > 正文

一个应用的容器,创建管理节点

一、概念

    Docker Compose 是官方编排项目之一,负责快速的部署分布式应用。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML格式)来定义一种相关联的应用容器为一个项目。

    Docker  Compose 中有两个重要的概念:

服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

    Docker Compose 的安装可以参考上一篇文章的内容。

Docker基础资料

Docker Engine 从v1.12.0版本开始,原生集成了 Docker Swarm,对集群的操作可以直接通过docker service命令来控制,非常方便,操作过程也大大简化。Docker Swarm 对于一般的开发者而言,最大的好处在于原生支持的负载均衡机制,能够有效的将service给scale up,借助 Raft Consensus 算法,将系统的 robustness 做得非常好,最大限度能够容忍 (n-1)/2 个故障节点。
搭建Swarm集群

先来看一份 docker-compose.yml 文件,不用管这是干嘛的,只是有个格式方便后文解说:

二、Compose 命令说明

    对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。

    以下常用命令在 docker-compose.yml 同级目录下执行,否则需要 docker-compose -f [docker-compose.yml 路径] [命令]:

docker-compose [命令] -help查看某个命令的帮助(神器,授人以鱼不如授人以渔)。

docker-compose config:验证 Compose 文件(docker-compose.yml)格式是否正确,若正确则显示配置。若格式错误则显示原因。

docker-compose up:尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。

-d 在后台运行服务容器。
--no-color 不使用颜色来区分不同的服务的控制台输出。
--no-deps 不启动服务所链接的容器。
--force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用。
--no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
--no-build 不自动构建缺失的服务镜像。
-t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。

docker-compose down:此命令会停止 up 命令所启动的容器,并移除网络。

docker-compose images :列出 Compose 文件中包含的镜像。

docker-compose ps:列出项目中目前的所有容器。

docker-compose ps --service:列出项目中目前的所有服务(重要,很多命令都是基于服务来操作的)。

docker-compose logs [options] [SERVICE...]:查看服务容器的日志输出。

docker-compose exec [SERVICE] bash : 进入指定的容器。

docker-compose stop [options] [SERVICE...] :停止已经处于运行中的容器,但不删除它。

docker-compose kill -s SIGINT [SERVICE...] :通过发送 SIGINT 信号来强制停止服务容器(类似于stop)

docker-compose start [SERVICE...] :启动已经存在的服务容器。

docker-compose restart [options] [SERVICE...]:重启项目中的服务

docker-compose rm [options] [SERVICE...]:删除所有(停止状态的)服务容器,-f 强制删除,包括非停止状态 -v 删除容器所挂载的数据卷。

docker-compose pause [SERVICE...]:暂停一个服务容器。

docker-compose unpause [SERVICE...]:恢复处于暂停状态中的服务。

docker-compose scale [options] [SERVICE=NUM...]:设置指定服务运行的容器个数。(神器,照这样岂不是很简单就实现了分布式?)

docker-compose top:查看各个容器内运行的进程

安装docker

安装最新docker

version: '2'
services:
  web:
    image: dockercloud/hello-world
    ports:
      - 8080
    networks:
      - front-tier
      - back-tier

  redis:
    image: redis
    links:
      - web
    networks:
      - back-tier

  lb:
    image: dockercloud/haproxy
    ports:
      - 80:80
    links:
      - web
    networks:
      - front-tier
      - back-tier
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock 

networks:
  front-tier:
    driver: bridge
  back-tier:
driver: bridge

三、Compose 模板文件

    模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多。下面笔主筛选出一些常见的命令,不推荐使用和不常用的就不介绍了~~

    默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式:

version: '3'
#服务列表
services:
  #服务1,服务名叫web
  web:
    build: .
    ports:
     - "5000:5000"
    command: echo "hello world"
    depends_on:
     - redis
    ulimits:
      #最大进程数
      nproc: 64435
      nofile:
       #文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制)
       soft: 20000
       #文件句柄数为 40000(系统硬限制,只能 root 用户提高)
       hard: 40000
  #服务2,服务名叫redis
  redis:
    image: "redis:alpine"

    注意每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像。

$ sudo apt-get install docker.io

curl -sSL https://get.docker.com/ | sh

CentOS 7防火墙放开

firewall-cmd --permanent --zone=trusted --add-port=2377/tcp && 
firewall-cmd --permanent --zone=trusted --add-port=7946/tcp && 
firewall-cmd --permanent --zone=trusted --add-port=7946/udp && 
firewall-cmd --permanent --zone=trusted --add-port=4789/udp && 
firewall-cmd --reload 

可以看到一份标准配置文件应该包含 version、services、networks 三大部分,其中最关键的就是 services 和 networks 两个部分,下面先来看 services 的书写规则。

    1、build

指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。

version: '3'
services:

  webapp:
    build: ./dir

也可以使用 context 指令指定 Dockerfile 所在文件夹的路径;使用 dockerfile 指令指定 Dockerfile 文件名;使用 arg 指令指定构建镜像时的变量。

version: '3'
services:

  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1

查看本地已有镜像

创建管理节点

1. image

services:
  web:
    image: hello-world

在 services 标签下的第二级标签是 web,这个名字是用户自己自定义,它就是服务名称。
image 则是指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
例如下面这些格式都是可以的:

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd

    2、image``

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

version: '3'
services:

  redis:
    image: "redis:alpine"

$ sudo docker images

$ docker swarm init --advertise-addr 192.168.99.100
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.

To add a worker to this swarm, run the following command:
    docker swarm join 
    --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c 
    192.168.99.100:2377

To add a manager to this swarm, run the following command:
    docker swarm join 
    --token SWMTKN-1-61ztec5kyafptydic6jfc1i33t37flcl4nuipzcusor96k7kby-5vy9t8u35tuqm7vh67lrz9xp6 
    192.168.99.100:2377

2. build

服务除了可以基于指定的镜像,还可以基于一份 Dockerfile,在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器。

build: /path/to/build/dir

也可以是相对路径,只要上下文确定就可以读取到 Dockerfile。

build: ./dir

设定上下文根目录,然后以该目录为准指定 Dockerfile。

build:
  context: ../
  dockerfile: path/of/Dockerfile

注意 build 都是一个目录,如果你要指定 Dockerfile 文件需要在 build 标签的子级标签中使用 dockerfile 标签指定,如上面的例子。
如果你同时指定了 image 和 build 两个标签,那么 Compose 会构建镜像并且把镜像命名为 image 后面的那个名字。

build: ./dir
image: webapp:tag

既然可以在 docker-compose.yml 中定义构建任务,那么一定少不了 arg 这个标签,就像 Dockerfile 中的 ARG 指令,它可以在构建过程中指定环境变量,但是在构建成功后取消,在 docker-compose.yml 文件中也支持这样的写法:

build:
  context: .
  args:
    buildno: 1
    password: secret

下面这种写法也是支持的,一般来说下面的写法更适合阅读。

build:
  context: .
  args:
    - buildno=1
    - password=secret

与 ENV 不同的是,ARG 是允许空值的。例如:

args:
  - buildno
  - password

这样构建过程可以向它们赋值。

注意:YAML 的布尔值(true, false, yes, no, on, off)必须要使用引号引起来(单引号、双引号均可),否则会当成字符串解析。

    3、cap_add, cap_drop

指定容器的内核能力(capacity)分配。

#让容器拥有所有能力可以指定为:
cap_add:
  - ALL
#去掉 NET_ADMIN 能力可以指定为:
cap_drop:
  - NET_ADMIN

安装 docker-compose

当管理节点创建完成,我们可以通过docker info和docker node ls命令查看节点创建情况。

3. command

使用 command 可以覆盖容器启动后默认执行的命令。

command: bundle exec thin -p 3000

也可以写成类似 Dockerfile 中的格式:

command: [bundle, exec, thin, -p, 3000]

    4、command

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

command: echo "hello world"

$ sudo apt-get install -u docker-compose

$ docker info

Containers: 2
Running: 0
Paused: 0
Stopped: 2
  ...snip...
Swarm: active
  NodeID: dxn1zf6l61qsb1josjja83ngz
  Is Manager: true
  Managers: 1
  Nodes: 1
  ...snip...

$ docker node ls

ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
dxn1zf6l61qsb1josjja83ngz *  manager1  Ready   Active        Leader
创建worker节点

4.container_name

前面说过 Compose 的容器名称格式是:<项目名称><服务名称><序号>
虽然可以自定义项目名称、服务名称,但是如果你想完全控制容器的命名,可以使用这个标签指定:

container_name: app

这样容器的名字就指定为 app 了。

    5、depends_on

解决容器的依赖、启动先后的问题。

version: '3'
services:

  web:
    build: .
    depends_on:
     - redis

  redis:
    image: "redis:alpine"

查看 docker-compose 信息

根据前面命令行输出结果提示,现在将两台worker添加到集群中。记得执行时将相对应的token和IP地址换成实际情况中的值。

5.depends_on

在使用 Compose 时,最大的好处就是少打启动命令,但是一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。
例如在没启动数据库容器的时候启动了应用容器,这时候应用容器会因为找不到数据库而退出,为了避免这种情况我们需要加入一个标签,就是 depends_on,这个标签解决了容器的依赖、启动先后的问题。
例如下面容器会先启动 redis 和 db 两个服务,最后才启动 web 服务:

version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

注意的是,默认情况下使用 docker-compose up web 这样的方式启动 web 服务时,也会启动 redis 和 db 两个服务,因为在配置文件中定义了依赖关系。

    6、expose

暴露端口,但不映射到宿主机,只被连接的服务访问,仅可以指定内部端口为参数。

expose:
 - "3000"
 - "8000"

$ docker-compose -h

$ docker swarm join 
  --token  SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c 
  192.168.99.100:2377

This node joined a swarm as a worker.
$ docker swarm join 
  --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c 
  192.168.99.100:2377

This node joined a swarm as a worker.
#这里可以设置静态hostname `hoshnamectl set-hostname worker2`

6.dns

和 --dns 参数一样用途,格式如下:

dns: 8.8.8.8

也可以是一个列表:

dns:
  - 8.8.8.8
  - 9.9.9.9

此外 dns_search 的配置也类似:

dns_search: example.com
dns_search:
  - dc1.example.com
  - dc2.example.com

    7、ports

暴露端口信息;使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以;建议数字串都采用引号包括起来的字符串格式。

ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:8001:8001"

将用户加入docker组

现在我们可以在manager1节点上查看集群中的所有节点

7. tmpfs

挂载临时目录到容器内部,与 run 的参数一样效果:

tmpfs: /run
tmpfs:
  - /run
  - /tmp

    8、ulimits

指定容器的 ulimits 限制值。

ulimits:
  #最大进程数
  nproc: 64435
  nofile:
   #文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制)
   soft: 20000
   #文件句柄数为 40000(系统硬限制,只能 root 用户提高)
   hard: 40000

$ sudo groupadd docker

$ docker node ls

ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
3g1y59jwfg7cf99w4lt0f662    worker2   Ready   Active
j68exjopxe7wfl6yuxml7a7j    worker1   Ready   Active
dxn1zf6l61qsb1josjja83ngz *  manager1  Ready   Active        Leader

8. entrypoint

在 Dockerfile 中有一个指令叫做 ENTRYPOINT 指令,用于指定接入点,第四章有对比过与 CMD 的区别。
在 docker-compose.yml 中可以定义接入点,覆盖 Dockerfile 中的定义:

entrypoint: /code/entrypoint.sh

格式和 Docker 类似,不过还可以写成这样:

entrypoint:
    - php
    - -d
    - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
    - -d
    - memory_limit=-1
    - vendor/bin/phpunit

     9、env_file

 从文件中获取环境变量,可以为单独的文件路径或列表;则 env_file 中变量的路径会基于模板文件路径。如果有变量名称与 environment 指令冲突,则按照惯例,以后者为准。

env_file: .env

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

环境变量文件中每一行必须符合格式,支持 # 开头的注释行

# common.env: Set development environment
PROG_ENV=development

$ sudo gpasswd -a {USER} docker

到目前为止,集群环境搭建完毕。

9.env_file

还记得前面提到的 .env 文件吧,这个文件可以设置 Compose 的变量。而在 docker-compose.yml 中可以定义一个专门存放变量的文件。
如果通过 docker-compose -f FILE 指定了配置文件,则 env_file 中路径会使用配置文件路径。

如果有变量名称与 environment 指令冲突,则以后者为准。格式如下:

env_file: .env

或者根据 docker-compose.yml 设置多个:

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

注意的是这里所说的环境变量是对宿主机的 Compose 而言的,如果在配置文件中有 build 操作,这些变量并不会进入构建过程中,如果要在构建中使用变量还是首选前面刚讲的 arg 标签。

    10、environment

设置环境变量。可以使用数组或字典两种格式;只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。

environment:
  RACK_ENV: development
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SESSION_SECRET

$ sudo service docker restart

部署测试服务

10. environment

与上面的 env_file 标签完全不同,反而和 arg 有几分类似,这个标签的作用是设置镜像变量,它可以保存变量到镜像里面,也就是说启动的容器也会包含这些变量设置,这是与 arg 最大的不同。
一般 arg 标签的变量仅用在构建过程中。而 environment 和 Dockerfile 中的 ENV 指令一样会把变量一直保存在镜像、容器中,类似 docker run -e 的效果。

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET

    11、extra_hosts

指定额外的 host 名称映射信息。

extra_hosts:
 - "googledns:8.8.8.8"
 - "dockerhub:52.1.157.61"

-- 添加完成重启机器

我们以部署nginx为例,测试我们搭建的Swarm集群。

11. expose

这个标签与Dockerfile中的EXPOSE指令一样,用于指定暴露的端口,但是只是作为一种参考,实际上docker-compose.yml的端口映射还得ports这样的标签。

expose:
 - "3000"
 - "8000"

    12、labels

为容器添加 Docker 元数据(metadata)信息。例如可以为容器添加辅助说明信息。

labels:
  com.startupteam.description: "webapp for a startup team"
  com.startupteam.department: "devops department"
  com.startupteam.release: "rc3 for v1.0"

登录

$ docker service create --replicas 3 --publish 8080:80 --name helloworld nginx

12. external_links

在使用Docker过程中,我们会有许多单独使用docker run启动的容器,为了使Compose能够连接这些不在docker-compose.yml中定义的容器,我们需要一个特殊的标签,就是external_links,它可以让Compose项目里面的容器连接到那些项目配置外部的容器(前提是外部容器中必须至少有一个容器是连接到与项目内的服务的同一个网络里面)。
格式如下:

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

    13、sysctls

配置容器内核参数。

sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0

sysctls:
  - net.core.somaxconn=1024
  - net.ipv4.tcp_syncookies=0

$ docker login local-dtr.patsnap.com

这里的--replicas参数用来表示nginx需要部署多少个实例,因为这里是三台物理机器,如果replicas设为3,swarm会在三台机器上各部署一个实例。如果想要重新scale实例的个数,可以通过下面的命令。

13. extra_hosts

添加主机名的标签,就是往/etc/hosts文件中添加一些记录,与Docker client的--add-host类似:

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

启动之后查看容器内部hosts:

162.242.195.82  somehost
50.31.209.229   otherhost

    14、volumes

数据卷所挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro);该指令中路径支持相对路径。

volumes:
 - /var/lib/mysql
 - cache/:/tmp/cache
 - ~/configs:/etc/configs/:ro

Username (local): local

docker service scale helloworld=5

14. labels

向容器添加元数据,和Dockerfile的LABEL指令一个意思,格式如下:

labels:
  com.example.description: "Accounting webapp"
  com.example.department: "Finance"
  com.example.label-with-empty-value: ""
labels:
  - "com.example.description=Accounting webapp"
  - "com.example.department=Finance"
  - "com.example.label-with-empty-value"

    15、network_mode 

    配置网络模式。Docker 的默认网络配置是 "bridge",当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。

network_mode: "bridge"
network_mode: "host"     --备注:没有自己的网络模式,跟宿主机共用一套ip地址,相当于在宿主机上安装了应用一样
network_mode: "none"     --备注:没有网络,将网络创建的任务完全交给用户,可以通过 links 实现两个容器的单机互连
network_mode: "service:[service name]"  --备注:跟某个服务复用网络
network_mode: "container:[container name/id]"  --备注:跟某个容器复用网络
#自定义IP地址

  networks:
     cluster_net:
        ipv4_address: 172.16.238.101

Password: patsnaplocal

我们可以通过一系列的命令去查看nginx的部署情况,例如

15. links

还记得上面的depends_on吧,那个标签解决的是启动顺序问题,这个标签解决的是容器连接问题,与Docker client的--link一样效果,会连接到其它服务中的容器。
格式如下:

links:
 - db
 - db:database
 - redis

使用的别名将会自动在服务容器中的/etc/hosts里创建。例如:

172.12.2.186  db
172.12.2.186  database
172.12.2.187  redis

相应的环境变量也将被创建。

    16、restart

指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always 或者 unless-stopped。

利用 Dockerfile 创建镜像

$ docker service inspect --pretty helloworld
$ docker service ps helloworld

16. logging

这个标签用于配置日志服务。格式如下:

logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"

默认的driver是json-file。只有json-file和journald可以通过docker-compose logs显示日志,其他方式有其他日志查看方式,但目前Compose不支持。对于可选值可以使用options指定。
有关更多这方面的信息可以阅读官方文档:
https://docs.docker.com/engine/admin/logging/overview/

四、寄语

    学习 Docker Compose 过程中,突然想起以前老师的教导:学习一样技能,心一定要放宽,没必要钻牛角尖,毕竟学习不是冲着要成为百科全书而去的,要不然要百科全书干嘛呢?学习应该是一件很开心快乐的事情,没必要吹毛求疵,比如说:一个用法有一堆命令可以达到目的,那我都要记下那一堆命令吗?比如说,一些罕见的用法,我也要过于追究吗?

 

参考资料:https://yeasy.gitbooks.io/docker_practice/content/compose/

-- Dockerfile中每条指令都创建镜像的一层,一般Dockerfile分为四部分:基础镜像信息/维护者信息/镜像操作指令/容器启动时执行的指令。如:

删除一个服务也很简单,直接执行rm就可以了。

17. pid

pid: "host"

将PID模式设置为主机PID模式,跟主机系统共享进程命名空间。容器使用这个标签将能够访问和操纵其他容器和宿主机的名称空间。

#patsnap-course-project

$ docker service rm helloworld

18. ports

映射端口的标签。
使用HOST:CONTAINER格式或者只是指定容器的端口,宿主机会随机映射端口。

ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:8001:8001"

注意:当使用HOST:CONTAINER格式来映射端口时,如果你使用的容器端口小于60你可能会得到错误得结果,因为YAML将会解析xx:yy这种数字格式为60进制。所以建议采用字符串格式。

FROM local-dtr.patsnap.com/patsnap/base:php5.5.30nginxnode-v1.4

先来看一份 docker-compose.yml 文件,不用管这是干嘛的,只是有个格式方便后文解说:

19. security_opt

为每个容器覆盖默认的标签。简单说来就是管理全部服务的标签。比如设置全部服务的user标签值为USER。

security_opt:
  - label:user:USER
  - label:role:ROLE

ADD deployment/nginx/conf/conf.d/* /usr/local/nginx/conf/conf.d/

version: '2'
services:
  web:
    image: dockercloud/hello-world
    ports:
      - 8080
    networks:
      - front-tier
      - back-tier

  redis:
    image: redis
    links:
      - web
    networks:
      - back-tier

  lb:
    image: dockercloud/haproxy
    ports:
      - 80:80
    links:
      - web
    networks:
      - front-tier
      - back-tier
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock 

networks:
  front-tier:
    driver: bridge
  back-tier:
driver: bridge

20. stop_signal

设置另一个信号来停止容器。在默认情况下使用的是SIGTERM停止容器。设置另一个信号可以使用stop_signal标签。

stop_signal: SIGUSR1

ADD deployment/changeenv.sh /config/init/

可以看到一份标准配置文件应该包含 version、services、networks 三大部分,其中最关键的就是 services 和 networks 两个部分,下面先来看 services 的书写规则。

21. volumes

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

volumes:
  // 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。
  - /var/lib/mysql

  // 使用绝对路径挂载数据卷
  - /opt/data:/var/lib/mysql

  // 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。
  - ./cache:/tmp/cache

  // 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。
  - ~/configs:/etc/configs/:ro

  // 已经存在的命名的数据卷。
  - datavolume:/var/lib/mysql

如果你不使用宿主机的路径,你可以指定一个volume_driver。

volume_driver: mydriver

RUN mkdir -p /data/patsnap

  1. image

    services:
      web:
    image: hello-world
    

    在 services 标签下的第二级标签是 web,这个名字是用户自己自定义,它就是服务名称。
    image 则是指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
    例如下面这些格式都是可以的:

    image: redis
    image: Ubuntu:14.04
    image: tutum/influxdb
    image: example-registry.com:4000/postgresql
    image: a4bc65fd
    
  2. build

22. volumes_from

从其它容器或者服务挂载数据卷,可选的参数是 :ro或者 :rw,前者表示容器只读,后者表示容器对数据卷是可读可写的。默认情况下是可读可写的。

volumes_from:
  - service_name
  - service_name:ro
  - container:container_name
  - container:container_name:rw

VOLUME [/data/patsnap]

服务除了可以基于指定的镜像,还可以基于一份 Dockerfile,在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器。

23. cap_add, cap_drop

添加或删除容器的内核功能。详细信息在前面容器章节有讲解,此处不再赘述。

cap_add:
  - ALL

cap_drop:
  - NET_ADMIN
  - SYS_ADMIN

EXPOSE 10050 80

build: /path/to/build/dir

24. cgroup_parent

指定一个容器的父级cgroup。

cgroup_parent: m-executor-abcd

Dockerfile基本语法:

也可以是相对路径,只要上下文确定就可以读取到 Dockerfile。

25. devices

设备映射列表。与Docker client的--device参数类似。

devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"

-- #        ×用来注释

build: ./dir

26. extends

这个标签可以扩展另一个服务,扩展内容可以是来自在当前文件,也可以是来自其他文件,相同服务的情况下,后来者会有选择地覆盖原有配置。

extends:
  file: common.yml
  service: webapp

用户可以在任何地方使用这个标签,只要标签内容包含file和service两个值就可以了。file的值可以是相对或者绝对路径,如果不指定file的值,那么Compose会读取当前YML文件的信息。
更多的操作细节在后面的12.3.4小节有介绍。

-- FROM    指令告诉Docker使用那个镜像作为基础,第一条指令必须为FROM指令。

设定上下文根目录,然后以该目录为准指定 Dockerfile。

27. network_mode

网络模式,与Docker client的--net参数类似,只是相对多了一个service:[service name] 的格式。
例如:

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

可以指定使用服务或者容器的网络。

并且,如果在同一个dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次)

build:
  context: ../
  dockerfile: path/of/Dockerfile

28. networks

加入指定网络,格式如下:

services:
  some-service:
    networks:
     - some-network
     - other-network

关于这个标签还有一个特别的子标签aliases,这是一个用来设置服务别名的标签,例如:

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
         - alias3
      other-network:
        aliases:
         - alias2

相同的服务可以在不同的网络有不同的别名。

-- RUN      每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像。

注意 build 都是一个目录,如果你要指定 Dockerfile 文件需要在 build 标签的子级标签中使用 dockerfile 标签指定,如上面的例子。
如果你同时指定了 image 和 build 两个标签,那么 Compose 会构建镜像并且把镜像命名为 image 后面的那个名字。

29. 其它

还有这些标签: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的效果。

cpu_shares: 73
cpu_quota: 50000
cpuset: 0,1

user: postgresql
working_dir: /code

domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43

mem_limit: 1000000000
memswap_limit: 2000000000
privileged: true

restart: always

read_only: true
shm_size: 64M
stdin_open: true
tty: true

关于配置文件的扩展写法会在有空的时候补上,写得太长了。_(xз」∠)_

格式RUN 或RUN ["executable", "param1", "param2"],

build: ./dir
image: webapp:tag

新濠国际登录平台,前者将在shell终端运行命令,即/bin/sh -C;后者则使用exec执行。

既然可以在 docker-compose.yml 中定义构建任务,那么一定少不了 arg 这个标签,就像 Dockerfile 中的 ARG 指令,它可以在构建过程中指定环境变量,但是在构建成功后取消,在 docker-compose.yml 文件中也支持这样的写法:

指定使用其他终端可以通过第二种方式实现,例如:RUN ["/bin/bash", "-c", "echo hello"]。

build:
  context: .
  args:
    buildno: 1
    password: secret

-- CMD      指定启动容器时执行的命令,每个Dockerfile只能有一条CMD命令。如指定多条命令,只有最后一条会被执行。

下面这种写法也是支持的,一般来说下面的写法更适合阅读。

-- ENV      指定一个环境变量,会被后续RUN指令使用,并在容器运行时保存。格式:ENV

build:
  context: .
  args:
    - buildno=1
    - password=secret

-- ADD      该命令将复制指定的到容器中的。其中可以是Dockerfile所在目录的一个相对路径;

与 ENV 不同的是,ARG 是允许空值的。例如:

也可以是一个URL;还可以是一个tar文件(自动解压为目录)。

args:
  - buildno
  - password

本文由新濠国际登录平台发布于每日资讯,转载请注明出处:一个应用的容器,创建管理节点

关键词: