Docker-compose(多容器编排工具)
在学习使用docker-compose之前必须要了解YAML语言的用法。YAML语言是一种非常简单的语言,下篇会具体介绍。
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 up 来启动整个docker应用程序的运行
docker-compose安装
$ http://get.daocloud.io/#install-compose # 获取下载地址
$ curl -L https://get.daocloud.io/docker/compose/releases/download/1.28.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ chmod x /usr/local/bin/docker-compose
# 用Docker方式部署Seafile(云存储)
$ https://cloud.seafile.com/published/seafile-manual-cn/home.md
# 安装 docker-compose
# for CentOS
$ yum install docker-compose -y
# for Ubuntu
$ apt-get install docker-compose -y
# 下载并修改 docker-compose.yml
MySQL root 用户的密码 (MYSQL_ROOT_PASSWORD and DB_ROOT_PASSWD)
持久化存储 MySQL 数据的 volumes 目录 (volumes)
持久化存储 Seafile 数据的 volumes 目录 (volumes)
# 启动 Seafile 服务
$ docker-compose up -d
# 浏览器上访问http://seafile.example.com 来打开 Seafile 主页。
# 注意:在 docker-compose.yml 文件所在的目录下执行以上命令。
ocker-compose常用命令
$ docker-compose version # 查看版本
$ docker-compose ps # 显示所有容器信息
$ docker-compose restart # 重新启动容器
$ docker-compose logs # 查看日志信息
$ docker-compose config -q # 验证 yaml 配置文件是否正确
$ docker-compose start/stop # 启动/停止容器
$ docker-compose up -d # 启动容器项目
$ docker-compose pause # 暂停容器
$ docker-compose unpause # 恢复暂停
$ docker-compose rm # 删除容器
$ docker-compose -f 路径 选项 # 指定使用的 yaml 文件位置
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: ../ # 描述当前的路径信息
dockerfile: path/of/Dockerfile # 文件位置
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
指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用。
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 及更高版本。
Example
$ docker pull mysql:5.7 # 下载mysql镜像
$ http://get.daocloud.io/#install-compose # 获取下载地址
$ curl -L https://get.daocloud.io/docker/compose/releases/download/1.28.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ chmod x /usr/local/bin/docker-compose
$ vim docker-compose.yaml
version: '2'
services:
db:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
restart: always
ports:
- "8000:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
$ chmod a x /usr/local/bin/docker-compose
$ docker-compose version # 查看版本
$ docker-compose up -d # 启动容器项目(不能被docker run 其他启动项目访问的)
$ docker ps -a # 查看容器是否启动
# 浏览器查看,wordpress是否已经安装
192.168.66.112
赞 (0)