Docker Compose 模板文件 docker-compose.yml V3.x 指令詳解

Compose和Docker兼容性矩陣:


image.png

詳情請(qǐng)參考官方文檔

先來一個(gè) docker-compose.yml 版本 3.x 的一個(gè)示例

version: "3"
services:

  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        constraints: [node.role == manager]

  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - "5000:80"
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure

  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - "5001:80"
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints: [node.role == manager]

  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]

networks:
  frontend:
  backend:

volumes:
  db-data:

提示:您可以使用此文件的擴(kuò)展名為 .yml.yaml 擴(kuò)展名。

文件結(jié)構(gòu)說明

從上面的示例模板文件中可以看出脑融,頂級(jí)的配置項(xiàng)有:

  • version 定義了版本信息
  • services 定義了服務(wù)的配置信息
  • networks 定義了網(wǎng)絡(luò)信息俏脊,提供給 services 中的 具體容器使用
  • volumes 定義了卷信息,提供給 services 中的 具體容器使用
  1. services 的定義包含應(yīng)用于為該服務(wù)啟動(dòng)的每個(gè)容器的配置的猛,非常類似于將命令行的 docker container create耀盗。

  2. networks 的定義類似于命令行的 docker network create

  3. volumes 的定義類似于命令行的 docker volume create卦尊。

關(guān)于頂級(jí) services 配置參考

以下僅僅討論常用的配置指令

1. container_name

指定容器名稱叛拷。默認(rèn)將會(huì)使用 項(xiàng)目名稱服務(wù)名稱序號(hào) 這樣的格式。

container_name: docker-web-container

注意: 指定容器名稱后岂却,該服務(wù)將無法進(jìn)行擴(kuò)展(scale)忿薇,因?yàn)?Docker 不允許多個(gè)容器具有相同的名稱。

2. labels

為容器添加 Docker 元數(shù)據(jù)(metadata)信息躏哩。例如可以為容器添加輔助說明信息煌恢。

labels:
  com.startupteam.description: "webapp for a startup team"
  com.startupteam.department: "devops department"
  com.startupteam.release: "rc3 for v1.0"

3. 在構(gòu)建時(shí)應(yīng)用的配置選項(xiàng)。

注意每個(gè)服務(wù)都必須通過 image 指令指定鏡像或 build 指令(需要 Dockerfile)等來自動(dòng)構(gòu)建生成鏡像震庭。

如果使用 build 指令瑰抵,那么在 Dockerfile 中設(shè)置的選項(xiàng)(例如:CMD, EXPOSE, VOLUME, ENV 等) 將會(huì)自動(dòng)被獲取,無需在 docker-compose.yml 中再次設(shè)置器联。

下面分別介紹幾個(gè)指令的用法二汛。

bulid

指定 Dockerfile 所在文件夾的路徑(可以是絕對(duì)路徑,或者相對(duì) docker-compose.yml 文件的路徑)拨拓。 Compose 將會(huì)利用它自動(dòng)構(gòu)建這個(gè)鏡像肴颊,然后使用這個(gè)鏡像。

類似于命令行的 docker build .

version: '3'
services:
  webapp:
    build: ./dir

你也可以使用 context 指令指定 Dockerfile 所在文件夾的路徑渣磷。

同時(shí)使用 dockerfile 指令指定 Dockerfile 文件名婿着。

version: '3'
services:

  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate

image

指定為鏡像名稱或鏡像 ID。如果鏡像在本地不存在醋界,Compose 將會(huì)嘗試?yán)∵@個(gè)鏡像竟宋。

image: ubuntu
image: orchardup/postgresql
image: a4bc65fd

如果同時(shí)指定了 imagebuildimage 不在具有單獨(dú)使用它的意義形纺,而是指定了目前要構(gòu)建的鏡像的名稱丘侠。 也就是說 Compose 會(huì)使用 build 指令中指定的 Dockerfilel 構(gòu)建的鏡像,之后構(gòu)建的鏡像名稱使用 image 中指定的名字 webapp:tag命名逐样。

build: ./dir
image: webapp:tag

3. command

使用 command 可以覆蓋容器啟動(dòng)后默認(rèn)執(zhí)行的命令蜗字。

command: bundle exec thin -p 3000

也可以寫成類似 Dockerfile 中的格式:

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

4. depends_on

解決容器的依賴、啟動(dòng)先后的問題脂新。以下例子中會(huì)先啟動(dòng)容器 dbredis 再啟動(dòng) web

version: '3'

services:
  web:
    build: .
    depends_on:
      - db
      - redis

  redis:
    image: redis

  db:
    image: postgres

注意:web 服務(wù)不會(huì)等待 redisdb 「完全啟動(dòng)」之后才啟動(dòng)挪捕。

5. environment

設(shè)置環(huán)境變量。你可以使用數(shù)組或字典兩種格式争便。

只給定名稱的變量會(huì)自動(dòng)獲取運(yùn)行 Compose 主機(jī)上對(duì)應(yīng)變量的值级零,可以用來防止泄露不必要的數(shù)據(jù)。

environment:
  RACK_ENV: development
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SESSION_SECRET

如果變量名稱或者值中用到 true|false始花,yes|no 等表達(dá) 布爾 含義的詞匯妄讯,最好放到引號(hào)里,避免 YAML 自動(dòng)解析某些內(nèi)容為對(duì)應(yīng)的布爾語義酷宵。這些特定詞匯亥贸,包括

y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF

6. expose

暴露端口,但不映射到宿主機(jī)浇垦,只被其他容器連接到此容器時(shí)使用炕置。

僅可以指定容器內(nèi)部的端口為參數(shù)

expose:
 - "3000"
 - "8000"

7. ports

映射端口信息。

使用:
宿主端口:容器端口 (即:HOST:CONTAINER) 的格式格式男韧,或者僅僅指定容器的端口(宿主將會(huì)隨機(jī)選擇端口)都可以朴摊。

ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:8001:8001"

注意:當(dāng)使用 HOST:CONTAINER 格式來映射端口時(shí),如果你使用的容器端口小于 60 并且沒放到引號(hào)里此虑,可能會(huì)得到錯(cuò)誤結(jié)果甚纲,因?yàn)?YAML 會(huì)自動(dòng)解析 xx:yy 這種數(shù)字格式為 60 進(jìn)制。為避免出現(xiàn)這種問題朦前,建議數(shù)字串都采用引號(hào)包括起來的字符串格式介杆。

8. extra_hosts

類似 Docker 中的 --add-host 參數(shù),指定額外的 host 名稱映射信息韭寸。

extra_hosts:
 - "googledns:8.8.8.8"
 - "dockerhub:52.1.157.61"

會(huì)在啟動(dòng)后的服務(wù)容器中 /etc/hosts 文件中添加如下兩條條目春哨。

8.8.8.8 googledns
52.1.157.61 dockerhub

9. networks

要加入的網(wǎng)絡(luò),使用頂級(jí)networks 定義下的條目 恩伺。

services:
  some-service:
    networks:
     - some-network
     - other-network
networks:
  some-network:
  other-network:

指定 IPv4 和 IPv6 地址

version: "2.4"

services:
  app:
    image: busybox
    command: ifconfig
    networks:
      app_net:
        ipv4_address: 172.16.238.10
        ipv6_address: 2001:3984:3989::10

networks:
  app_net:
    driver: bridge
    enable_ipv6: true
    ipam:
      driver: default
      config:
        - subnet: 172.16.238.0/24
          gateway: 172.16.238.1
        - subnet: 2001:3984:3989::/64
          gateway: 2001:3984:3989::1
image.png

指定自定義IPAM配置赴背。這是一個(gè)具有多個(gè)屬性的對(duì)象,每個(gè)屬性都是可選的:

  • driver:自定義IPAM驅(qū)動(dòng)程序晶渠,而不是默認(rèn)驅(qū)動(dòng)程序凰荚。
  • config:具有零個(gè)或多個(gè)配置塊的列表,每個(gè)配置塊包含以下任一鍵:
    • subnet:CIDR格式的子網(wǎng), 就是這個(gè)網(wǎng)絡(luò)的網(wǎng)段
    • ip_range:從中分配容器IP的IP范圍
    • gateway:主子網(wǎng)的IPv4或IPv6網(wǎng)關(guān)
    • aux_addresses:網(wǎng)絡(luò)驅(qū)動(dòng)程序使用的輔助IPv4或IPv6地址褒脯,作為從主機(jī)名到IP的映射
  • options:特定于驅(qū)動(dòng)程序的選項(xiàng)作為鍵值映射浇揩。

使用現(xiàn)有網(wǎng)絡(luò)

如果您希望容器加入現(xiàn)有網(wǎng)絡(luò),請(qǐng)使用以下external選項(xiàng)

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

這種情況下憨颠,Compose不會(huì)嘗試創(chuàng)建名為 [projectname]_default 的網(wǎng)絡(luò)胳徽,而是查找名為 my-pre-existing-network 的網(wǎng)絡(luò),并將應(yīng)用程序的容器連接到該網(wǎng)絡(luò)爽彤。

10. alias

網(wǎng)絡(luò)上此服務(wù)的別名(備用主機(jī)名)养盗。同一網(wǎng)絡(luò)上的其他容器可以使用服務(wù)名稱或此別名連接到其中一個(gè)服務(wù)的容器。

由于aliases是網(wǎng)絡(luò)范圍的适篙,因此相同的服務(wù)可以在不同的網(wǎng)絡(luò)上具有不同的別名往核。

注意:網(wǎng)絡(luò)范圍的別名可以由多個(gè)容器共享,甚至可以由多個(gè)服務(wù)共享嚷节。如果是聂儒,則無法保證名稱解析為的容器虎锚。

一般格式如下所示。

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
         - alias3
      other-network:
        aliases:
         - alias2

11. healthcheck

通過命令檢查容器是否健康運(yùn)行衩婚。

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 1m30s
  timeout: 10s
  retries: 3

12. logging

配置日志選項(xiàng)窜护。

logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"

目前支持三種日志驅(qū)動(dòng)類型。

driver: "json-file"
driver: "syslog"
driver: "none"

options 配置日志驅(qū)動(dòng)的相關(guān)參數(shù)非春。

options:
  max-size: "200k"
  max-file: "10"


關(guān)于頂級(jí) volumes 的配置參考

1. volumes

數(shù)據(jù)卷所掛載路徑設(shè)置柱徙。可以設(shè)置宿主機(jī)路徑 (HOST:CONTAINER) 或加上訪問模式 (HOST:CONTAINER:ro)奇昙。

該指令中路徑支持相對(duì)路徑护侮。

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

卷的 bindvolume 的混合使用示例

version: "3.2"
services:
  web:
    image: nginx:alpine
    volumes:
      # 卷 (volume)
      - type: volume
        source: mydata
        target: /data
        volume:
          nocopy: true
      # 掛載 (bind)
      - type: bind
        source: ./static
        target: /opt/app/static

  db:
    image: postgres:latest
    volumes:
      - "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock"
      - "dbdata:/var/lib/postgresql/data"

volumes:
  mydata:
  dbdata:


關(guān)于容器的限制的參數(shù)

sysctls

配置容器內(nèi)核參數(shù)。

sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0

sysctls:
  - net.core.somaxconn=1024
  - net.ipv4.tcp_syncookies=0

ulimits

指定容器的 ulimits 限制值储耐。

例如羊初,指定最大進(jìn)程數(shù)為 65535,指定文件句柄數(shù)為 20000(軟限制什湘,應(yīng)用可以隨時(shí)修改凳忙,不能超過硬限制) 和 40000(系統(tǒng)硬限制,只能 root 用戶提高)禽炬。

  ulimits:
    nproc: 65535
    nofile:
      soft: 20000
      hard: 40000
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涧卵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子腹尖,更是在濱河造成了極大的恐慌柳恐,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件热幔,死亡現(xiàn)場(chǎng)離奇詭異乐设,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绎巨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門近尚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人场勤,你說我怎么就攤上這事戈锻。” “怎么了和媳?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵格遭,是天一觀的道長。 經(jīng)常有香客問我留瞳,道長拒迅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮璧微,結(jié)果婚禮上作箍,老公的妹妹穿的比我還像新娘。我一直安慰自己前硫,他們只是感情好胞得,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著开瞭,像睡著了一般懒震。 火紅的嫁衣襯著肌膚如雪罩息。 梳的紋絲不亂的頭發(fā)上嗤详,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音瓷炮,去河邊找鬼葱色。 笑死,一個(gè)胖子當(dāng)著我的面吹牛娘香,可吹牛的內(nèi)容都是我干的苍狰。 我是一名探鬼主播烘绽,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼淋昭,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了安接?” 一聲冷哼從身側(cè)響起翔忽,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盏檐,沒想到半個(gè)月后歇式,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胡野,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年材失,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片硫豆。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡龙巨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出熊响,到底是詐尸還是另有隱情恭应,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布耘眨,位于F島的核電站昼榛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胆屿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一奥喻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧非迹,春花似錦环鲤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纯命,卻和暖如春西剥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亿汞。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工瞭空, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疗我。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓咆畏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吴裤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子旧找,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容