Docker-compose 学习

引子

Docker-Compose 属于Docker的一个工具

Docker-compose 安装

安装它的前提是要安装pip工具.

首先检查Linux有没有安装Python-pip包

直接执行

1
yum install python-pip

没有python-pip包就执行命令

1
yum -y install epel-release

执行成功之后,再次执行

1
yum install python-pip

对安装好的pip进行升级

1
pip install --upgrade pip

最后安装

1
pip install docker-compose

Docker-compose 学习

一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose,不再需要使用shell脚本来启动容器。在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器。完整的命令列表如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
build 构建或重建服务
help 命令帮助
kill 杀掉容器
logs 显示容器的输出内容
port 打印绑定的开放端口
ps 显示容器
pull 拉取服务镜像
restart 重启服务
rm 删除停止的容器
run 运行一个一次性命令
scale 设置服务的容器数目
start 开启服务
stop 停止服务
up 创建并启动容器

参考 。你能运行Compose在OSX和64位Linux。当前不支持Windows操作系统。

配置文件 docker-compose.yml

Compose 文件是一个 YAML , 主要定义了 services , networks 和 volumes , 其默认路径是 ./docker-compose.yml 。

service 定义包含了应用与每个容器的配置,很像给 docker run 传参,同样, network 和 volume 对于 docker network create 和 docker volume create 也类似。

像在 Dockerfile (eg: CMD , EXPOSE , VOLUME , ENV )可以使用的选项也可以在 docker run 参数中使用, 这样在 docker-compose.yml 里就不需要再次指定了。

docker-compose.yml 里可以使用环境变量,类似 Bash 格式 ${VARIABLE}

参考

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

Composer Version

composer 文件格式有两种版本:

  • version 1: 已经废弃,
  • version 2: 推荐的格式,目前是最新的,需要通过 version ‘2’ 指定。

Service配置

1
2
3
services:
web:
image: hello-world

build

指定 Dockerfile 所在文件夹的路径。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。

1
build: /path/to/build/dir

command

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

1
command: bundle exec thin -p 3000

链接到其它服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名 (SERVICE:ALIAS) 格式都可以。

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

使用的别名将会自动在服务容器中的 /etc/hosts 里创建。例如:
172.17.2.186 db
相应的环境变量也将被创建。

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

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

ports

1
2
3
- "3000"
- "8000:8000"
- "127.0.0.1:8001:8001"

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

expose

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

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

volumes

卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。

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

volumes

从另一个服务或容器挂载它的所有卷。

1
2
3
volumes_from:
- service_name
- container_name

environment

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

1
2
3
environment:
- RACK_ENV=development
- SESSION_SECRET

env_file

从文件中获取环境变量,可以为单独的文件路径或列表。
如果通过 docker-compose -f FILE 指定了模板文件,则 env_file 中路径会基于模板文件路径。
如果有变量名称与 environment 指令冲突,则以后者为准。

1
2
3
4
5
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env

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

1
2
# common.env: Set Rails/Rack environment
RACK_ENV=development

extends

基于已有的服务进行扩展。例如我们已经有了一个 webapp 服务,模板文件为 common.yml。

1
2
3
4
5
6
# common.yml
webapp:
build: ./webapp
environment:
\ - DEBUG=false
\ - SEND_EMAILS=false

编写一个新的 development.yml 文件,使用 common.yml 中的 webapp 服务进行扩展。

development.yml

1
2
3
4
5
6
7
8
9
10
11
12
web:
extends:
file: common.yml
service: webapp
ports:
\ - "8000:8000"
links:
\ - db
environment:
- DEBUG=true
db:
image: postgres

后者会自动继承 common.yml 中的 webapp 服务及相关环节变量。

net

设置网络模式。使用和 docker client 的 –net 参数一样的值。

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

pid

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

1
pid: "host"

dns

配置 DNS 服务器。可以是一个值,也可以是一个列表。

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

cap_add, cap_drop

添加或放弃容器的 Linux 能力(Capabiliity)。

1
2
3
4
5
cap_add:
- ALL
cap_drop:
- NET_ADMIN
- SYS_ADMIN

配置 DNS 搜索域。可以是一个值,也可以是一个列表。

1
2
3
4
dns_search: example.com
dns_search:
- domain1.example.com
\ - domain2.example.com

更多

working_dir, entrypoint, user, hostname, domainname, mem_limit, privileged, restart, stdin_open, tty, cpu_shares

这些都是和 docker run 支持的选项类似。

1
2
3
4
5
6
7
8
9
10
11
cpu_shares: 73
working_dir: /code
entrypoint: /code/entrypoint.sh
user: postgresql
hostname: foo
domainname: foo.com
mem_limit: 1000000000
privileged: true
restart: always
stdin_open: true
tty: true