0%

Docker-compose 学习

引子

Docker-Compose 属于Docker的一个工具

Docker-compose 安装

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

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

直接执行

1
yum install -y python-pip

没有python-pip包就执行命令

1
yum install -y epel-release

执行成功之后,再次执行

1
yum install -y python-pip

对安装好的pip进行升级

1
2
3
pip install --upgrade pip 

使用镜像

pip install —upgrade pip -i http://pypi.douban.com/simple —trusted-host pypi.douban.com

1
2
3

最后安装


pip install docker-compose
1
2

使用镜像

pip install docker-compose -i http://pypi.douban.com/simple —trusted-host pypi.douban.com
1
2
3
4
## Docker-compose 学习

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


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

[参考](https://docs.docker.com/compose/install/ ) 。你能运行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}

参考


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

1
2
3
4
5
6
7
8
9

### Composer Version
composer 文件格式有两种版本:

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

### Service配置

services:
web:
image: hello-world

1
2
3
4

#### build

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

build: /path/to/build/dir

1
2
3
4

#### command

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

command: bundle exec thin -p 3000
1
2
3
4

#### links

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

links:

  • db
  • db:database
  • redis
    1
    2
    3
    4
    5
    6
    7
    8
    使用的别名将会自动在服务容器中的 /etc/hosts 里创建。例如:
    172.17.2.186 db
    相应的环境变量也将被创建。

    #### external_links

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

    external_links:
  • redis_1
  • project_db_1:mysql
  • project_db_1:postgresql
    1
    2
    3

    #### ports

  • “3000”
  • “8000:8000”
  • “127.0.0.1:8001:8001”
    1
    2
    3
    4
    5
    6
    7
    8

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


    #### expose

    暴露端口,但不映射到宿主机,只被连接的服务访问。
    仅可以指定内部端口为参数
    expose:
  • “3000”
  • “8000”
    1
    2
    3
    4
    5

    #### volumes

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

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

    #### volumes

    从另一个服务或容器挂载它的所有卷。
    volumes_from:
  • service_name
  • container_name
    1
    2
    3
    4
    5
    6

    #### environment

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

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

    #### env_file

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

    env_file: .env
    env_file:
  • ./common.env
  • ./apps/web.env
  • /opt/secrets.env
    1
    2
    3

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

    common.env: Set Rails/Rack environment

    RACK_ENV=development
    1
    2
    3
    4
    5

    #### extends

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

    common.yml

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

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

    development.yml

    web:
    extends:
    file: common.yml
    service: webapp
    ports:
    \ - “8000:8000”
    links:
    \ - db
    environment:
  • DEBUG=true
    db:
    image: postgres
    1
    2
    3
    4
    5
    6
    7

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

    #### net

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

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

    #### pid

    跟主机系统共享进程命名空间。打开该选项的容器可以相互通过进程 ID 来访问和操作。
    pid: “host”
    1
    2
    3
    4
    5

    #### dns

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

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

    #### cap_add, cap_drop

    添加或放弃容器的 Linux 能力(Capabiliity)。
    cap_add:
  • ALL
    cap_drop:
  • NET_ADMIN
  • SYS_ADMIN
    1
    2
    3
    4
    5

    #### dns_search

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

    dns_search: example.com
    dns_search:
  • domain1.example.com
    \ - domain2.example.com
1
2
3
4
5
6
7

#### 更多

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

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

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

Docker系列

欢迎关注我的其它发布渠道