Docker-Compose简介与使用

说明:本人来源于Docker官方文档的个人翻译,如有疏漏,还请见谅。
原文地址:https://docs.docker.com/compose/

一、Docker-Compose的安装与基础命令

操作系统版本:CentOS7.6

1.使用root用户安装依赖

yum -y install epel-release
yum -y install python-pip python-devel  libffi-devel openssl-devel  libc-devel gcc make

2.安装docker compose(使用非root用户,这里使用的是gavin用户)

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

3.授予执行权限

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

4.检查是否安装成功

docker-compose --version

5.启动docker-compose

docker-compose up

6.后台运行docker-compose

docker-compose up -d

7.查看后台运行的进程

docker-compose ps

8.停止后台运行的进程

docker-compose stop

9.移除容器并删除数据卷

docker-compose down --volumes

二、Docker堆栈与分布式应用捆绑

【Produce bundle】

1.produce bundle

docker-compose bundle

【Create a stack from bundle】

2.通过docker deploy命令创建一个堆栈

docker deploy --help

3.部署之前创建一个堆栈

docker deploy vossibility-stack

4.验证服务是否正确创建

docker service ls

【Manage stacks】

5.通过docker stack命令管理堆栈

docker stack --help

【Bundle file format】
一个捆绑有两个顶级字段:version和services.

三、通过Swarm使用Compose

$ eval "$(docker-machine env --swarm <name of swarm master machine>)"
$ docker-compose up

【局限性】

1.创建镜像

If you want to use Compose to scale the service in question to multiple nodes, build the image, push it to a registry such as Docker Hub, and reference it from docker-compose.yml:

$ docker build -t myusername/web .
$ docker push myusername/web

$ cat docker-compose.yml
web:
  image: myusername/web

$ docker-compose up -d
$ docker-compose scale web=3

2.多重依赖

如果某项服务具有强制进行联合调度的类型的多个依赖项(请参阅下面的自动调度),则Swarm可能会在不同的节点上调度依赖项,从而使依赖服务无法进行调度。 例如,在这里foo需要与bar和baz共同调度:

version: "2"
services:
  foo:
    image: foo
    volumes_from: ["bar"]
    network_mode: "service:baz"
  bar:
    image: bar
  baz:
    image: baz

The problem is that Swarm might first schedule bar and baz on different nodes (since they’re not dependent on one another), making it impossible to pick an appropriate node for foo.
To work around this, use manual scheduling to ensure that all three services end up on the same node:

version: "2"
services:
  foo:
    image: foo
    volumes_from: ["bar"]
    network_mode: "service:baz"
    environment:
      - "constraint:node==node-1"
  bar:
    image: bar
    environment:
      - "constraint:node==node-1"
  baz:
    image: baz
    environment:
      - "constraint:node==node-1"

3.主机端口和重建容器

Specify a named volume, and use a volume driver which is capable of mounting the volume into the container regardless of what node it’s scheduled on.
Compose does not give Swarm any specific scheduling instructions if a service uses only named volumes.

version: "2"

services:
  web:
    build: .
    ports:
      - "80:8000"
    volumes:
      - web-logs:/var/log/web

volumes:
  web-logs:
    driver: custom-volume-driver

Remove the old container before creating the new one. You lose any data in the volume.

$ docker-compose stop web
$ docker-compose rm -f web
$ docker-compose up web

【容器编排】

1.自动编排

network_mode: "service:..." and network_mode: "container:..." (and net: "container:..." in the version 1 file format).
volumes_from
links

2.手动编排

四、Environment variables in Compose

1.在Composer files中替换环境变量

web:
  image: "webapp:${TAG}"

2.在容器中设置环境变量

docker run -e VARIABLE=VALUE ...:

web:
  environment:
    - DEBUG=1

3.将环境变量传递给容器

docker run -e VARIABLE ...:

web:
  environment:
    - DEBUG

4.env_file配置选项

docker run --env-file=FILE ...:

web:
  env_file:
    - web-variables.env

5.设置docker-compose run的环境变量

docker-compose run -e DEBUG=1 web python console.py
docker-compose run -e DEBUG web python console.py

6. .env文件

$ cat .env
TAG=v1.5
$ cat docker-compose.yml
version: '3'
services:
  web:
    image: "webapp:${TAG}"
$ docker-compose config

version: '3'
services:
  web:
    image: 'webapp:v1.5'
$ export TAG=v2.0
$ docker-compose config

version: '3'
services:
  web:
    image: 'webapp:v2.0'
$ cat ./Docker/api/api.env
NODE_ENV=test
$ cat docker-compose.yml
version: '3'
services:
  api:
    image: 'node:6-alpine'
    env_file:
     - ./Docker/api/api.env
    environment:
     - NODE_ENV=production
$ docker-compose exec api node
> process.env.NODE_ENV
'production'

五、Extend services in Compose

在文件和工程间共享Compose配置

Compose支持两种方法来共享通用配置:
1.通过使用多个Compose文件扩展整个Compose文件
2.使用扩展字段扩展单个服务(适用于2.1或更高版本的Compose文件)

【Multiple Compose files】
1.Understanding multiple Compose files
2.Example use case
<DIFFERENT ENVIRONMENTS>

docker-compose.yml
web:
  image: example/my_web_app:latest
  depends_on:
    - db
    - cache

db:
  image: postgres:latest

cache:
  image: redis:latest
docker-compose.override.yml
web:
  build: .
  volumes:
    - '.:/code'
  ports:
    - 8883:80
  environment:
    DEBUG: 'true'

db:
  command: '-d'
  ports:
    - 5432:5432

cache:
  ports:
    - 6379:6379
docker-compose.prod.yml

web:
  ports:
    - 80:80
  environment:
    PRODUCTION: 'true'

cache:
  environment:
    TTL: '500'

在生产环境部署这个docker-compose:

docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

<ADMINISTRATIVE TASKS>

docker-compose.yml

web:
  image: example/my_web_app:latest
  depends_on:
    - db

db:
  image: postgres:latest
docker-composer.admin.yml

dbadmin:
  build: database_admin/
  depends_on:
    - db

启动一个正常的docker-compose文件和一个数据库备份的docker-compose文件

docker-compose -f docker-compose.yml -f docker-compose.admin.yml  run dbadmin db-backup

【Extending services】

请记住,使用extends不能在服务之间共享volumes_from和depends_on。
1.Understand the extends configuration

docker-compose.yml

web:
  extends:
    file: common-services.yml
    service: webapp

common-services.yml

webapp:
  build: .
  ports:
    - "8000:8000"
  volumes:
    - "/data"
    
web:
  extends:
    file: common-services.yml
    service: webapp
  environment:
    - DEBUG=1
  cpu_shares: 5

important_web:
  extends: web
  cpu_shares: 10
  
  
web:
  extends:
    file: common-services.yml
    service: webapp
  environment:
    - DEBUG=1
  cpu_shares: 5
  depends_on:
    - db
db:
  image: postgres

2.Example use case
common.yml

app:
  build: .
  environment:
    CONFIG_FILE_PATH: /code/config
    API_KEY: xxxyyy
  cpu_shares: 5

docker-compose.yml

webapp:
  extends:
    file: common.yml
    service: app
  command: /code/run_web_app
  ports:
    - 8080:8080
  depends_on:
    - queue
    - db

queue_worker:
  extends:
    file: common.yml
    service: app
  command: /code/run_worker
  depends_on:
    - queue

【Adding and overriding configuration】

# original service
command: python app.py

# local service
command: python otherapp.py

# result
command: python otherapp.py

For the multi-value options ports, expose, external_links, dns, dns_search, and tmpfs, Compose concatenates both sets of values:

# original service
expose:
  - "3000"

# local service
expose:
  - "4000"
  - "5000"

# result
expose:
  - "3000"
  - "4000"
  - "5000"

In the case of environment, labels, volumes, and devices, Compose “merges” entries together with locally-defined values taking precedence. For environment and labels, the environment variable or label name determines which value is used:

# original service
environment:
  - FOO=original
  - BAR=original

# local service
environment:
  - BAR=local
  - BAZ=local

# result
environment:
  - FOO=original
  - BAR=local
  - BAZ=local

Entries for volumes and devices are merged using the mount path in the container:

# original service
volumes:
  - ./original:/foo
  - ./original:/bar

# local service
volumes:
  - ./local:/bar
  - ./local:/baz

# result
volumes:
  - ./original:/foo
  - ./local:/bar
  - ./local:/baz

六、Networking in Compose

【Update containers】

version: "3"
services:

  web:
    build: .
    links:
      - "db:database"
  db:
    image: postgres
【Specify custom networks】
version: "3"
services:

  proxy:
    build: ./proxy
    networks:
      - frontend
  app:
    build: ./app
    networks:
      - frontend
      - backend
  db:
    image: postgres
    networks:
      - backend

networks:
  frontend:
    # Use a custom driver
    driver: custom-driver-1
  backend:
    # Use a custom driver which takes special options
    driver: custom-driver-2
    driver_opts:
      foo: "1"
      bar: "2"

【Configure the default network】

version: "3"
services:

  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres

networks:
  default:
    # Use a custom driver
    driver: custom-driver-1

【Use a pre-existing network】

networks:
  default:
    external:
      name: my-pre-existing-network

六、问题解决

1.启动docker-compose报错

[gavin@gavin composetest]$ docker-compose up
ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.

【解决方法】

(1)使用gavin用户新建docker组,并将当前用户加入docker组

sudo groupadd docker
sudo gpasswd -a ${USER} docker

(2)使用root用户重启docker服务

systemctl restart docker.service

(3)使用gavin用户启动docker-compose

cd composetest
docker-compose up
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343