在我们启动容器的时候经常要使用docker run 指定很多参数,当我们需要管理很多容器时,使用这样的方式会给我们的运维人员带来很大的负担,docker compose容器编排工具无疑是解决这个一问题的利器。

Docker Compose是用来管理多容器应用的工具,我们可以使用compose file 文件来配置容器的应用和服务,编写好compose file 文件以后,我们只需要使用一条简单的命令就可以创建并启动我们需要的应用。

使用compose一般有三个步骤:

1、编写Dockerfile,定义镜像的构建参数。

2、编写docker-compose.yml文件,定义应用的挂载,环境变量,启动参数等。

3、执行 docker-compose up 命令,自动执行构建镜像并启动容器和应用。

安装Compose

这里只介绍Linux环境下的安装。

执行如下命令:

1
curl -L https:
//github
.com
/docker/compose/releases/download/1
.14.0
/docker-compose-
`
uname 
-s`-`
uname 
-m` > 
/usr/local/bin/docker-compose

可以根据的自己的需求安装不同的版本,修改链接中的版本号即可。也可以直接去 上下载需要的版本。

对文件添加执行权限:

1
 
chmod 
+x 
/usr/local/bin/docker-compose

安装完成后,执行compose命令验证是否安装成功:

1
2
3
# docker-compose --version
 
docker-compose version 1.14.0, build c7bdf9e

Compose file 常用语法介绍

compose使用的是YAML格式的文件,我们可以使用它来定义服务、网络和卷。compose file的固定命名为 docker-compose.yml。

这里只列出常用的信息,具体用法参考: 

build: 构建镜像,指定构建的路径,文件,源镜像等信息。

1
2
3
4
5
6
build:
  
context: .             
# 指定Dockerfile的构建路径,或者是一个url的git仓库地址
  
dockerfile: Dockerfile-abcd  
#可以指定Dockerfile的名称,如果不是默认名称时。
  
args:    
#添加构建参数,环境变量参数只能在构建过程中访问,使用时需要先在Dockerfile中定义。
    
- buildno=1  
#yaml语法,‘=’两边不能有空格
    
- password=secret 
#也可以使用列表的方式  'password: secret'

 command: 用于重新覆盖Dockerfile中的COMMAND命令。

1
command
: COMMAND args

也可以使用列表的形式:

1
command
: [
"comand1"
"command2"
]

devices: 映射宿主机的设备到容器中。

1
2
devices:
  
"/dev/ttyUSB0:/dev/ttyUSB0"

depends_on: 执行此模块的行为时,所依赖的其他模块必须已经完成。

1
2
3
4
5
6
7
8
9
10
services:
  
web:
    
build: .
    
depends_on:
      
- db
      
- redis
  
redis:
    
image: redis
  
db:
    
image: postgres

dns: 指定dns.

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

env_file: 从文件中添加环境变量参数。如果您使用docker-compose -f FILE指定了一个Compose文件,则env_file中的路径与文件所在的目录相关。

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

expose:暴露端口而不将它们发布到主机 - 它们只能被链接服务访问。 只能指定内部端口。

1
2
3
expose:
 
"3000"
 
"8000"

image: 指定要从中启动容器的镜像,可以是存储库/标签或部分映像ID,如果有指定build行为,会自动为新构建的镜像打上此标签和命名(默认的v1 版本中build和image关键字不能同时存在,需要指定v2 或v3版本)。

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

links: 链接到另一个服务中的容器。 请同时指定服务名称和链接别名(SERVICE:ALIAS),或仅指定服务名称。

logging: 日志服务。支持三种日志驱动,json-file, syslog, none. 默认的为json-file.

1
2
3
4
logging:
  
driver: syslog
  
options:
    
syslog-address: 
"tcp://192.168.0.42:123"
1
2
3
4
5
6
7
8
services:
  
some-service:
    
image: some-service
    
logging:
      
driver: 
"json-file"
      
options:
        
max-size: 
"200k"    
# 日志文件最大不超过200K
        
max-
file
"10"      
# 日志文件最多不超过10个

network_mode: 指定网络模式。与使用docker 命令的-net参数一样。

1
2
3
network_mode: 
"bridge"
network_mode: 
"host"
network_mode: 
"none"

networks: 指定所要加入的网络。

IPV4_ADDRESS:指定加入这个网络的IP地址。

1
2
3
4
5
services:
  
some-service:
    
networks:
     
- some-network
     
- other-network
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
services:
  
app:
    
image: busybox
    
command
ifconfig
    
networks:
      
app_net:
        
ipv4_address: 172.16.238.10
        
ipv6_address: 2001:3984:3989::10
networks:
  
app_net:
    
driver: bridge
    
enable_ipv6: 
true
    
ipam:
      
driver: default
      
config:
      
-
        
subnet: 172.16.238.0
/24
      
-
        
subnet: 2001:3984:3989::
/64

ports: 对外开放的端口。

短语法模式:

1
2
3
4
5
6
7
8
9
ports:
 
"3000"
 
"3000-3005"
 
"8000:8000"
 
"9090-9091:8080-8081"
 
"49100:22"
 
"127.0.0.1:8001:8001"
 
"127.0.0.1:5000-5010:5000-5010"
 
"6060:6060/udp"

长语法模式(版本v3.2):

target:容器内部端口

published:对外暴露的端口

protocol:协议类型

mode:  host 用于在每个节点上发布主机端口的主机,或将要进行负载均衡的群模式端口的入口。

1
2
3
4
5
ports:
  
- target: 80
    
published: 8080
    
protocol: tcp
    
mode: host

vlumes: 挂载宿主机目录,或命名卷。

短语法:

1
2
3
4
5
6
7
8
9
10
11
volumes:
  
# Just specify a path and let the Engine create a volume
  
/var/lib/mysql
  
# Specify an absolute path mapping
  
/opt/data
:
/var/lib/mysql
  
# Path on the host, relative to the Compose file
  
- .
/cache
:
/tmp/cache
  
# User-relative path
  
- ~
/configs
:
/etc/configs/
:ro
  
# Named volume
  
- datavolume:
/var/lib/mysql

长语法(v3.2):

1
2
3
4
5
6
7
8
9
volumes:
  
type
: volume
    
source
: mydata
    
target: 
/data
    
volume:
      
nocopy: 
true
  
type
: bind
    
source
: .
/static
    
target: 
/opt/app/static

restart: 定义自启动。

1
2
3
4
restart: 
"no"
restart: always
restart: on-failure
restart: unless-stopped

domainname, hostname, ipc, mac_address, privileged, read_only, shm_size, stdin_open, tty, user, working_dir: 指定属性。 与使用docker run 指定参数功能一样。

1
2
3
4
5
6
7
8
9
10
11
user: postgresql
working_dir: 
/code
domainname: foo.com
hostname
: foo
ipc: host
mac_address: 02:42:ac:11:65:43
privileged: 
true
read_only: 
true
shm_size: 64M
stdin_open: 
true
tty
true

使用compose制作nginx-web容器

这里用一个简单的示例说明docker-compose file的用法。

安装好docker以及docker-compose,从官方下载centos镜像:

1
docker pull centos

1、选择一个构建目录,创建Dockerfile:

1
2
3
4
mkdir 
web
cd 
web
mkdir 
log       
# 用于挂载容器的日志目录
vim Dockerfile

Dockerfile 内容:

1
2
3
4
5
6
7
8
FROM centos
MAINTAINER trying tryingstuff@163.com
RUN rpm -ivh http:
//mirrors
.aliyun.com
/epel/epel-release-latest-7
.noarch.rpm
RUN yum 
install 
nginx -y
RUN 
sed 
-i 
'N;6adaemon off;' 
/etc/nginx/nginx
.conf
ADD index.html 
/usr/share/nginx/html/index
.html
EXPOSE 80
CMD [
"nginx"
]

修改默认的nginx.conf配置为daemon off,具体的原因可参考之前的

添加index.html文件:

1
echo 
"this is Compose test!" 
> index.html

2、创建docker-compose.yml

1
vim docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
version: 
'2'
services:
  
web-nginx:
    
build: .
    
image: trying
/nginx-com
:v1 
    
ports:
     
"80:80"
    
volumes:
     
- .
/log
:
/var/log/nginx
    
container_name: web-compose
    
command
: [
"nginx"
]

文件说明:

a. 指定compose版本为v2,建议使用v2 或v3版本,如果不指定,默认会使用v1版本,语法会不兼容。

b. web-nginx定义了服务的名称,如果没有后面image参数指定,镜像名称会默认以 当前路径_服务名 命名如(web_web-nginx)。

c. build: . 表示构建路径为当前路径。

d. image 指定了构建之后的镜像名称,如果没有build行为,则表示当前镜像库中已有的镜像。

e. ports 表示映射端口 宿主机端口:容器端口

f. volumes表示容器挂载的宿主机目录。 

3、在当前目录运行docker-compose命令, 如果不使用-d 选项,compose运行之后会一直驻留在前台,终止compose后容器也会停止。

1
 
docker-compose up -d

4、构建完成后,查看镜像:

1
2
3
4
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
trying
/nginx-com    
v1                  ec2f0106598a        21 minutes ago      401 MB
centos              latest              36540f359ca3        13 days ago         193 MB

查看容器:

1
2
3
# docker ps
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                NAMES
eac73ff1bbef        trying
/nginx-com
:v1   
"nginx"             
22 minutes ago      Up 22 minutes       0.0.0.0:80->80
/tcp   
web-compose

查看服务状态(另一台主机上使用curl):

1
2
# curl 192.168.60.18
this is Compose 
test
!

查看宿主机日志:

1
2
# cat log/access.log 
192.168.60.19 - - [19
/Jul/2017
:05:16:38 +0000] 
"GET / HTTP/1.1" 
200 29 
"-" 
"curl/7.29.0" 
"-"

Dockerfile和docer compose支持的参数远不止这些,这里只是介绍了常用的很小一部分,更多具体的内容可以参考刚放文档。