在我们启动容器的时候经常要使用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支持的参数远不止这些,这里只是介绍了常用的很小一部分,更多具体的内容可以参考刚放文档。