1. 程式人生 > 其它 >cf #776 div.2 C. Weight of the System of Nested Segments

cf #776 div.2 C. Weight of the System of Nested Segments

Docker-Compose

安裝Compose


# 方法一:
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# 方法二:使用pip安裝,版本可能比較舊
$ yum install python-pip python-dev
$ pip install docker-compose

# 方法三:作為容器安裝
$ curl -L https://github.com/docker/compose/releases/download/1.25.5/run.sh > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose

# 方法四:離線安裝
# 下載[docker-compose-Linux-x86_64](https://github.com/docker/compose/releases/download/1.8.1/docker-compose-Linux-x86_64),然後重新命名新增可執行許可權即可:
$ mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose;
$ chmod +x /usr/local/bin/docker-compose
# 百度雲地址: http://pan.baidu.com/s/1slEOIC1 密碼: qmca
# docker官方離線地址:https://dl.bintray.com/docker-compose/master/

docker-compose.yml配置詳解

DOCKER-COMPOPSE.YML 版本和DOCKER相容性表

Compose specification 19.03.0+
3.8 19.03.0+
3.7 18.06.0+
3.6 18.02.0+
3.5 17.12.0+
3.4 17.09.0+
3.3 17.06.0+
3.2 17.04.0+
3.1 1.13.1+
3.0 1.13.0+
2.4 17.12.0+
2.3 17.06.0+
2.2 1.13.0+
2.1 1.12.0+
2.0 1.10.0+

詳情請看官網文件

頂級配置項

  • version 定義了版本資訊
  • services 定義了服務的配置資訊
  • networks 定義了網路資訊,提供給 services 中的 具體容器使用
  • volumes 定義了卷資訊,提供給 services 中的 具體容器使用

示例:


version: "3.8"
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

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

  worker:
    image: nginx
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s

networks:
  frontend:
  backend:
volumes:
  db-data:

SERVICES配置指令

1. container_name

指定容器名稱


version: "3"
services:

  redis:
    image: redis:alpine
    container_name: redis_test

2. image

指定為映象名稱或映象 ID。如果映象在本地不存在,Compose 將會嘗試拉取這個映象。


version: "3"
services:

  redis:
    image: redis:alpine

3. build

指定 Dockerfile 所在資料夾的路徑(可以是絕對路徑,或者相對 docker-compose.yml 檔案的路徑)。 Compose 將會利用它自動構建這個映象,然後使用這個映象。


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

也可以使用 context 指令指定 Dockerfile 所在資料夾的路徑(或者是git倉庫的URL)。同時使用 dockerfile 指令指定 Dockerfile 檔名。


version: '3'
services:

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

注意:
如果同時指定了 image和 build, image 不在具有單獨使用它的意義,而是指定了目前要構建的映象的名稱。 也就是說 Compose 會使用 build 指令中指定的 Dockerfile 構建的映象,之後構建的映象名稱使用 image 中指定的名字 webapp:tag命名。

4. command

使用 command 可以覆蓋容器啟動後預設執行的命令。


#寫成shell形式
command: bundle exec thin -p 3000
#寫成Dockerfile中的exec格式
command: [bundle, exec, thin, -p, 3000]

5. depends_on

解決容器的依賴、啟動先後的問題。


version: '3'

services:
  web:
    image: redis:alpine
    container_name: redis_test
    depends_on:
      - db

6. environment

設定環境變數。可以使用陣列或字典兩種格式。

只給定名稱的變數會自動獲取執行 Compose 主機上的對應變數的資訊。


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

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

如果變數名稱或者值中用到 true|false,yes|no 等表達 布林 含義的詞彙,最好放到引號裡,避免 YAML 自動解析某些內容為對應的布林語義。這些特定詞彙。

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

7. expose

暴露埠,但不對映到宿主機,只被連線的服務訪問。

僅可以指定容器內部的埠為引數


expose:
 - "3000"
 - "8000"

8. ports

對映埠資訊。

宿主埠:容器埠 (即:HOST:CONTAINER) 的格式格式,或者僅僅指定容器的埠(宿主將會隨機選擇埠)。


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"
 - "6060:6060/udp"

注意:當使用 HOST:CONTAINER 格式來對映埠時,如果你使用的容器埠小於 60 並且沒放到引號裡,可能會得到錯誤結果,因為 YAML 會自動解析 xx:yy 這種數字格式為 60 進位制。為避免出現這種問題,建議數字串都採用引號包括起來的字串格式。

9. extra_hosts

類似 Docker 中的 –add-host 引數,指定額外的 host 名稱對映資訊。會在啟動後的服務容器中 /etc/hosts 檔案中新增host對映資訊。


extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

10. networks

要加入的網路,使用頂級 networks 定義下的條目 。


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

11. entrypoint

指定服務容器啟動後執行的入口檔案。

12. user

指定容器中執行應用的使用者名稱。

13. working_dir

指定容器中工作目錄。

14. restart

指定容器退出後的重啟策略為始終重啟。該命令對保持服務始終執行十分有效,在生產環境 中推薦配置為 always 或者 unless-stopped 。

restart: always

15. alias

網路上此服務的別名(備用主機名)。同一網路上的其他容器可以使用服務名稱或此別名連線到其中一個服務的容器。
由於aliases是網路範圍的,因此相同的服務可以在不同的網路上具有不同的別名。
注意:網路範圍的別名可以由多個容器共享,甚至可以由多個服務共享。如果是,則無法保證名稱解析為的容器。


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

VOLUMES配置指令

資料卷所掛載路徑設定。可以設定宿主機路徑 (HOST:CONTAINER) 或加上訪問模式 (HOST:CONTAINER:ro)。

該指令中路徑支援相對路徑。


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

VOLUMES配置指令

1. 未顯式宣告網路環境的docker-compose.yml

使用docker-compose up啟動容器後,這些容器都會被加入app_default網路中。使用docker network ls可以檢視網路列表,docker network inspect 可以檢視對應網路的配置。


version: '3'
services:
  web:
    mage: nginx:latest
    container_name: web
    depends_on:
      - db
    ports:
      - "9090:80"
    links:
      - db
  db:
    image: mysql
    container_name: db

2. networks關鍵字指定自定義網路

例如下面的docker-compose.yml檔案,定義了front和back網路,實現了網路隔離。其中proxy和db之間只能通過app來實現通訊。其中,custom-driver-1並不能直接使用,你應該替換為host, bridge, overlay等選項中的一種。

version: '3'

services:
  proxy:
    build: ./proxy
    networks:
      - front
  app:
    build: ./app
    networks:
      - front
      - back
  db:
    image: postgres
    networks:
      - back

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

3. 配置預設網路

version: '2'

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

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

4. 使用已存在的網路

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

Docker-Compose常用命令

1) docker-compose up

用於部署一個 Compose 應用。

預設情況下該命令會讀取名為 docker-compose.yml 或 docker-compose.yaml 的檔案。

當然使用者也可以使用 -f 指定其他檔名。通常情況下,會使用 -d 引數令應用在後臺啟動。

2) docker-compose stop

停止 Compose 應用相關的所有容器,但不會刪除它們。

被停止的應用可以很容易地通過 docker-compose restart 命令重新啟動。

3) docker-compose rm

用於刪除已停止的 Compose 應用。

它會刪除容器和網路,但是不會刪除卷和映象。

4) docker-compose restart

重啟已停止的 Compose 應用。

如果使用者在停止該應用後對其進行了變更,那麼變更的內容不會反映在重啟後的應用中,這時需要重新部署應用使變更生效。

5) docker-compose ps

用於列出 Compose 應用中的各個容器。

輸出內容包括當前狀態、容器執行的命令以及網路埠。

6) docker-compose down

停止並刪除執行中的 Compose 應用。

它會刪除容器和網路,但是不會刪除卷和映象。