1. 程式人生 > >Docker-compose配置檔案詳解

Docker-compose配置檔案詳解

原文連結:http://ju.outofmemory.cn/entry/287017

基本介紹

Compose 檔案是一個 YAML , 主要定義了 services, networks volumes , 其預設路徑是./docker-compose.yml

service 定義包含了應用與每個容器的配置,很像給docker run 傳參,同樣,network volume 對於 docker network create docker volume create也類似。

像在 Dockerfile(eg: CMD , EXPOSE , VOLUME , ENV )可以使用的選項也可以在 docker run

引數中使用, 這樣在 docker-compose.yml裡就不需要再次指定了。

docker-compose.yml裡可以使用環境變數,類似 Bash格式${VARIABLE}

Service配置

composer 檔案格式有兩種版本:

  • version 1: 已經廢棄, 不支援volumes 和 networks,預設 version key 是省略的。
  • version 2: 推薦的格式,目前是最新的,需要通過 version '2' 指定。 更多

build

有兩種用法:

build:./dir

build:
  context:./dir
  dockerfile:Dockerfile-alternate
  args:
    buildno:1

如果指定 image , 那麼Compose會基於 webapp和可選的 tag 來構建映象。

build:./dir
image: webapp:tag

上面的指令會生成一個基於 ./dir名稱為 webapp,tag為 tag 的映象。

在 version 1 格式的檔案裡,兩種方式是不同的

  1. 僅支援字串形式: build:., 不支援物件形式。
  2. 不能同時使用 build image
    , 如果嘗試這麼做的話會導致錯誤。

context

只支援version2, version1 只能使用 build

值可以是一個目錄路徑,也可以是一個git repository url。
當所提供的值是相對路徑的時候,它被解釋為compose檔案位置的相對路徑。目錄裡的資訊會被當做構建內容 傳送到Docker daemon。

dockerfile

備用的dockerfile.

Compose 將會使用備用的檔案去構建,但必須指定路徑。如:

build:
  context:.
  dockerfile:Dockerfile-alternate

args

僅支援 Version2

新增構建環境變數引數,但是僅構建過程期間可以使用。如:

ARG buildno
ARG password

RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"

args 可以使用 mapping 或 list:

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

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

depends_on

表示服務之間的依賴關係, 有兩個影響:

  • docker-compose up將會根據依賴關係的順序開啟所有服務,下面的例子中, db redis 會早於 web 服務先啟動。
  • docker-compose up SERVICE會自動包含 SERVICE的依賴,下面的例子中, docker-compose up web將會建立,同時也會啟動 db redis 服務。
version:'2'
services:
  web:
    build:.
    depends_on:- db
      - redis
  redis:
    image: redis
  db:
    image: postgres

web 服務啟動前並不會等待db和redis到ready狀態才啟動。如果需要等待其他服務到ready狀態,可以參考 Controlling startup order

environment

新增環境變數。可以是陣列或者字典格式。任何的boolean值(eg: true,false, yes , no)都需要被引號引用,避免被 YAML 解析器解析為 TrueFalse.

environment:
  RACK_ENV: development
  SHOW:'true'
  SESSION_SECRET:

environment:- RACK_ENV=development
  - SHOW=true- SESSION_SECRET

expose

對外暴露埠,但不是暴露給host機器的,而是對已經 linked 的service可訪問。

expose:-"3000"-"8000"

image

指定要啟動容器的映象,可以是 repository/tagimage ID

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd

映象檔案不存在,Compose會嘗試去遠端拉取。

labels

新增 metadata 到容器中。可以使用陣列或字典

labels:
  com.example.description:"Accounting webapp"
  com.example.department:"Finance"
  com.example.label-with-empty-value:""

labels:-"com.example.description=Accounting webapp"-"com.example.department=Finance"-"com.example.label-with-empty-value"

links

link到其他服務容器,可以使用服務名+alias( SERVICE:ALIAS), 也可以只使用服務名。

web:
  links:- db
   - db:database
   - redis

pid

將 當前的 PID 設定為主機的PID .這會開啟容器和host作業系統之間的PID 地址共享。 帶有 PID 啟動的容器可以訪問和操縱其他真實機器空間容器。 反之亦然。

pid:"host"

ports

暴露埠。既可以是 HOST:CONTAINER,也可以只用容器埠(host埠會隨機選取)。

當以 HOST:CONTAINER的形式對映埠的時候,當容器的埠低於60的時候可能會遇到錯誤,因為YAML會解析 xx:yy 數字為60。 基於這個原因,我們推薦明確指定埠對映用字串的形式。

ports:-"3000"-"3000-3005"-"8000:8000"-"9090-9091:8080-8081"-"49100:22"-"127.0.0.1:8001:8001"-"127.0.0.1:5000-5010:5000-5010"

volumes

掛載指定的路徑或者named volumes, 可以在主機上指定一個路徑 HOST:CONTAINER, 或者一個可訪問的 HOST:CONTAINER:ro

volumes:# Just specify a path and let the Engine create a volume-/var/lib/mysql

  # Specify an absolute path mapping-/opt/data:/var/lib/mysql

  # Path on the host, relative to the Compose file-./cache:/tmp/cache

  # User-relative path-~/configs:/etc/configs/:ro

  # Named volume- datavolume:/var/lib/mysql

原文連結:http://ju.outofmemory.cn/entry/287017

另:docker compose中working_dir是docker run的時候用來設定工作路徑的引數

參考連結:https://segmentfault.com/q/1010000004674939