docker-compose.yml

什么是YAML呢?

YAML全稱YAML Ain't Markup Language表示“YAML不是一種標(biāo)記語(yǔ)言”的縮寫(xiě),為了強(qiáng)調(diào)YAML語(yǔ)言以數(shù)據(jù)作為中心,不是以標(biāo)記語(yǔ)言為重點(diǎn),使用返璞詞重新命名。

YAML是一種直觀的能夠被電腦識(shí)別的數(shù)據(jù)序列化格式,是一個(gè)可讀性高且容易被人類(lèi)閱讀,容易和腳本語(yǔ)言交互,用來(lái)表達(dá)資料序列的編程語(yǔ)言。

YAML是一種類(lèi)似于標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言的子集XML的數(shù)據(jù)描述語(yǔ)言,語(yǔ)法比XML更加容易簡(jiǎn)單。

什么是Docker Compose呢?

docker-compose是用來(lái)將Docker自動(dòng)化的命令,有了docker-compose可將繁瑣的Docker操作整合為一條命令,自動(dòng)化的完成。

Docker Compose命令請(qǐng)參見(jiàn) 《docker-compose命令》

什么是docker-compose.yml文件呢?

Docker Compose默認(rèn)的模板文件是docker-compose.yml,其中定義的每個(gè)服務(wù)都必須通過(guò)image指令指定鏡像或使用Dockerfile的build指令進(jìn)行自動(dòng)構(gòu)建,其它大部分指令跟docker run中選項(xiàng)類(lèi)似。

如果使用Dockerfile的build指令,則在Dockerfile中設(shè)置的選項(xiàng)如CMD、EXPOSE、VOLUME、ENV等將會(huì)自動(dòng)被獲取,無(wú)需在docker-comopse.yml文件中再次設(shè)置。

如果使用image指定為鏡像名稱或鏡像ID時(shí)鏡像在本地不存在,Compose將會(huì)嘗試去拉取這個(gè)鏡像。

典型的docker-comopse.yml文件格式

$ vim docker-compose.yml
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

Compose文件是一個(gè)定義服務(wù)services、網(wǎng)絡(luò)networks和卷volumes的YAML文件,默認(rèn)路徑是./docker-compose.yml,可使用.yml.yaml作為文件擴(kuò)展名。

服務(wù)services定義包含應(yīng)用于為該服務(wù)啟動(dòng)的每個(gè)容器的配置,類(lèi)似傳遞命令行參數(shù)一樣docker container create。同樣,網(wǎng)絡(luò)networks和卷volumes的定義類(lèi)似于docker network createdocker volume create。正如docker container createDockerfile指定選項(xiàng),如CMD、EXPOSEVOLUME、ENV,在默認(rèn)情況下,不需要在docker-compose.yml配置中再次指定。可以使用Bash類(lèi)${VARIABLE}語(yǔ)法在配置值中使用環(huán)境變量。

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:

docker-compose.yml指令有那些呢?

標(biāo)準(zhǔn)配置文件應(yīng)該包含version、servicesnetworks三部分,其中最關(guān)鍵的是servicesnetworks兩個(gè)部分。

images

images用來(lái)指定服務(wù)的鏡像名稱或鏡像ID,如果鏡像在本地不存在,compose將會(huì)嘗試去拉取這個(gè)鏡像。

services:
  web:
    image:redis

volumes

volumes指令用于設(shè)置數(shù)據(jù)卷掛載路徑,數(shù)據(jù)卷掛載路徑可以是一個(gè)目錄或一個(gè)已經(jīng)存在的數(shù)據(jù)卷容器,可以設(shè)置宿主機(jī)路徑HOST:CONTAINER或加上訪問(wèn)模式HOST:CONTAINER:ro。使用ro表示對(duì)于容器來(lái)說(shuō)數(shù)據(jù)卷是只讀的,這樣可以有效地保護(hù)宿主機(jī)的文件系統(tǒng)。

volumes:
  # 指定一個(gè)容器內(nèi)的路徑,Docker會(huì)自動(dòng)創(chuàng)建一個(gè)數(shù)據(jù)卷。
  - /var/lib/mysql
  # 使用絕對(duì)路徑掛載數(shù)據(jù)卷
  - /opt/data:/var/lib/mysql
  # 以compose配置文件所在目錄為根的相對(duì)路徑作為數(shù)據(jù)卷掛載到容器
  - ./cache:/tmp/cache
  # 使用用戶的相對(duì)路徑
  - ~/configs:/etc/configs:ro

networks

networks指令用于設(shè)置指定網(wǎng)絡(luò)

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

networks標(biāo)簽擁有一個(gè)特別的子標(biāo)簽aliases用于設(shè)置服務(wù)別名,相同的別名可以在不同的網(wǎng)絡(luò)中擁有不同的別名。

services:
  some-service:
    networks:
      some-network:
        aliases:
          - alias1

未完待續(xù)...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容