Docker-Compose簡介與使用

說明:本人來源于Docker官方文檔的個人翻譯,如有疏漏嘁扼,還請見諒信粮。
原文地址:https://docs.docker.com/compose/

一、Docker-Compose的安裝與基礎(chǔ)命令

操作系統(tǒng)版本: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.授予執(zhí)行權(quán)限

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.移除容器并刪除數(shù)據(jù)卷

docker-compose down --volumes

二强缘、Docker堆棧與分布式應(yīng)用捆綁

【Produce bundle】

1.produce bundle

docker-compose bundle

【Create a stack from bundle】

2.通過docker deploy命令創(chuàng)建一個堆棧

docker deploy --help

3.部署之前創(chuàng)建一個堆棧

docker deploy vossibility-stack

4.驗證服務(wù)是否正確創(chuàng)建

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.創(chuàng)建鏡像

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.多重依賴

如果某項服務(wù)具有強制進行聯(lián)合調(diào)度的類型的多個依賴項(請參閱下面的自動調(diào)度)不傅,則Swarm可能會在不同的節(jié)點上調(diào)度依賴項旅掂,從而使依賴服務(wù)無法進行調(diào)度。 例如访娶,在這里foo需要與bar和baz共同調(diào)度:

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中替換環(huán)境變量

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

2.在容器中設(shè)置環(huán)境變量

docker run -e VARIABLE=VALUE ...:

web:
  environment:
    - DEBUG=1

3.將環(huán)境變量傳遞給容器

docker run -e VARIABLE ...:

web:
  environment:
    - DEBUG

4.env_file配置選項

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

web:
  env_file:
    - web-variables.env

5.設(shè)置docker-compose run的環(huán)境變量

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.使用擴展字段擴展單個服務(wù)(適用于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'

在生產(chǎn)環(huán)境部署這個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文件和一個數(shù)據(jù)庫備份的docker-compose文件

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

【Extending services】

請記住崖疤,使用extends不能在服務(wù)之間共享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組叮趴,并將當(dāng)前用戶加入docker組

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

(2)使用root用戶重啟docker服務(wù)

systemctl restart docker.service

(3)使用gavin用戶啟動docker-compose

cd composetest
docker-compose up
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末权烧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子妻率,更是在濱河造成了極大的恐慌,老刑警劉巖板祝,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宫静,死亡現(xiàn)場離奇詭異,居然都是意外死亡扔字,警方通過查閱死者的電腦和手機囊嘉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來革为,“玉大人扭粱,你說我怎么就攤上這事≌痖荩” “怎么了琢蛤?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵蜓堕,是天一觀的道長。 經(jīng)常有香客問我博其,道長套才,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任慕淡,我火速辦了婚禮背伴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘峰髓。我一直安慰自己傻寂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布携兵。 她就那樣靜靜地躺著疾掰,像睡著了一般静檬。 火紅的嫁衣襯著肌膚如雪拂檩。 梳的紋絲不亂的頭發(fā)上广恢,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天钠署,我揣著相機與錄音谐鼎,去河邊找鬼。 笑死草戈,一個胖子當(dāng)著我的面吹牛唐片,可吹牛的內(nèi)容都是我干的茧球。 我是一名探鬼主播抢埋,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肪凛?” 一聲冷哼從身側(cè)響起伟墙,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拱烁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體擅笔,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年吉懊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片废登。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖羽戒,靈堂內(nèi)的尸體忽然破棺而出易稠,到底是詐尸還是另有隱情,我是刑警寧澤亡电,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布腕唧,位于F島的核電站枣接,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏榆骚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一纲缓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧工闺,春花似錦陆蟆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纫塌,卻和暖如春诊县,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背措左。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工依痊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胸嘁。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓酵使,卻偏偏與公主長得像痪欲,于是被迫代替她去往敵國和親陨亡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354