Docker-Compose 使用方法

安装方法

1
2
3
4
yum install python-pip -y
pip install docker-compose
# docker-compose -v
docker-compose version 1.8.1, build 878cff1

命令简介

Compose区分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1没有声明版本默认是”version 1”。Version 1将来会被弃用。
版本1指的是忽略version关键字的版本;版本2必须在行首添加version: ‘2’。

docker-compose 命令行工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# docker-compose
Define and run multi-container applications with Docker.

Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help

Options:
-f, --file FILE Specify an alternate compose file (default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name (default: directory name)
--verbose Show more output
-v, --version Print version and exit
-H, --host HOST Daemon socket to connect to

--tls Use TLS; implied by --tlsverify
--tlscacert CA_PATH Trust certs signed only by this CA
--tlscert CLIENT_CERT_PATH Path to TLS certificate file
--tlskey TLS_KEY_PATH Path to TLS key file
--tlsverify Use TLS and verify the remote
--skip-hostname-check Don't check the daemon's hostname against the name specified
in the client certificate (for example if your docker host
is an IP address)

Commands:
build Build or rebuild services
bundle Generate a Docker bundle from the Compose file
config Validate and view the compose file
create Create services
down Stop and remove containers, networks, images, and volumes
events Receive real time events from containers
exec Execute a command in a running container
help Get help on a command
kill Kill containers
logs View output from containers
pause Pause services
port Print the public port for a port binding
ps List containers
pull Pulls service images
push Push service images
restart Restart services
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
unpause Unpause services
up Create and start containers
version Show the Docker-Compose version information
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
### 启动容器(默认是前台启动,并打印日志)默认情况,如果该服务的容器已经存在, docker-compose up 将会停止并尝试重新创建他们(保持使用 volumes-from 挂载的卷),以保证 docker-compose.yml 的修改生效。如果你不想容器被停止并重新创建,可以使用 docker-compose up --no-recreate。如果需要的话,这样将会启动已经停止的容器。
docker-compose up
Creating kafka_zk_1
Creating kafka_kafka_1

### 如果想后台运行:
docker-compose up -d

### 查看状态:
docker-compose ps

### 停止服务:
docker-compose stop
Stopping kafka_kafka_1 ... done
Stopping kafka_zk_1 ... done

###重新启动服务:
docker-compose restart


build 构建或重新构建服务。服务一旦构建后,将会带上一个标记名,例如 web_db。可以随时在项目目录下运行 docker-compose build 来重新构建服务。

help 获得一个命令的帮助。

kill 通过发送 SIGKILL 信号来强制停止服务容器。支持通过参数来指定发送的信号,例如 $ docker-compose kill -s SIGINT

logs 查看服务的输出。

port 打印绑定的公共端口。

ps 列出所有容器。

pull 拉取服务镜像。

rm 删除停止的服务容器。

run 在一个服务上执行一个命令。

scale 设置同一个服务运行的容器个数。例如:$ docker-compose scale web=2 worker=3

docker-compose.yml 配置文件解释

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

image

指定镜像tag或者镜像ID。示例:

1
2
3
4
5
image: kafka
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd

注意,在version 1里同时使用image和build是不允许的,version 2则可以,如果同时指定了两者,会将build出来的镜像打上名为image标签。

build

用来指定一个包含Dockerfile文件的路径。一般是当前目录.。Fig将build并生成一个随机命名的镜像。

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

1
2
3
4
5
6
7
8

build: ./dir

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

context \ arg

context为路径,dockerfile为需要替换默认docker-compose的文件名,args为构建(build)过程中的环境变量,用于替换Dockerfile里定义的ARG参数,容器中不可用。示例:

1
2
3
4
5
6
7
8
Dockerfile:

ARG buildno
ARG password

RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"

1
2
3
4
5
6
7
8
9
10
11
12
13
docker-compose.yml:

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

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

command

用来覆盖缺省命令。示例:

1
2
3
4
command: bundle exec thin -p 3000
command也支持数组形式:

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

用于链接另一容器服务,如需要使用到另一容器的mysql服务。可以给出服务名和别名;也可以仅给出服务名,这样别名将和服务名相同。同docker run –link。示例:

1
2
3
4
links:
- db
- db:mysql
- redis

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

1
2
3
172.17.2.186  db
172.17.2.186 mysql
172.17.2.187 redis

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

ports

用于暴露端口。同docker run -p。示例:

1
2
3
4
5
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"

expose

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

1
2
3
expose:
- "3000"
- "8000"

volumes

挂载数据卷。同docker run -v。示例:

1
2
3
4
5
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
volumes_from

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

1
2
3
4
5
6
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
container:container_name格式仅支持version 2。

environment

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

1
2
3
4
5
6
7
environment:
RACK_ENV: development
SESSION_SECRET:

environment:
- RACK_ENV=development
- SESSION_SECRET

depends_on

用于指定服务依赖,一般是mysql、redis等。
指定了依赖,将会优先于服务创建并启动依赖。

links也可以指定依赖。

链接搭配docker-compose.yml文件或者Compose之外定义的服务,通常是提供共享或公共服务。格式与links相似:

1
2
3
4
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql

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

extra_hosts

添加主机名映射。

1
2
3
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"

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

1
2
162.242.195.82  somehost
50.31.209.229 otherhost

extends

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

1
2
3
extends:
file: common.yml
service: webapp

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

net

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

1
2
3
4
net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"

dns

自定义dns服务器。

1
2
3
4
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9

其他参数

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。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
mem_limit: 128M
memswap_limit: 2000000000
privileged: true

restart: always

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

例如:

$ docker-compose run ubuntu ping docker.com
将会启动一个 ubuntu 服务,执行 ping docker.com 命令。

默认情况下,所有关联的服务将会自动被启动,除非这些服务已经在运行中。

该命令类似启动容器后运行指定的命令,相关卷、链接等等都将会按照期望创建。

两个不同点:

给定命令将会覆盖原有的自动运行命令;
不会自动创建端口,以避免冲突。
如果不希望自动启动关联的容器,可以使用 –no-deps 选项,例如

$ docker-compose run –no-deps web python manage.py shell
将不会启动 web 容器所关联的其它容器。

实战演示

1、定义Dockerfile,方便迁移到任何地方;
2、编写docker-compose.yml文件;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
zk:
image: kafka:v1
net: host
stdin_open: true
tty: true
expose:
- "2181"
command: bin/zookeeper-server-start.sh config/zookeeper.properties
kafka:
image: kafka:v1
net: host
stdin_open: true
tty: true
ports:
- "9092:9092"
command: bin/kafka-server-start.sh config/server.properties

3、运行docker-compose up启动服务

1
2
3
4
[root@linux kafka]# docker-compose up -d
Creating kafka_zk_1
Creating kafka_kafka_1

4、查看运行的服务

1
2
3
4
5
6
[root@linux kafka]# docker-compose ps
Name Command State Ports
--------------------------------------------------------------
kafka_kafka_1 bin/kafka-server-start.sh ... Up
kafka_zk_1 bin/zookeeper-server-start ... Up
[root@linux kafka]#

停止服务

1
2
docker stop kafka_kafka_1
docker stop kafka_zk_1

删除服务

1
docker-compose rm zk kafka