本篇介绍 docker 官方三剑客之一的 docker-compose。

注:环境为 CentOS7,docker 19.03。

docker-compose

docker-compose 的前身是开源的 docker 容器集群编排工具 Fig,2014年7月,Fig 被 Docker 收购并更名成为 docker-compose。

之前我们已经学习了关于 docker 的 dockerfile,使用它可以让用户快速生成一个需要的镜像,进而生成容器,快速配置一个应用。但是云计算的使用更多是面对庞大的用户群体,这样一来所发布的容器数量必然不少。而单机的 dockerfile 相比起来就相形见绌了。因此,像 Fig 这样的工具就孕育而生了。如果说 dockerfile 重现一个容器,那 docker-componse 就是重现容器的配置和集群了。

在 docker 中,“编排”和“部署”这两个词是时常出现的,那么它们具体指什么呢?

  • 编排(orchestration):它根据被部署的对象之间的耦合关系,以及被部署对象对环境的依赖,制定部署流程中各个动作的执行顺序,部署过程中所需要的依赖文件和被部署文件的存储位置和获取方式,以及如何验证部署成功。这些信息都会在编排工具中以指定的格式(比如配置文件或者特定的代码)来要求运维人员定义并保存起来,从而保证这个流程能够随时在全新的环境中可靠有序地重现出来。
  • 部署(deployment),它是指按照编排所指定地内容和流程,在目标机器上执行编排指定环境初始化,存放指定地依赖和文件,运行指定地部署动作,最终按照编排中地规则来确定部署成功。

总地来说,编排制定流程,部署执行流程,协同完成容器云的创建。

安装 docker-compose

dcoekr-componse 的安装方式如下:

# curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# chomd +x /usr/local/bin/docker-compose

docker-compose 简单实例

下面我们来用一个简单实例来说明 docker-compose 的用法:

1.创建一个 docker-compose 的目录

# mkdir composetest
# cd composetest

2.在目录中创建 app.py 并添加以下代码:

import time

import redis
from flask import Flask app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379) def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5) @app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)

3.在目录下创建 python 代码的依赖文件 requirements.txt 并添加依赖项:

redis
flask

4.创建 Dockerfile 文件

# 以 python:3.7-alpine 为基础镜像,创建镜像
FROM python:3.7-alpine
# 设置工作目录为 /code
WORKDIR /code
# 设置环境变量
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
# alpine 安装软件包
RUN apk add --no-cache gcc musl-dev linux-headers
# 从主机上复制 python 的依赖文件
COPY requirements.txt requirements.txt
# 安装依赖
RUN pip install -r requirements.txt
# 复制 composetest 目录中的所有文件到工作目录中
COPY . .
# 运行 python 应用
CMD ["flask", "run"]

5.定义 docker-compose.yml 文件

version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"

6.从 docker-compose 构建并启动应用

# docker-compose up

执行成功后,服务会启动并绑定端口 5000。

docker-compose 模板语法

目前 docker-compose 模板已经更新到 v3 版本,支持众多指令:







1.build

指定 Dockerfile 所在⽂件夹的路径(可以是绝对路径, 或者相对dockercompose.yml⽂件的路径) 。 Compose将会利⽤它⾃动构建应⽤镜像, 然后使⽤这个镜像, 例如:

version: '3'
services:
app:
build: /path/to/build/dirbuild

指令还可以指定创建镜像的上下⽂、 Dockerfile路径、 标签、 Shm⼤⼩、 参数和缓存来源等, 例如:

version: '3'
services:
app:
build:
context: /path/to/build/dir
dockerfile: Dockerfile-app
labels:
version: "2.0"
released: "true"
shm_size: '2gb'
args:
key: value
name: myApp
cache_from:
- myApp:1.0

2.cap_add, cap_drop

指定容器的内核能⼒(capacity) 分配。 例如, 让容器拥有所有能⼒可以指定为:

cap_add:
- ALL

去掉NET_ADMIN能⼒可以指定为:

cap_drop:
- NET_ADMIN

3.command

覆盖容器启动后默认执⾏的命令, 可以为字符串格式或JSON数组格式。 例如:

command: echo "hello world"

或者:

command: ["bash", "-c", "echo", "hello world"]

4.configs

在Docker Swarm模式下, 可以通过configs来管理和访问⾮敏感的配置信息。 ⽀持从⽂件读取或外部读取。 例如:

version: "3.3"
services:
app:
image: myApp:1.0
deploy:
replicas: 1
configs:
- file_config
- external_config
configs:
file_config:
file: ./config_file.cfg
external_config:
external: true

5.cgroup_parent

指定⽗cgroup组, 意味着将继承该组的资源限制。 ⽬前不⽀持在Swarm模式中使⽤。 例如, 创建了⼀个cgroup组名称为cgroups_1:

cgroup_parent: cgroups_1

6.container_name

指定容器名称。 默认将会使⽤“项⽬名称_服务名称_序号”这样的格式。 ⽬前不⽀持在Swarm模式中使⽤。 例如:

container_name: docker-web-container

注意, 指定容器名称后, 该服务将⽆法进⾏扩展, 因为Docker不允许多个容器实例重名。

7.devices指定设备映射关系, 不⽀持Swarm模式。 例如:

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

8.depends_on

指定多个服务之间的依赖关系。 启动时, 会先启动被依赖服务。 例

如, 可以指定依赖于db服务:

depends_on: db

9.dns

⾃定义DNS服务器。 可以是⼀个值, 也可以是⼀个列表。 例如:

dns: 8.8.8.8

dns:
- 8.8.8.8
- 9.9.9.9

10.dns_search

配置DNS搜索域。 可以是⼀个值, 也可以是⼀个列表。 例如:

dns_search: example.com
dns_search:
- domain1.example.com
- domain2.example.com

11.dockerfile

如果需要, 指定额外的编译镜像的Dockefile⽂件, 可以通过该指令来指定。 例如:

dockerfile: Dockerfile-alternate

注意:该指令不能跟image同时使⽤, 否则Compose将不知道根据哪个指令来⽣成最终的服务镜像。

12.entrypoint

覆盖容器中默认的⼊⼜命令。 注意, 也会取消掉镜像中指定的⼊⼜命令和默认启动命令。 例如, 覆盖为新的⼊⼜命令:

entrypoint: python app.py

13.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

14.environment

设置环境变量, 可以使⽤数组或字典两种格式。 只给定名称的变量会⾃动获取运⾏Compose主机上对应变量的值, 可以⽤来防⽌泄露不必要的数据。 例如:

environment:
RACK_ENV: developmentSESSION_SECRET:

或者:

environment:
- RACK_ENV=development
- SESSION_SECRET

注意:如果变量名称或者值中⽤到 true | false, yes | no 等表达布尔含义的词汇, 最好放到引号⾥, 避免YAML⾃动解析某些内容为对应的布尔语义:http://yaml.org/type/bool.html中给出了这些特定词汇, 包括

y|Y|yes|Yes|YES|n|N|no|No|NO
|true|True|TRUE|false|False|FALSE
|on|On|ON|off|Off|OFF

15.expose

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

expose:
- "3000"
- "8000"

16.extends

基于其他模板⽂件进⾏扩展。 例如, 我们已经有了⼀个webapp服务,定义⼀个基础模板⽂件为 common.yml, 如下所⽰:

# common.yml
webapp:
build: ./webapp
environment:
- DEBUG=false
- SEND_EMAILS=false

再编写⼀个新的development.yml⽂件, 使⽤common.yml中的webapp服务进⾏扩展:

# development.yml
web:
extends:
file: common.yml
service: webapp
ports:
- "8000:8000"
links:
- db
environment:
- DEBUG=true
db:
image: postgres

后者会⾃动继承 common.yml 中的 webapp 服务及环境变量定义。 使⽤extends需要注意以下两点:

  • 要避免出现循环依赖, 例如A依赖B, B依赖C, C反过来依赖A的情况。
  • extends不会继承 links 和 volumes_from 中定义的容器和数据卷资源。⼀般情况下, 推荐在基础模板中只定义⼀些可以共享的镜像和环境变量, 在扩展模板中具体指定应⽤变量、 链接、 数据卷等信息。

17.external_links

链接到docker-compose.yml外部的容器, 甚⾄并⾮Compose管理的外部容器。 参数格式跟links类似。

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

18.extra_hosts

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

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

会在启动后的服务容器中 /etc/hosts ⽂件中添加如下两条条⽬。

8.8.8.8 googledns
52.1.157.61 dockerhub

19.healthcheck

指定检测应⽤健康状态的机制, 包括检测⽅法(test) 、 间隔(interval) 、 超时(timeout) 、 重试次数(retries) 、 启动等待时间(start_period) 等。例如, 指定检测⽅法为访问8080端口, 间隔为30秒, 超时为15秒, 重试3次, 启动后等待30秒再做检查。

healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080"]
interval: 30s
timeout: 15s
retries: 3
start_period: 30s

20.image

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

image: ubuntu
image: orchardup/postgresql
image: a4bc65fd

21.isolation

配置容器隔离的机制, 包括default、 process 和 hyperv。

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

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

23.links

注意: links命令属于旧的⽤法, 可能在后续版本中被移除。链接到其他服务中的容器。 使⽤服务名称(同时作为别名) 或服务名称: 服务别名(SERVICE: ALIAS) 格式都可以。

links:
- db
- db:database
- redis

使⽤的别名将会⾃动在服务容器中的 /etc/hosts ⾥创建。 例如:

172.17.2.186 db
172.17.2.186 database
172.17.2.187 redis

被链接容器中相应的环境变量也将被创建。

24.logging

跟⽇志相关的配置, 包括⼀系列⼦配置。logging.driver: 类似于 Docker 中的 --log-driver 参数, 指定⽇志驱动类型。 ⽬前⽀持三种⽇志驱动类型:

  • driver: "json-file"
  • driver: "syslog"
  • driver: "none"logging.

options: ⽇志驱动的相关参数。 例如:

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

或:

logging:
driver: "json-file"
options:
max-size: "1000k"
max-file: "20"

25.network_mode

设置⽹络模式。 使⽤和docker client的--net参数⼀样的值。

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

26.networks

所加⼊的⽹络。 需要在顶级的 networks 字段中定义具体的⽹络信息。例如, 指定web服务的⽹络为web_net, 并添加服务在⽹络中别名为web_app。

services:
web:
networks:
web_net:
aliases: web_app
ipv4_address: 172.16.0.10
networks:
web_net:
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
subnet: 172.16.0.0/24

27.pid

跟主机系统共享进程命名空间。 打开该选项的容器之间, 以及容器和宿主机系统之间可以通过进程ID来相互访问和操作。

pid: "host"

28.ports

暴露端口信息。使⽤宿主: 容器(HOST: CONTAINER) 格式, 或者仅仅指定容器的端口(宿主将会随机选择端口) 都可以。

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

或者:

ports:
- target: 80
published: 8080
protocol: tcp
mode: ingress

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

29.secrets

配置应⽤的秘密数据。可以指定来源秘密、 挂载后名称、 权限等。例如:

version: "3.1"
services:
web:
image: webapp:stable
deploy:
replicas: 2
secrets:
- source: web_secret
target: web_secret
uid: '103'
gid: '103'
mode: 0444
secrets:
web_secret:
file: ./web_secret.txt

30.security_opt

指定容器模板标签(label) 机制的默认属性(⽤户、 ⾓⾊、 类型、 级别等) 。例如, 配置标签的⽤户名和⾓⾊名:

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

31.stop_grace_period

指定应⽤停⽌时, 容器的优雅停⽌期限。 过期后则通过SIGKILL强制退出。默认值为10s。

32.stop_signal

指定停⽌容器的信号, 默认为SIGTERM。

33.sysctls配置容器内的内核参数。 Swarm模式中不⽀持。例如, 指定连接数为4096和开启TCP的syncookies:

sysctls:
net.core.somaxconn: 4096
net.ipv4.tcp_syncookies: 1

34.ulimits

指定容器的ulimits限制值。例如, 指定最⼤进程数为65535, 指定⽂件句柄数为20000(软限制,应⽤可以随时修改, 不能超过硬限制) 和40000(系统硬限制, 只能root⽤户提⾼) 。

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

35.userns_mode

指定⽤户命名空间模式。 Swarm模式中不⽀持。 例如, 使⽤主机上的⽤户命名空间:

userns_mode: "host"

36.volumes

数据卷所挂载路径设置。 可以设置宿主机路径(HOST:CONTAINER) 或加上访问模式(HOST: CONTAINER: ro) 。⽀持driver、 driver_opts、 external、 labels、 name等⼦配置。该指令中路径⽀持相对路径。 例如

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

或者可以使⽤更详细的语法格式:

volumes:
- type: volume
source: mydata
target: /data
volume:
nocopy: true
volumes:
mydata:

37.restart

指定重启策略, 可以为no(不重启) 、 always(总是) 、 onfailure(失败时) 、 unless-stopped(除⾮停⽌) 。注意Swarm模式下要使⽤restart_policy。 在⽣产环境中推荐配置为always或者unless-stopped。例如, 配置除⾮停⽌:

restart: unless-stopped

38.deploy

指定部署和运⾏时的容器相关配置。 该命令只在Swarm模式下⽣效,且只⽀持docker stack deploy命令部署。例如:

version: '3'
services:
redis:
image: web:stable
deploy:
replicas: 3
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure

deploy命令中包括 endpoint_mode、 labels、 mode、 placement、replicas、 resources、 restart_policy、 update_config等配置项。

(1) endpoint_mode

指定服务端点模式。 包括两种类型:

  • vip: Swarm分配⼀个前端的虚拟地址, 客户端通过给地址访问服务,⽽⽆须关⼼后端的应⽤容器个数;
  • dnsrr: Swarm分配⼀个域名给服务, ⽤户访问域名时候回按照轮流顺序返回容器地址。

例如:

version: '3'
services:
redis:
image: web:stable
deploy:
mode: replicated
replicas: 3
endpoint_mode: vip

(2) labels

指定服务的标签。 注意标签信息不会影响到服务内的容器。例如:

version: "3"
services:
web:
image: web:stable
deploy:
labels:
description: "This is a web application service."

(3) mode

定义容器副本模式, 可以为:global: 每个Swarm节点上只有⼀个该应⽤容器;replicated: 整个集群中存在指定份数的应⽤容器副本, 默认值。例如, 指定集群中web应⽤保持3个副本:

version: "3"
services:
web:
image: web:stable
deploy:
mode: replicated
replicas: 3

(4) placement

定义容器放置的限制(constraints) 和配置(preferences) 。 限制可以指定只有符合要求的节点上才能运⾏该应⽤容器; 配置可以指定容器的分配策略。 例如, 指定集群中web应⽤容器只存在于⾼安全的节点上, 并且在带有zone标签的节点上均匀分配。

version: '3'
services:
db:
image: web:stable
deploy:
placement:
constraints:
- node.labels.security==high
preferences:
- spread: node.labels.zone

(5) replicas

容器副本模式为默认的replicated时, 指定副本的个数。

(6) resources

指定使⽤资源的限制, 包括CPU、 内存资源等。 例如, 指定应⽤使⽤的CPU份额为10%~25%, 内存为200 MB到500 MB。

version: '3'
services:
redis:
image: web:stable
deploy:
resources:
limits:
cpus: '0.25'
memory: 500M
reservations:
cpus: '0.10'
memory: 200M

(7) restart_policy

指定容器重启的策略。 例如, 指定重启策略为失败时重启, 等待2s,重启最多尝试3次, 检测状态的等待时间为10s。

version: "3"
services:
redis:
image: web:stable
deploy:
restart_policy:
condition: on-failure
delay: 2s
max_attempts: 3
window: 10s

(8) update_config

有些时候需要对容器内容进⾏更新, 可以使⽤该配置指定升级的⾏为。 包括每次升级多少个容器(parallelism) 、 升级的延迟(delay) 、 升级失败后的⾏动(failure_action) 、 检测升级后状态的等待时间(monitor) 、 升级后容忍的最⼤失败⽐(max_failure_ratio) 、 升级顺序(order) 等。 例如, 指定每次更新两个容器、 更新等待10s、 先停⽌旧容器再升级。

version: "3.4"
services:
redis:
image: web:stable
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
order: stop-first

39.其他指令

此外, 还有包括domainname、 hostname、 ipc、 mac_address、privileged、 read_only、 shm_size、 stdin_open、 tty、 user、 working_dir等指令, 基本跟docker-run中对应参数的功能⼀致。 例如, 指定容器中⼯作⽬录:

working_dir: /code

指定容器中搜索域名、 主机名、 mac地址等:

domainname: your_website.com
hostname: test
mac_address: 08-00-27-00-0C-0A

允许容器中运⾏⼀些特权命令:

privileged: true

40.读取环境变量

从1.5.0版本开始, Compose模板⽂件⽀持动态读取主机的系统环境变量。 例如, 下⾯的Compose⽂件将从运⾏它的环境中读取变量${MONGO_VERSION}的值(不指定时则采⽤默认值3.2) , 并写⼊执⾏的指令中。

db:
image: "mongo:${MONGO_VERSION-3.2}"

如果直接执⾏docker-compose up则会启动⼀个mongo: 3.2镜像的容器; 如果执⾏MONGO_VERSION=2.8 docker-compose up 则会启动⼀个mongo: 2.8镜像的容器。

41.扩展特性

从3.4开始, Compose还⽀持⽤户⾃定义的扩展字段。 利⽤YAML语法⾥的锚点引⽤功能来引⽤⾃定义字段内容。 例如:version: '3.4'

x-logging:
&default-logging
options:
max-size: '10m'
max-file: '10'
driver: json-file
services:
web:
image: webapp:stable
logging: *default-logging

docker-compose 命令

docker-compose 命令的格式为:docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...],命令支持以下选项:

  • -f, --file FILE: 指定使⽤的Compose模板⽂件, 默认为dockercompose.yml, 可以多次指定;
  • -p, --project-name NAME: 指定项⽬名称, 默认将使⽤所在⽬录名称作为项⽬名;
  • --verbose: 输出更多调试信息;
  • -v, --version: 打印版本并退出;
  • -H, -host HOST: 指定所操作的Docker服务地址;
  • -tls: 启⽤TLS, 如果指定-tlsverify则默认开启;
  • -tlscacert CA_PATH: 信任的TLS CA的证书;
  • -tlscert CLIENT_CERT_PATH: 客户端使⽤的TLS证书;
  • -tlskey TLS_KEY_PATH: TLS的私钥⽂件路径;
  • -tlsverify: 使⽤TLS校验连接对⽅;·-skip-hostname-check: 不使⽤TLS证书校验对⽅的主机名;
  • -project-directory PATH: 指定⼯作⽬录, 默认为Compose⽂件所在路径。

docker-compose 还支持以下子命令





1.build

格式为docker-compose build [options] [SERVICE...]。构建(重新构建) 项⽬中的服务容器。服务容器⼀旦构建后, 将会带上⼀个标记名, 例如对于Web项⽬中的⼀个db容器, 可能是web_db。可以随时在项⽬⽬录下运⾏docker-compose build来重新构建服务。选项包括:

  • --force-rm: 强制删除构建过程中的临时容器;
  • --no-cache: 构建镜像过程中不使⽤cache(这将加长构建过程) ;
  • --pull: 始终尝试通过pull来获取更新版本的镜像;
  • -m, -memory MEM: 指定创建服务所使⽤的内存限制;
  • -build-arg key=val: 指定服务创建时的参数。

2.bundle

格式为docker-compose bundle [options]。创建⼀个可分发(Distributed Application Bundle, DAB) 的配置包,包括整个服务栈的所有数据, 他⼈可以利⽤该⽂件启动服务栈。⽀持选项包括:

  • -push-images: ⾃动推送镜像到仓库;
  • -o, -output PATH: 配置包的导出路径。

3.config

格式为docker-compose config [options]。校验和查看Compose⽂件的配置信息。⽀持选项包括:

  • -resolve-image-digests: 为镜像添加对应的摘要信息;
  • -q, -quiet: 只检验格式正确与否, 不输出内容;
  • --services: 打印出Compose中所有的服务信息;·-volumes: 打印出Compose中所有的挂载卷信息;

4.down

格式为docker-compose down [options]。停⽌服务栈, 并删除相关资源, 包括容器、 挂载卷、 ⽹络、 创建镜像等。默认情况下只清除所创建的容器和⽹络资源。⽀持选项包括:

  • --rmi type: 指定删除镜像的类型, 包括all(所有镜像) , local(仅本地) ;
  • -v, -volumes: 删除挂载数据卷;
  • --remove-orphans: 清除孤⼉容器, 即未在Compose服务中定义的容器;
  • -t, -timeout TIMEOUT: 指定超时时间, 默认为10s。

5.events

格式为docker-compose events [options] [SERVICE...]。实时监控容器的事件信息。⽀持选项包括 -json: 以Json对象流格式输出事件信息。

6.exec

格式为docker-compose exec [options] [-e KEY=VAL...] SERVICECOMMAND [ARGS...]。在⼀个运⾏中的容器内执⾏给定命令。⽀持选项包括:

  • -d: 在后台运⾏命令;
  • --privileged: 以特权⾓⾊运⾏命令;
  • -u, -user USER: 以给定⽤户⾝份运⾏命令;
  • -T: 不分配TTY伪终端, 默认情况下会打开;
  • --index=index: 当服务有多个容器实例时指定容器索引, 默认为第⼀个;
  • -e, -env KEY=VAL: 设置环境变量。

7.help

获得⼀个命令的帮助。

8.images

格式为docker-compose images [options] [SERVICE...]。列出服务所创建的镜像。⽀持选项为:

  • --q: 仅显⽰镜像的ID。

9.kill

格式为docker-compose kill [options] [SERVICE...]。通过发送SIGKILL信号来强制停⽌服务容器。⽀持通过-s参数来指定发送的信号, 例如通过如下指令发送SIGINT信号。

$ docker-compose kill -s SIGINT

10.logs

格式为docker-compose logs [options] [SERVICE...]。查看服务容器的输出。 默认情况下, docker-compose 将对不同的服务输出使⽤不同的颜⾊来区分。 可以通过 --no-color 来关闭颜⾊。该命令在调试问题的时候⼗分有⽤。⽀持选项为:

  • --no-color: 关闭彩⾊输出;
  • -f, -follow: 持续跟踪输出⽇志消息;
  • --t, -timestamps: 显⽰时间戳信息;
  • --tail="all": 仅显⽰指定⾏数的最新⽇志消息。

11.pause

格式为docker-compose pause [SERVICE...]。暂停⼀个服务容器。

12.port

格式为docker-compose port [options] SERVICE PRIVATE_PORT。打印某个容器端⼜所映射的公共端⼜。选项:

  • --protocol=proto: 指定端⼜协议, tcp(默认值) 或者udp;
  • --index=index: 如果同⼀服务存在多个容器, 指定命令对象容器的序号(默认为1) 。

13.ps

格式为docker-compose ps [options] [SERVICE...]。列出项⽬中⽬前的所有容器。选项包括

  • -q: 只打印容器的ID信息。

14.pull

格式为docker-compose pull [options] [SERVICE...]。拉取服务依赖的镜像。选项包括 --ignore-pull-failures: 忽略拉取镜像过程中的错误。

15.push

格式为docker-compose push [options] [SERVICE...]。推送服务创建的镜像到镜像仓库。选项包括 --ignore-push-failures: 忽略推送镜像过程中的错误。

16.restart

格式为docker-compose restart [options] [SERVICE...]。重启项⽬中的服务。选项包括

  • -t, --timeout TIMEOUT: 指定重启前停⽌容器的超时(默认为10秒) 。

17.rm

格式为docker-compose rm [options] [SERVICE...]。删除所有(停⽌状态的) 服务容器。 推荐先执⾏docker-compose stop命令来停⽌容器。选项:

  • -f, --force: 强制直接删除, 包括⾮停⽌状态的容器。 ⼀般尽量不要使⽤该选项。
  • -v: 删除容器所挂载的数据卷。

18.run

格式为docker-compose run [options] [-p PORT...] [-eKEY=VAL...] SERVICE [COMMAND] [ARGS...]。在指定服务上执⾏⼀个命令。例如:

$ docker-compose run ubuntu ping docker.com

将会启动⼀个ubuntu服务容器, 并执⾏ping docker.com命令。默认情况下, 如果存在关联, 则所有关联的服务将会⾃动被启动, 除⾮这些服务已经在运⾏中。该命令类似启动容器后运⾏指定的命令, 相关卷、 链接等等都将会按照配置⾃动创建。

两个不同点:

  • 给定命令将会覆盖原有的⾃动运⾏命令;
  • 会⾃动创建端口, 以避免冲突。如果不希望⾃动启动关联的容器, 可以使⽤--no-deps选项, 例如
$ docker-compose run --no-deps web python manage.py shell

将不会启动web容器所关联的其他容器。选项:

  • -d: 后台运⾏容器;
  • --name NAME: 为容器指定⼀个名字;·--entrypoint CMD: 覆盖默认的容器启动指令;
  • -e KEY=VAL: 设置环境变量值, 可多次使⽤选项来设置多个环境变量;
  • -u, --user="": 指定运⾏容器的⽤户名或者uid;
  • --no-deps: 不⾃动启动关联的服务容器;
  • --rm: 运⾏命令后⾃动删除容器, d模式下将忽略;
  • -p, --publish=[]: 映射容器端⼜到本地主机;
  • --service-ports: 配置服务端⼜并映射到本地主机;
  • -T: 不分配伪tty, 意味着依赖tty的指令将⽆法运⾏。

19.scale

格式为docker-compose scale [options] [SERVICE=NUM...]。设置指定服务运⾏的容器个数。通过service=num的参数来设置数量。 例如:

$ docker-compose scale web=3 db=2

将启动3个容器运⾏web服务, 2个容器运⾏db服务。⼀般的, 当指定数⽬多于该服务当前实际运⾏容器, 将新创建并启动容器; 反之, 将停⽌容器。选项包括-t, --timeout TIMEOUT: 停⽌容器时候的超时(默认为10秒) 。

20.start

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

21.stop

格式为docker-compose stop [options] [SERVICE...]。停⽌已经处于运⾏状态的容器, 但不删除它。 通过 docker-compose start 可以再次启动这些容器。选项包括

  • -t, --timeout TIMEOUT: 停⽌容器时候的超时(默认为10秒) 。

22.top

格式为docker-compose top [SERVICE...]。显⽰服务栈中正在运⾏的进程信息。

23.unpause

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

24.up

格式为docker-compose up [options] [SERVICE...]。该命令⼗分强⼤, 它将尝试⾃动完成包括构建镜像, (重新) 创建服务, 启动服务, 并关联服务相关容器的⼀系列操作。链接的服务都将会被⾃动启动, 除⾮已经处于运⾏状态。可以说, ⼤部分时候都可以直接通过该命令来启动⼀个项⽬。默认情况, docker-compose up 启动的容器都在前台, 控制台将会同时打印所有容器的输出信息, 可以很⽅便进⾏调试。当通过 Ctrl-C 停⽌命令时, 所有容器将会停⽌。如果使⽤docker-compose up -d, 将会在后台启动并运⾏所有的容器。

⼀般推荐⽣产环境下使⽤该选项。

默认情况, 如果服务容器已经存在, docker-compose up将会尝试停⽌容器, 然后重新创建(保持使⽤volumes-from挂载的卷) , 以保证新启动的服务匹配 docker-compose.yml ⽂件的最新内容。 如果⽤户不希望容器被停⽌并重新创建, 可以使⽤ docker-compose up --no-recreate。 这样将只会启动处于停⽌状态的容器, ⽽忽略已经运⾏的服务。 如果⽤户只想重新部署某个服务, 可以使⽤docker-compose up --no-deps -d <SERVICE_NAME>来重新创建服务并后台停⽌旧服务, 启动新服务, 并不会影响到其所依赖的服务。

选项:

  • -d: 在后台运⾏服务容器;
  • --no-color: 不使⽤颜⾊来区分不同的服务的控制台输出;
  • --no-deps: 不启动服务所链接的容器;
  • --force-recreate: 强制重新创建容器, 不能与--no-recreate同时使⽤;
  • --no-recreate: 如果容器已经存在了, 则不重新创建, 不能与--forcerecreate同时使⽤;
  • --no-build: 不⾃动构建缺失的服务镜像;
  • --abort-on-container-exit: 当有容器停⽌时中⽌整个服务, 与-d选项冲突。
  • -t, --timeout TIMEOUT: 停⽌容器时候的超时(默认为10秒) , 与 -d 选项冲突;
  • --remove-orphans: 删除服务中未定义的孤⼉容器;
  • --exit-code-from SERVICE: 退出时返回指定服务容器的退出符;
  • --scale SERVICE=NUM: 扩展指定服务实例到指定数⽬。

25.version

格式为docker-compose version。打印版本信息。

docker 实践八:docker-compose的更多相关文章

  1. centos7+ docker 实践部署docker及配置direct_lvm

    转载于博客园:http://www.cnblogs.com/Andrew-XinFei/p/6245330.html 前言 Docker现在在后端是那么的火热..尤其当笔者了解了docker是什么.能 ...

  2. Docker实践 - 安装Docker并在容器里运行tomcat

    安装Docker yum install docker 本文使用的系统是centos7,ubuntu使用以下命令 sudo apt-get update sudo apt-get install do ...

  3. Docker(十八)-Docker配置DNS

    Linux系统配置DNS的时候有一个问题,就是你在/ect/resolv.conf文件中添加上nameserver XXX.XXX.XXX.XXX的时候,当时是生效的,但是机器重启之后就失效了,所以我 ...

  4. Docker实践3: Docker常用命令(未完)

    查看容器及运行进程 docker ps 查看容器内部信息 docker inspect container_id 进入容器 docker attach container_id 退出容器 docker ...

  5. Docker实践,来自沪江、滴滴、蘑菇街架构师的交流分享

    架构师小组交流会:每期选一个时下最热门的技术话题进行实践经验分享. 第一期主题:容器实践.Docker 作为当前最具颠覆性的开源技术之一,其轻量虚拟化.可移植性是CI/CD,DevOps,微服务的重要 ...

  6. Docker(四):Docker 三剑客之 Docker Compose

    前两篇文章我们介绍了 Dockerfile 的使用Docker(二):Dockerfile 使用介绍,我们知道使用一个 Dockerfile 模板文件可以定义一个单独的应用容器,如果需要定义多个容器就 ...

  7. Docker 核心技术之Docker Compose

    Docker Compose 简介 Docker Compose是什么? Docker Compose是一个能一次性定义和管理多个Docker容器的工具. 详细地说: Compose中定义和启动的每一 ...

  8. Docker实践之02-使用镜像及定制

    目录 一.获取镜像 二.使用镜像启动容器实例 三.列出镜像 四.删除本地镜像 五.定制镜像 通过commit命令定制镜像 通过Dockerfile定制镜像 docker build的工作原理 dock ...

  9. Docker实践之01-入门介绍

    目录 一.Docker概述 镜像 容器 仓库 二.安装Docker 1.在CentOS上安装Docker 2.在Ubuntu上安装Docker 3.启动docker 4.建立Docker用户组 5.测 ...

随机推荐

  1. 深度学习面试题16:小卷积核级联卷积VS大卷积核卷积

    目录 感受野 多个小卷积核连续卷积和单个大卷积核卷积的作用相同 小卷积核的优势 参考资料 感受野 在卷积神经网络中,感受野(Receptive Field)的定义是卷积神经网络每一层输出的特征图(fe ...

  2. oracle导入提示“IMP-00010:不是有效的导出文件,头部验证失败”的解决方案

    这是由于导出的dmp文件与导入的数据库的版本不同造成的用Notepad++查看了dmp文件,在头部具修改成你将导入目标数据库的版本号以下对应的版本号: 11g R2:V11.02.00 11g R1: ...

  3. 制作 python解释器

    https://www.zhihu.com/tardis/sogou/qus/27286136

  4. transition 滑动动画

    html: <!-- 组件会在 `currentTabComponent` 改变时改变 --> <transition name="slide" mode=&qu ...

  5. vim脚本判断操作系统

    Linux 和 Windows 通用配置 其实在配置文件中是可以通过逻辑代码判断平台做条件处理的,这样就可以实现一个配置文件两个个平台下共用了,判断逻辑如下: " ============= ...

  6. Alternatives to Activiti for all platforms with any license

    Activiti Activiti is a light-weight workflow and Business Process Management (BPM) Platform targeted ...

  7. Dart自定义库、系统库和第三方库

    /* 前面介绍Dart基础知识的时候基本上都是在一个文件里面编写Dart代码的,但实际开发中不可能这么写,模块化很重要,所以这就需要使用到库的概念. 在Dart中,库的使用时通过import关键字引入 ...

  8. window.location.href重定向失败的问题

    如题,在js中通过window.location.href=URL来跳转到另一个页面(也可以是另一个项目的另一个页面). 打开的页面地址是:www.a.com/project1/index 要跳转的页 ...

  9. Python3入门(十三)——常用内置模块之URL模块urlib

    见名知意,一系列用于URL的操作 当然了,主要是用于web爬虫等处理(发送Get/Post请求,处理响应等),暂不展开, 参考:https://www.liaoxuefeng.com/wiki/101 ...

  10. Qt编写气体安全管理系统16-云端同步

    一.前言 云端同步功能是为了后期的拓展做准备的,他的目的就是将本地的数据库中的记录,比如实时采集到的数据以及存储的运行记录等,同步到云端数据库上,默认采用阿里云的mysql数据库,阿里云速度还是挺快的 ...