Docker-compose简介

Docker常用工具:

docker-compose # 多容器编排工具,基于 Yaml 格式资源清单
	docker-swarm # 集群化管理器
	docker-machine # 是安装和管理 Docker 的工具,创建具有docker服务的虚拟机的技术

docker-compose介绍

docker-compose是docker官方的多容器编排工具,用于定义和运行多容器 Docker 应用程序的工具。

docker-compose使用步骤

使用 docker-compose.yml 定义构成应用程序的服务和环境,这样它们可以在隔离环境中一起运行

用docker-compose -f /path/docker-compose.yml up -d --build 来启动整个docker应用程序的运行

docker-compose安装

$ http://get.daocloud.io/#install-compose # 获取下载地址
$ curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
备注: 如果宿主机环境相同, 可以直接将下载好的docker-compose文件拷贝过来,chmod权限,即可使用.

用Docker-compose方式部署nextcloud(私有网盘)示例yml文件:

version: "3.9"
services:
  nextcloud:
    image: "nextcloud:latest"
    networks:
      - def_compose_net
    restart: always
    ports:
      - "13001:80"
    depends_on:
      - pgservice
    volumes:
      - type: volume
        source: nextcloud_data
        target: /var/www/html
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
    privileged: true #默认true
    container_name: nextcloud
  pgservice:
    image: "postgres:latest"
    container_name: pgservice
    restart: always
    ports:
      - "13002:5432"
    environment:
      POSTGRES_DB: postgres
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: 12345678
    networks:
      - def_compose_net
    volumes:
      - type: bind
        source: /etc/localtime
        target: /etc/localtime
      - type: bind
        source: /etc/timezone
        target: /etc/timezone
      - type: volume
        source: pgdata
        target: /var/lib/postgresql/data
      - type: bind
        source: /opt/FaceService
        target: /opt/FaceService
volumes:
  nextcloud_data:
  pgdata:
    external: false
networks:
  def_compose_net:
    external: false
    name: def_compose_net

docker-compose常用命令

$ docker-compose -f 文件路径/文件名 [选项]
	-f  # 指定使用的 yaml 文件位置	
	version # 查看版本
	ps # 显示所有容器信息s
	restart # 重新启动容器
	logs # 查看日志信息
	config -q # 验证 yaml 配置文件是否正确
	start/stop # 启动/停止容器
	up -d # 启动容器项目
	pause # 暂停容器
	unpause # 恢复暂停
	rm # 删除容器

Docker-compose 基本语法

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

yml文件配置文件详解

1、version

指定本yml一从的compose 哪个版本制定的。

2、image

services: #定义服务
  web: # web服务
    image: hello-world # 启动服务使用的镜像
指定容器运行的镜像,格式:
image: redis # 镜像名称
image: ubuntu:14.04 #镜像:版本号
image: tutum/influxdb # 个人用户级别的镜像
image: example-registry.com:4000/postgresql # 非官方仓库的镜像
image: a4bc65fd # 镜像ID

3、build

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

build: /path/to/build/dir/

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

build: ./dir
build:
  context: /home/transport或./transport#context:指定Dockerfile文件所在的路径
  dockerfile: Dockerfile#dockerfile:指定context指定的目录下面的Dockerfile的名称(默认为Dockerfile)
args:#args:Dockerf
   args: # 指定输入环境变量
    buildno: 1 # 环境变量
    password: secret # 环境变量
image: webapp:tag # 命名的镜像名称,根据此名称启动

4、command 覆盖容器启动的默认命令。

command: bundle exec thin -p 3000

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

5、container_name:<项目名称><服务名称><序号>

container_name: app # 指定自定义容器名称,而不是生成的默认名称。

6、depends_on设置依赖关系,建立关联,优先级启动

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

docker-compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。
docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。
docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。

7、dns

自定义 DNS 服务器,可以是单个值或列表的多个值。

dns: 8.8.8.8

dns:
  - 8.8.8.8
  - 9.9.9.9

8、dns_search

自定义 DNS 搜索域。可以是单个值或列表。

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

9、tmpfs

在容器内安装一个临时文件系统。可以是单个值或列表的多个值。

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

10、 entrypoint

entrypoint: /code/entrypoint.sh #覆盖容器默认的 entrypoint

11、env_file

env_file: .env
从文件添加环境变量。可以是单个值或列表的多个值。

env_file: # 列表格式
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

12、environment:镜像变量

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

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

13、expose

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

expose:
 - "3000"
 - "8000"

14、 external_links:链接外部容器

external_links: # 将容器的地址注入到host文件里
 - redis_1
 - project_db_1:mysql # 添加别名
 - project_db_1:postgresql

15、extra_hosts

添加主机名映射

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

会在此服务的内部容器中 /etc/hosts 创建一个具有 ip 地址和主机名的映射关系:

162.242.195.82 somehost
50.31.209.229 otherhost

16、labels

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"

17、links:与 Docker client 的 --link 一样效果,会连接到其它服务中的容器

links:
 - db
 - db:database
 - redis

18、 logging

服务的日志记录配置。

logging:
  driver: syslog # 指定服务容器的日志记录驱动程序,默认值为json-file,有以下三个选项 driver: “json-file”    driver: “syslog”     driver: “none”
  options:
    syslog-address: "tcp://192.168.0.42:123"

19、pid

指定pid名称

pid: "host"

20、port

指定端口的暴露

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

21、security_opt

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

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

label:user:USER # 设置容器的用户标签
label:role:ROLE # 设置容器的角色标签
label:type:TYPE # 设置容器的安全策略标签
label:level:LEVEL # 设置容器的安全等级标签

22、 stop_signal

设置停止容器的替代信号。
stop_signal: SIGUSR1

23、volumes

volumes:
  // 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。
  - /var/lib/mysql
 
  // 使用绝对路径挂载数据卷
  - /opt/data:/var/lib/mysql
 
  // 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。
  - ./cache:/tmp/cache
 
  // 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。
  - ~/configs:/etc/configs/:ro
 
  // 已经存在的命名的数据卷。
  - datavolume:/var/lib/mysql

24、volumes_from

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

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

25、cap_add, cap_drop

添加或删除容器拥有的宿主机的功能。

cap_add:
  - ALL
 
cap_drop:
  - NET_ADMIN # 网络管理员权限
  - SYS_ADMIN

26、extends

连接其他文件

extends:
  file: common.yml
  service: webapp

27、network_mode

设置网络模式。

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

28、 networks

配置容器连接的网络,引用顶级 networks 下的条目 。

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

29、ulimits

覆盖容器默认的ulimits

ulimits:
	nproc: 65535
	nofile:
	soft: 20000
	hard: 40000

30、stop_grace_period

指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号),等待多久后发送 SIGKILL 信号关闭容器
stop_grace_period: 1s # 等待 1 秒
stop_grace_period: 1m30s # 等待 1 分 30 秒
默认的等待时间是 10 秒。

31、secrets

存储敏感数据

version: “3.1”
services:

	mysql:
	    image: mysql
	    environment:
 	        MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret
	    secrets:
		    - my_secret
	    secrets:
		   my_secret:
		   file: ./my_secret.txt

32、restart

no:是默认的重启策略,在任何情况下都不会重启容器。
always:容器总是重新启动。
on-failure:在容器非正常退出时(退出状态非0),才会重启容器。
unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
restart: “no”
restart: always
restart: on-failure
restart: unless-stopped
注:swarm 集群模式,请改用 restart_policy。

33、aliases

同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务

34、healthcheck

用于检测 docker 服务是否健康运行。

healthcheck:
test: [“CMD”, “curl”, “-f”, “http://localhost”] # 设置检测程序
interval: 1m30s # 设置检测间隔
timeout: 10s # 设置检测超时时间
retries: 3 # 设置重试次数
start_period: 40s # 启动后,多少秒开始启动检测程序

34、devices

指定设备映射列表。

devices:
“/dev/ttyUSB0:/dev/ttyUSB0”

35、cgroup_parent

为容器指定父 cgroup 组,意味着将继承该组的资源限制。
cgroup_parent: m-executor-abcd

36、deploy

指定与docker swarm集群服务的部署和运行有关的配置。只在 swarm 模式下才会有用。

理解:
docker run 单机运行单个容器
docker-compose 单机运行多个容器
docker swarm 集群服务
docker service create  创建集群中的单个服务;
docker stack 管理集群中的多个服务;

37、endpoint_mode:访问集群服务的方式。

endpoint_mode: vip
Docker 集群服务一个对外的虚拟 ip。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。
endpoint_mode: dnsrr
#DNS 轮询(DNSRR)。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。

38、labels

#在服务上设置标签。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels。

39、mode

指定服务提供的模式。

40、replicated

#复制服务,复制指定服务到集群的机器上。

41、global

全局服务,服务将部署至集群的每个节点。

42、replicas

mode 为 replicated 时,需要使用此参数配置具体运行的节点数量。
指定集群中运行容器的数量;

43、resources

配置服务器资源使用的限制,例如上例子,配置 redis 集群运行需要的 cpu 的百分比 和 内存的占用。避免占用资源过高出现异常。

44、restart_policy:

配置如何在退出容器时重新启动容器。

condition:可选 none,on-failure 或者 any(默认值:any)。
delay:设置多久之后重启(默认值:0)。
max_attempts:尝试重新启动容器的次数,超出次数,则不再尝试(默认值:一直重试)。
window:设置容器重启超时时间(默认值:0)。

45、rollback_config

配置在更新失败的情况下应如何回滚服务。

parallelism:一次要回滚的容器数。如果设置为0,则所有容器将同时回滚。
delay:每个容器组回滚之间等待的时间(默认为0s)。
failure_action:如果回滚失败,该怎么办。其中一个 continue 或者 pause(默认pause)。
monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
max_failure_ratio:在回滚期间可以容忍的故障率(默认为0)。
order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认 stop-first )。

46、update_config

配置应如何更新服务,对于配置滚动更新很有用。

parallelism:一次更新的容器数。
delay:在更新一组容器之间等待的时间。
failure_action:如果更新失败,该怎么办。其中一个 continue,rollback 或者pause (默认:pause)。
monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
max_failure_ratio:在更新过程中可以容忍的故障率。
order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认stop-first)。
注:仅支持 V3.4 及更高版本。

47.memory

持续更新
###: docker-compose配置详解官方文档