docker-compose

docker-compose是什么?

Compose 是一个用户定义和运行多个容器的 Docker 应用程序。在 Compose 中你可以使用 YAML 文件来配置你的应用服务。然后,只需要一个简单的命令,就可以创建并启动你配置的所有服务。
通俗地说就是大家都懂PHP的composer包管理器吧。就是执行一个命令,就能帮我们按需加载指定的包。这里我理解的就是我们写完命令以后,一键运行我们的容器。

安装docker-compose

#安装前建议去 https://github.com/docker/compose/releases 这里检查一下最新版本
sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
#给docker-compose执行权限
sudo chmod +x /usr/local/bin/docker-compose
#测试
docker-compose --version
显示docker-compose version 1.21.0, build 1719ceb表示安装成功

编写docker-compose.yml文件(以下是例子)

version: "2"

services:
  master:
    image: singularities/spark
    command: start-spark master
    hostname: master
    ports:
      - "6066:6066"
      - "7070:7070"
      - "8080:8080"
      - "50070:50070"
  worker:
    image: singularities/spark
    command: start-spark worker master
    environment:
      SPARK_WORKER_CORES: 1
      SPARK_WORKER_MEMORY: 2g
    links:
      - master

运行以及常见的docker-compose的命令

docker-compose up运行编写的命令

docker-compose run 命令允许你为你的应用程序运行一次性命令。

docker-compose stop 运行完成后停止服务

docker-compose down --volumes 停掉所有一切,使用 down 命令完全移除容器。传递 —volumes 还可以删除容器使用过程中所使用的数据卷

compose一些语法解释

每个docker-compose.yml必须定义image或者build中的一个,其它的是可选的。

image

指定镜像tag或者ID。示例:

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
注意,在version 1里同时使用image和build是不允许的,version 2则可以,如果同时指定了两者,会将build出来的镜像打上名为image标签。

build

用来指定一个包含Dockerfile文件的路径。一般是当前目录.。Fig将build并生成一个随机命名的镜像。

注意,在version 1里bulid仅支持值为字符串。version 2里支持对象格式。

build: ./dir

build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
context为路径,dockerfile为需要替换默认docker-compose的文件名,args为构建(build)过程中的环境变量,用于替换Dockerfile里定义的ARG参数,容器中不可用。示例:

Dockerfile:

ARG buildno
ARG password

RUN echo “Build number: buildnoRUNscriptrequiringpassword.sh password”
docker-compose.yml:

build:
context: .
args:
buildno: 1
password: secret

build:
context: .
args:
- buildno=1
- password=secret

command

用来覆盖缺省命令。示例:

command: bundle exec thin -p 3000
command也支持数组形式:

command: [bundle, exec, thin, -p, 3000]

links

用于链接另一容器服务,如需要使用到另一容器的mysql服务。可以给出服务名和别名;也可以仅给出服务名,这样别名将和服务名相同。同docker run –link。示例:

links:
- db
- db:mysql
- redis
使用了别名将自动会在容器的/etc/hosts文件里创建相应记录:

172.17.2.186 db
172.17.2.186 mysql
172.17.2.187 redis
所以我们在容器里就可以直接使用别名作为服务的主机名。

ports

用于暴露端口。同docker run -p。示例:

ports:
- “3000”
- “8000:8000”
- “49100:22”
- “127.0.0.1:8001:8001”

expose

expose提供container之间的端口访问,不会暴露给主机使用。同docker run –expose。

expose:
- “3000”
- “8000”

volumes

挂载数据卷。同docker run -v。示例:

volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro

volumes_from

挂载数据卷容器,挂载是容器。同docker run –volumes-from。示例:

volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
container:container_name格式仅支持version 2。

environment

添加环境变量。同docker run -e。可以是数组或者字典格式:

environment:
RACK_ENV: development
SESSION_SECRET:

environment:
- RACK_ENV=development
- SESSION_SECRET

depends_on

用于指定服务依赖,一般是mysql、redis等。
指定了依赖,将会优先于服务创建并启动依赖。

links也可以指定依赖。

external_links

链接搭配docker-compose.yml文件或者Compose之外定义的服务,通常是提供共享或公共服务。格式与links相似:

external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
注意,external_links链接的服务与当前服务必须是同一个网络环境。

extra_hosts

添加主机名映射。

extra_hosts:
- “somehost:162.242.195.82”
- “otherhost:50.31.209.229”
将会在/etc/hosts创建记录:

162.242.195.82 somehost
50.31.209.229 otherhost

extends

继承自当前yml文件或者其它文件中定义的服务,可以选择性的覆盖原有配置。

extends:
file: common.yml
service: webapp
service必须有,file可选。service是需要继承的服务,例如web、database。

net

设置网络模式。同docker的–net参数。

net: “bridge”
net: “none”
net: “container:[name or id]”
net: “host”

dns

自定义dns服务器。

dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9

cpu_shares, cpu_quota, cpuset, domainname, hostname, ipc, mac_address, mem_limit, memswap_limit, privileged, read_only, restart, shm_size, stdin_open, tty, user, working_dir

这些命令都是单个值

cpu_shares: 73
cpu_quota: 50000
cpuset: 0,1

user: postgresql
working_dir: /code

domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43

mem_limit: 1000000000
mem_limit: 128M
memswap_limit: 2000000000
privileged: true

restart: always

read_only: true
shm_size: 64M
stdin_open: true
tty: true

你可能感兴趣的:(docker)