一.Compose介绍

Docker Compose是一个用来定义和运行复杂应用的Docker工具。一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose不再需要使用shell脚本来启动容器。 
Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景

二.Compose和Docker兼容性

compose文件格式版本

docker版本

3.4

17.09.0+

3.3

17.06.0+

3.2

17.04.0+

3.1

1.13.1+

3.0

1.13.0+

2.3

17.06.0+

2.2

1.13.0+

2.1

1.12.0+

2.0

1.10.0+

1.0

1.9.1.+

Docker版本变化说明:

Docker从1.13.x版本开始,版本分为企业版EE和社区版CE,版本号也改为按照时间线来发布,比如17.03就是2017年3月。

Docker的linux发行版的软件仓库从以前的https://apt.dockerproject.org和https://yum.dockerproject.org变更为目前的https://download.docker.com, 软件包名字改为docker-ce和docker-ee。

三.安装docker-compose

1.从github上下载docker-compose二进制文件安装

下载最新版的docker-compose文件 
sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

若是github访问太慢,可以用daocloud下载
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

添加可执行权限
 chmod +x /usr/local/bin/docker-compose



测试安装结果
$ docker-compose --version
 
docker-compose version 1.16.1, build 1719ceb




上面是 官方推荐安装
也可以使用 yum安装

yum install -y docker-compose

四.docker compose模板

version:'版本号'
services:
  服务名称1:
    image:镜像名称
    container_name:容器名称
    environment:
      - 环境变量1=值1
      - 环境变量2=值2
    volumes:
      - 宿主机数据目录:容器内数据目录
    ports:
      -宿主机端口:容器内映射的端口
    networks:
      - 自定义网络名称
    links:
      - namenode
    command
      -数据库字使用字符集变量时可以使用
    restart: always
  
  服务名称2:
    image:镜像名称
    container_name:容器名称
    environment:
      - 环境变量1:值1
      - 环境变量2:值2
    user:宿主机用户:容器用户
    volumes:
      - 宿主机数据目录:容器内数据目录
    ports:
      -宿主机端口:容器内映射的端口
    networks:
      - 自定义网络名称
    networks:
      - 自定义网络名称
    links:
      - namenode 
    depends_on:
      - 依赖服务
    restart: always
    networks:
     default:
     externnal: true
     name: 自定义网络名称


 wordpress:
 depends_on:
 - db
 image: wordpress:latest
 volumes:
 - /data/web_data:/var/www/html
 ports:
 - "80:80"

 restart: always
 environment:
 WORDPRESS_DB_HOST: db
 WORDPRESS_DB_USER: wordpress
 WORDPRESS_DB_PASSWORD: wordpress

五.实践

mkdir  my_wordpress
cd my_wordpress/

vi docker-compose.yml
version: '3'
services:
 db:
 image: mysql:5.7
 volumes:
 - /data/db_data:/var/lib/mysql
 restart: always
 environment: MYSQL_ROOT_PASSWORD: somewordpress
 MYSQL_DATABASE: wordpress
 MYSQL_USER: wordpress
 MYSQL_PASSWORD: wordpress
 wordpress:
 depends_on:
 - db
 image: wordpress:latest
 volumes:
 - /data/web_data:/var/www/html
 ports:
 - "80:80"
 restart: always
 environment:
 WORDPRESS_DB_HOST: db
 WORDPRESS_DB_USER: wordpress
 WORDPRESS_DB_PASSWORD: wordpress



#启动
docker-compose up

#后台启动
docker-compose up -d

#查看进程
docker-compose ps

#删除
docker-compose rm

#指定文件启动
docker-compose -f filename.yml

六.参数详解

1build

介绍:
build 可以指定包含构建上下文的路径:

实例:
version: '2'
services:
  webapp:
    build: ./dir

2.image

介绍:
指定启动容器的镜像,可以是镜像仓库/标签或者镜像id(或者id的前一部分)


实例:
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd


注意:
如果镜像不存在,Compose将尝试从官方镜像仓库将其pull下来,如果你还指定了build,在这种情况下,它将使用指定的build选项构建它,并使用image指定的名字和标记对其进行标记。

3.container_name

介绍:
指定一个自定义容器名称,而不是生成的默认名称。


实例:
container_name: my-web-container

注意:
由于Docker容器名称必须是唯一的,因此如果指定了自定义名称,则无法将服务扩展到多个容器。

4.volumes

介绍:
卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro),挂载数据卷的默认权限是读写(rw),可以通过ro指定为只读。 
你可以在主机上挂载相对路径,该路径将相对于当前正在使用的Compose配置文件的目录进行扩展

实例:

version: "3"
 
services:
  db:
    image: db
    volumes:
      - data-volume:/var/lib/db
  backup:
    image: backup-service
    volumes:
      - data-volume:/var/lib/backup/data
 
volumes:
  data-volume


————————————————————————————————

volumes:
  # 只需指定一个路径,让引擎创建一个卷
  - /var/lib/mysql
  # 指定绝对路径映射
  - /opt/data:/var/lib/mysql
  # 相对于当前compose文件的相对路径
  - ./cache:/tmp/cache
  # 用户家目录相对路径
  - ~/configs:/etc/configs/:ro
  # 命名卷
  - datavolume:/var/lib/mysql



注意:
通过顶级volumes定义一个挂载卷,并从每个服务的卷列表中引用它, 这会替换早期版本的Compose文件格式中volumes_from。

5.command

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

实例:
command: bundle exec thin -p 3000


注意:
该命令也可以是一个类似于dockerfile的列表:
command: ["bundle", "exec", "thin", "-p", "3000"]

6.links

介绍:
链接到另一个服务中的容器。 请指定服务名称和链接别名

实例:

web:
  links:
   - db
   - db:database
   - redis

注意:
在当前的web服务的容器中可以通过链接的db服务的别名database访问db容器中的数据库应用,如果没有指定别名,则可直接使用服务名访问。
links也可以起到和depends_on相似的功能,即定义服务之间的依赖关系,从而确定服务启动的顺序

7.external_links

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

实例:
external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

#注意
很少用到  反正我是没用过 这个也是看官网知道这么用

8.expose

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

实例:
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中ports的长格式的语法允许配置不能用短格式表示的附加字段。
长格式:
ports:
  - target: 80
    published: 8080
    protocol: tcp
    mode: host


target:容器内的端口 
published:物理主机的端口 
protocol:端口协议(tcp或udp) 
mode:host 和ingress 两总模式,host用于在每个节点上发布主机端口,ingress 用于被负载平衡的swarm模式端口。


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

9.restart

介绍:
no是默认的重启策略,在任何情况下都不会重启容器。 指定为always时,容器总是重新启动。 如果退出代码指示出现故障错误,则on-failure将重新启动容器。

实例:
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

10.environment

介绍:
添加环境变量。 你可以使用数组或字典两种形式。 任何布尔值; true,false,yes,no需要用引号括起来,以确保它们不被YML解析器转换为True或False。 
只给定名称的变量会自动获取它在 Compose 主机上的值,可以用来防止泄露不必要的数据。

实例:
environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:
 
environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET
注意:
如果你的服务指定了build选项,那么在构建过程中通过environment定义的环境变量将不会起作用。 将使用build的args子选项来定义构建时的环境变量。

11.pid

介绍:
将PID模式设置为主机PID模式。 这就打开了容器与主机操作系统之间的共享PID地址空间。 使用此标志启动的容器将能够访问和操作裸机的命名空间中的其他容器,反之亦然。即打开该选项的容器可以相互通过进程 ID 来访问和操作。

实例:
pid: "host"

12.dns

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

实例:
dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9