docker 實踐八:docker-compose


本篇介紹 docker 官方三劍客之一的 docker-compose。

注:環境為 CentOS7,docker 19.03。

docker-compose

docker-compose 的前身是開源的 docker 容器集群編排工具 Fig,2014年7月,Fig 被 Docker 收購並更名成為 docker-compose。

之前我們已經學習了關於 docker 的 dockerfile,使用它可以讓用戶快速生成一個需要的鏡像,進而生成容器,快速配置一個應用。但是雲計算的使用更多是面對龐大的用戶群體,這樣一來所發布的容器數量必然不少。而單機的 dockerfile 相比起來就相形見絀了。因此,像 Fig 這樣的工具就孕育而生了。如果說 dockerfile 重現一個容器,那 docker-componse 就是重現容器的配置和集群了。

在 docker 中,“編排”和“部署”這兩個詞是時常出現的,那么它們具體指什么呢?

  • 編排(orchestration):它根據被部署的對象之間的耦合關系,以及被部署對象對環境的依賴,制定部署流程中各個動作的執行順序,部署過程中所需要的依賴文件和被部署文件的存儲位置和獲取方式,以及如何驗證部署成功。這些信息都會在編排工具中以指定的格式(比如配置文件或者特定的代碼)來要求運維人員定義並保存起來,從而保證這個流程能夠隨時在全新的環境中可靠有序地重現出來。
  • 部署(deployment),它是指按照編排所指定地內容和流程,在目標機器上執行編排指定環境初始化,存放指定地依賴和文件,運行指定地部署動作,最終按照編排中地規則來確定部署成功。

總地來說,編排制定流程,部署執行流程,協同完成容器雲的創建。

安裝 docker-compose

dcoekr-componse 的安裝方式如下:

# curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# chomd +x /usr/local/bin/docker-compose

docker-compose 簡單實例

下面我們來用一個簡單實例來說明 docker-compose 的用法:

1.創建一個 docker-compose 的目錄

# mkdir composetest
# cd composetest

2.在目錄中創建 app.py 並添加以下代碼:

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)


def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)


@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

3.在目錄下創建 python 代碼的依賴文件 requirements.txt 並添加依賴項:

redis
flask

4.創建 Dockerfile 文件

# 以 python:3.7-alpine 為基礎鏡像,創建鏡像
FROM python:3.7-alpine
# 設置工作目錄為 /code
WORKDIR /code
# 設置環境變量
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
# alpine 安裝軟件包
RUN apk add --no-cache gcc musl-dev linux-headers
# 從主機上復制 python 的依賴文件
COPY requirements.txt requirements.txt
# 安裝依賴
RUN pip install -r requirements.txt
# 復制 composetest 目錄中的所有文件到工作目錄中
COPY . .
# 運行 python 應用
CMD ["flask", "run"]

5.定義 docker-compose.yml 文件

version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

6.從 docker-compose 構建並啟動應用

# docker-compose up

執行成功后,服務會啟動並綁定端口 5000。

docker-compose 模板語法

目前 docker-compose 模板已經更新到 v3 版本,支持眾多指令:



1.build

指定 Dockerfile 所在⽂件夾的路徑(可以是絕對路徑, 或者相對dockercompose.yml⽂件的路徑) 。 Compose將會利⽤它⾃動構建應⽤鏡像, 然后使⽤這個鏡像, 例如:

version: '3'
services:
    app:
        build: /path/to/build/dirbuild

指令還可以指定創建鏡像的上下⽂、 Dockerfile路徑、 標簽、 Shm⼤⼩、 參數和緩存來源等, 例如:

version: '3'
    services:
        app:
            build:
            context: /path/to/build/dir
            dockerfile: Dockerfile-app
            labels:
                version: "2.0"
                released: "true"
            shm_size: '2gb'
            args:
                key: value
            name: myApp
            cache_from:
                - myApp:1.0

2.cap_add, cap_drop

指定容器的內核能⼒(capacity) 分配。 例如, 讓容器擁有所有能⼒可以指定為:

cap_add:
    - ALL

去掉NET_ADMIN能⼒可以指定為:

cap_drop:
    - NET_ADMIN

3.command

覆蓋容器啟動后默認執⾏的命令, 可以為字符串格式或JSON數組格式。 例如:

command: echo "hello world"

或者:

command: ["bash", "-c", "echo", "hello world"]

4.configs

在Docker Swarm模式下, 可以通過configs來管理和訪問⾮敏感的配置信息。 ⽀持從⽂件讀取或外部讀取。 例如:

version: "3.3"
    services:
    app:
        image: myApp:1.0
        deploy:
            replicas: 1
configs:
    - file_config
    - external_config
configs:
    file_config:
        file: ./config_file.cfg
external_config:
    external: true

5.cgroup_parent

指定⽗cgroup組, 意味着將繼承該組的資源限制。 ⽬前不⽀持在Swarm模式中使⽤。 例如, 創建了⼀個cgroup組名稱為cgroups_1:

cgroup_parent: cgroups_1

6.container_name

指定容器名稱。 默認將會使⽤“項⽬名稱_服務名稱_序號”這樣的格式。 ⽬前不⽀持在Swarm模式中使⽤。 例如:

container_name: docker-web-container

注意, 指定容器名稱后, 該服務將⽆法進⾏擴展, 因為Docker不允許多個容器實例重名。

7.devices指定設備映射關系, 不⽀持Swarm模式。 例如:

devices:
    - "/dev/ttyUSB1:/dev/ttyUSB0"

8.depends_on

指定多個服務之間的依賴關系。 啟動時, 會先啟動被依賴服務。 例
如, 可以指定依賴於db服務:

depends_on: db

9.dns

⾃定義DNS服務器。 可以是⼀個值, 也可以是⼀個列表。 例如:

dns: 8.8.8.8

dns:
    - 8.8.8.8
    - 9.9.9.9

配置DNS搜索域。 可以是⼀個值, 也可以是⼀個列表。 例如:

dns_search: example.com
dns_search:
    - domain1.example.com
    - domain2.example.com

11.dockerfile

如果需要, 指定額外的編譯鏡像的Dockefile⽂件, 可以通過該指令來指定。 例如:

dockerfile: Dockerfile-alternate

注意:該指令不能跟image同時使⽤, 否則Compose將不知道根據哪個指令來⽣成最終的服務鏡像。

12.entrypoint

覆蓋容器中默認的⼊⼜命令。 注意, 也會取消掉鏡像中指定的⼊⼜命令和默認啟動命令。 例如, 覆蓋為新的⼊⼜命令:

entrypoint: python app.py

13.env_file

從⽂件中獲取環境變量, 可以為單獨的⽂件路徑或列表。 如果通過 docker-compose-f FILE⽅式來指定Compose模板⽂件, 則env_file中變量的路徑會基於模板⽂件路徑。 如果有變量名稱與environment指令沖突, 則按照慣例, 以后者為准。 例如:

env_file: .env
env_file:
    - ./common.env
    - ./apps/web.env
    - /opt/secrets.env

環境變量⽂件中每⼀⾏必須符合格式, ⽀持#開頭的注釋⾏, 例如:

# common.env: Set development environment
PROG_ENV=development

14.environment

設置環境變量, 可以使⽤數組或字典兩種格式。 只給定名稱的變量會⾃動獲取運⾏Compose主機上對應變量的值, 可以⽤來防⽌泄露不必要的數據。 例如:

environment:
    RACK_ENV: developmentSESSION_SECRET:

或者:

environment:
    - RACK_ENV=development
    - SESSION_SECRET

注意:如果變量名稱或者值中⽤到 true | false, yes | no 等表達布爾含義的詞匯, 最好放到引號⾥, 避免YAML⾃動解析某些內容為對應的布爾語義:http://yaml.org/type/bool.html中給出了這些特定詞匯, 包括

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

15.expose

暴露端口, 但不映射到宿主機, 只被連接的服務訪問。 僅可以指定內部端口為參數, 如下所⽰:

expose:
    - "3000"
    - "8000"

16.extends

基於其他模板⽂件進⾏擴展。 例如, 我們已經有了⼀個webapp服務,定義⼀個基礎模板⽂件為 common.yml, 如下所⽰:

# common.yml
webapp:
    build: ./webapp
    environment:
        - DEBUG=false
       - SEND_EMAILS=false

再編寫⼀個新的development.yml⽂件, 使⽤common.yml中的webapp服務進⾏擴展:

# development.yml
web:
    extends:
        file: common.yml
    service: webapp
    ports:
        - "8000:8000"
    links:
        - db
    environment:
        - DEBUG=true
db:
    image: postgres

后者會⾃動繼承 common.yml 中的 webapp 服務及環境變量定義。 使⽤extends需要注意以下兩點:

  • 要避免出現循環依賴, 例如A依賴B, B依賴C, C反過來依賴A的情況。
  • extends不會繼承 links 和 volumes_from 中定義的容器和數據卷資源。⼀般情況下, 推薦在基礎模板中只定義⼀些可以共享的鏡像和環境變量, 在擴展模板中具體指定應⽤變量、 鏈接、 數據卷等信息。

鏈接到docker-compose.yml外部的容器, 甚⾄並⾮Compose管理的外部容器。 參數格式跟links類似。

external_links:
    - redis_1
    - project_db_1:mysql
    - project_db_1:postgresql

18.extra_hosts

類似 Docker 中的 --add-host 參數, 指定額外的host名稱映射信息。例如:

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

會在啟動后的服務容器中 /etc/hosts ⽂件中添加如下兩條條⽬。

8.8.8.8 googledns
52.1.157.61 dockerhub

19.healthcheck

指定檢測應⽤健康狀態的機制, 包括檢測⽅法(test) 、 間隔(interval) 、 超時(timeout) 、 重試次數(retries) 、 啟動等待時間(start_period) 等。例如, 指定檢測⽅法為訪問8080端口, 間隔為30秒, 超時為15秒, 重試3次, 啟動后等待30秒再做檢查。

healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost:8080"]
    interval: 30s
    timeout: 15s
    retries: 3
    start_period: 30s

20.image

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

image: ubuntu
image: orchardup/postgresql
image: a4bc65fd

21.isolation

配置容器隔離的機制, 包括default、 process 和 hyperv。

22.labels為容器添加Docker元數據(metadata) 信息。 例如可以為容器添加輔助說明信息。

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

注意: links命令屬於舊的⽤法, 可能在后續版本中被移除。鏈接到其他服務中的容器。 使⽤服務名稱(同時作為別名) 或服務名稱: 服務別名(SERVICE: ALIAS) 格式都可以。

links:
    - db
    - db:database
    - redis

使⽤的別名將會⾃動在服務容器中的 /etc/hosts ⾥創建。 例如:

172.17.2.186 db
172.17.2.186 database
172.17.2.187 redis

被鏈接容器中相應的環境變量也將被創建。

24.logging

跟⽇志相關的配置, 包括⼀系列⼦配置。logging.driver: 類似於 Docker 中的 --log-driver 參數, 指定⽇志驅動類型。 ⽬前⽀持三種⽇志驅動類型:

  • driver: "json-file"
  • driver: "syslog"
  • driver: "none"logging.

options: ⽇志驅動的相關參數。 例如:

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

或:

logging:
    driver: "json-file"
    options:
        max-size: "1000k"
        max-file: "20"

25.network_mode

設置⽹絡模式。 使⽤和docker client的--net參數⼀樣的值。

network_mode: "none"
network_mode: "bridge"
network_mode: "host"
network_mode: "service:[service name]"
network_mode: "container:[name or id]"

26.networks

所加⼊的⽹絡。 需要在頂級的 networks 字段中定義具體的⽹絡信息。例如, 指定web服務的⽹絡為web_net, 並添加服務在⽹絡中別名為web_app。

services:
    web:
    networks:
        web_net:
        aliases: web_app
        ipv4_address: 172.16.0.10
networks:
    web_net:
        driver: bridge
        enable_ipv6: true  
        ipam:
            driver: default
        config:
            subnet: 172.16.0.0/24

27.pid

跟主機系統共享進程命名空間。 打開該選項的容器之間, 以及容器和宿主機系統之間可以通過進程ID來相互訪問和操作。

pid: "host"

28.ports

暴露端口信息。使⽤宿主: 容器(HOST: CONTAINER) 格式, 或者僅僅指定容器的端口(宿主將會隨機選擇端口) 都可以。

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

或者:

ports:
    - target: 80
      published: 8080
      protocol: tcp
      mode: ingress

注意:當使⽤HOST: CONTAINER格式來映射端口時, 如果你使⽤的容器端口⼩於60並且沒放到引號⾥, 可能會得到錯誤結果, 因為YAML會⾃動解析 xx: yy 這種數字格式為60進制。 為避免出現這種問題, 建議數字串都采⽤引號包括起來的字符串格式。

29.secrets

配置應⽤的秘密數據。可以指定來源秘密、 掛載后名稱、 權限等。例如:

version: "3.1"
services:
    web:
        image: webapp:stable
        deploy:
            replicas: 2
        secrets:
            - source: web_secret
              target: web_secret
              uid: '103'
              gid: '103'
              mode: 0444
secrets:
    web_secret:
        file: ./web_secret.txt

30.security_opt

指定容器模板標簽(label) 機制的默認屬性(⽤戶、 ⾓⾊、 類型、 級別等) 。例如, 配置標簽的⽤戶名和⾓⾊名:

security_opt:
    - label:user:USER
    - label:role:ROLE

31.stop_grace_period

指定應⽤停⽌時, 容器的優雅停⽌期限。 過期后則通過SIGKILL強制退出。默認值為10s。

32.stop_signal

指定停⽌容器的信號, 默認為SIGTERM。

33.sysctls配置容器內的內核參數。 Swarm模式中不⽀持。例如, 指定連接數為4096和開啟TCP的syncookies:

sysctls:
    net.core.somaxconn: 4096
    net.ipv4.tcp_syncookies: 1

34.ulimits
指定容器的ulimits限制值。例如, 指定最⼤進程數為65535, 指定⽂件句柄數為20000(軟限制,應⽤可以隨時修改, 不能超過硬限制) 和40000(系統硬限制, 只能root⽤戶提⾼) 。

ulimits:
    nproc: 65535
    nofile:
        soft: 20000
        hard: 40000

35.userns_mode
指定⽤戶命名空間模式。 Swarm模式中不⽀持。 例如, 使⽤主機上的⽤戶命名空間:

userns_mode: "host"

36.volumes

數據卷所掛載路徑設置。 可以設置宿主機路徑(HOST:CONTAINER) 或加上訪問模式(HOST: CONTAINER: ro) 。⽀持driver、 driver_opts、 external、 labels、 name等⼦配置。該指令中路徑⽀持相對路徑。 例如

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

或者可以使⽤更詳細的語法格式:

volumes:
    - type: volume
      source: mydata
      target: /data
      volume:
         nocopy: true
volumes:
    mydata:

37.restart

指定重啟策略, 可以為no(不重啟) 、 always(總是) 、 onfailure(失敗時) 、 unless-stopped(除⾮停⽌) 。注意Swarm模式下要使⽤restart_policy。 在⽣產環境中推薦配置為always或者unless-stopped。例如, 配置除⾮停⽌:

restart: unless-stopped

38.deploy

指定部署和運⾏時的容器相關配置。 該命令只在Swarm模式下⽣效,且只⽀持docker stack deploy命令部署。例如:

version: '3'
services:
    redis:
        image: web:stable
        deploy:
            replicas: 3
            update_config:
                parallelism: 2
                delay: 10s
            restart_policy:
                condition: on-failure

deploy命令中包括 endpoint_mode、 labels、 mode、 placement、replicas、 resources、 restart_policy、 update_config等配置項。

(1) endpoint_mode

指定服務端點模式。 包括兩種類型:

  • vip: Swarm分配⼀個前端的虛擬地址, 客戶端通過給地址訪問服務,⽽⽆須關⼼后端的應⽤容器個數;
  • dnsrr: Swarm分配⼀個域名給服務, ⽤戶訪問域名時候回按照輪流順序返回容器地址。

例如:

version: '3'
services:
    redis:
        image: web:stable
        deploy:
            mode: replicated
            replicas: 3
            endpoint_mode: vip

(2) labels

指定服務的標簽。 注意標簽信息不會影響到服務內的容器。例如:

version: "3"
services:
    web:
        image: web:stable
        deploy:
            labels:
                description: "This is a web application service."

(3) mode

定義容器副本模式, 可以為:global: 每個Swarm節點上只有⼀個該應⽤容器;replicated: 整個集群中存在指定份數的應⽤容器副本, 默認值。例如, 指定集群中web應⽤保持3個副本:

version: "3"
services:
    web:
        image: web:stable
        deploy:
            mode: replicated
            replicas: 3

(4) placement

定義容器放置的限制(constraints) 和配置(preferences) 。 限制可以指定只有符合要求的節點上才能運⾏該應⽤容器; 配置可以指定容器的分配策略。 例如, 指定集群中web應⽤容器只存在於⾼安全的節點上, 並且在帶有zone標簽的節點上均勻分配。

version: '3'
     services:
        db:
            image: web:stable
            deploy:
                placement:
                    constraints:
                        - node.labels.security==high
                    preferences:
                        - spread: node.labels.zone

(5) replicas

容器副本模式為默認的replicated時, 指定副本的個數。

(6) resources

指定使⽤資源的限制, 包括CPU、 內存資源等。 例如, 指定應⽤使⽤的CPU份額為10%~25%, 內存為200 MB到500 MB。

version: '3'
services:
    redis:
        image: web:stable
        deploy:
            resources:
                limits:
                    cpus: '0.25'
                    memory: 500M
                reservations:
                    cpus: '0.10'
                    memory: 200M

(7) restart_policy

指定容器重啟的策略。 例如, 指定重啟策略為失敗時重啟, 等待2s,重啟最多嘗試3次, 檢測狀態的等待時間為10s。

version: "3"
services:
    redis:
        image: web:stable
        deploy:
            restart_policy:
                condition: on-failure
                delay: 2s
                max_attempts: 3
                window: 10s

(8) update_config

有些時候需要對容器內容進⾏更新, 可以使⽤該配置指定升級的⾏為。 包括每次升級多少個容器(parallelism) 、 升級的延遲(delay) 、 升級失敗后的⾏動(failure_action) 、 檢測升級后狀態的等待時間(monitor) 、 升級后容忍的最⼤失敗⽐(max_failure_ratio) 、 升級順序(order) 等。 例如, 指定每次更新兩個容器、 更新等待10s、 先停⽌舊容器再升級。

version: "3.4"
services:
     redis:
         image: web:stable
         deploy:
             replicas: 2
         update_config:
             parallelism: 2
             delay: 10s
             order: stop-first

39.其他指令

此外, 還有包括domainname、 hostname、 ipc、 mac_address、privileged、 read_only、 shm_size、 stdin_open、 tty、 user、 working_dir等指令, 基本跟docker-run中對應參數的功能⼀致。 例如, 指定容器中⼯作⽬錄:

working_dir: /code

指定容器中搜索域名、 主機名、 mac地址等:

domainname: your_website.com
hostname: test
mac_address: 08-00-27-00-0C-0A

允許容器中運⾏⼀些特權命令:

privileged: true

40.讀取環境變量

從1.5.0版本開始, Compose模板⽂件⽀持動態讀取主機的系統環境變量。 例如, 下⾯的Compose⽂件將從運⾏它的環境中讀取變量${MONGO_VERSION}的值(不指定時則采⽤默認值3.2) , 並寫⼊執⾏的指令中。

db:
    image: "mongo:${MONGO_VERSION-3.2}"

如果直接執⾏docker-compose up則會啟動⼀個mongo: 3.2鏡像的容器; 如果執⾏MONGO_VERSION=2.8 docker-compose up 則會啟動⼀個mongo: 2.8鏡像的容器。

41.擴展特性

從3.4開始, Compose還⽀持⽤戶⾃定義的擴展字段。 利⽤YAML語法⾥的錨點引⽤功能來引⽤⾃定義字段內容。 例如:version: '3.4'

x-logging:
    &default-logging
    options:
        max-size: '10m'
        max-file: '10'
    driver: json-file
services:
    web:
        image: webapp:stable
        logging: *default-logging

docker-compose 命令

docker-compose 命令的格式為:docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...],命令支持以下選項:

  • -f, --file FILE: 指定使⽤的Compose模板⽂件, 默認為dockercompose.yml, 可以多次指定;
  • -p, --project-name NAME: 指定項⽬名稱, 默認將使⽤所在⽬錄名稱作為項⽬名;
  • --verbose: 輸出更多調試信息;
  • -v, --version: 打印版本並退出;
  • -H, -host HOST: 指定所操作的Docker服務地址;
  • -tls: 啟⽤TLS, 如果指定-tlsverify則默認開啟;
  • -tlscacert CA_PATH: 信任的TLS CA的證書;
  • -tlscert CLIENT_CERT_PATH: 客戶端使⽤的TLS證書;
  • -tlskey TLS_KEY_PATH: TLS的私鑰⽂件路徑;
  • -tlsverify: 使⽤TLS校驗連接對⽅;·-skip-hostname-check: 不使⽤TLS證書校驗對⽅的主機名;
  • -project-directory PATH: 指定⼯作⽬錄, 默認為Compose⽂件所在路徑。

docker-compose 還支持以下子命令


1.build

格式為docker-compose build [options] [SERVICE...]。構建(重新構建) 項⽬中的服務容器。服務容器⼀旦構建后, 將會帶上⼀個標記名, 例如對於Web項⽬中的⼀個db容器, 可能是web_db。可以隨時在項⽬⽬錄下運⾏docker-compose build來重新構建服務。選項包括:

  • --force-rm: 強制刪除構建過程中的臨時容器;
  • --no-cache: 構建鏡像過程中不使⽤cache(這將加長構建過程) ;
  • --pull: 始終嘗試通過pull來獲取更新版本的鏡像;
  • -m, -memory MEM: 指定創建服務所使⽤的內存限制;
  • -build-arg key=val: 指定服務創建時的參數。

2.bundle

格式為docker-compose bundle [options]。創建⼀個可分發(Distributed Application Bundle, DAB) 的配置包,包括整個服務棧的所有數據, 他⼈可以利⽤該⽂件啟動服務棧。⽀持選項包括:

  • -push-images: ⾃動推送鏡像到倉庫;
  • -o, -output PATH: 配置包的導出路徑。

3.config

格式為docker-compose config [options]。校驗和查看Compose⽂件的配置信息。⽀持選項包括:

  • -resolve-image-digests: 為鏡像添加對應的摘要信息;
  • -q, -quiet: 只檢驗格式正確與否, 不輸出內容;
  • --services: 打印出Compose中所有的服務信息;·-volumes: 打印出Compose中所有的掛載卷信息;

4.down

格式為docker-compose down [options]。停⽌服務棧, 並刪除相關資源, 包括容器、 掛載卷、 ⽹絡、 創建鏡像等。默認情況下只清除所創建的容器和⽹絡資源。⽀持選項包括:

  • --rmi type: 指定刪除鏡像的類型, 包括all(所有鏡像) , local(僅本地) ;
  • -v, -volumes: 刪除掛載數據卷;
  • --remove-orphans: 清除孤⼉容器, 即未在Compose服務中定義的容器;
  • -t, -timeout TIMEOUT: 指定超時時間, 默認為10s。

5.events

格式為docker-compose events [options] [SERVICE...]。實時監控容器的事件信息。⽀持選項包括 -json: 以Json對象流格式輸出事件信息。

6.exec

格式為docker-compose exec [options] [-e KEY=VAL...] SERVICECOMMAND [ARGS...]。在⼀個運⾏中的容器內執⾏給定命令。⽀持選項包括:

  • -d: 在后台運⾏命令;
  • --privileged: 以特權⾓⾊運⾏命令;
  • -u, -user USER: 以給定⽤戶⾝份運⾏命令;
  • -T: 不分配TTY偽終端, 默認情況下會打開;
  • --index=index: 當服務有多個容器實例時指定容器索引, 默認為第⼀個;
  • -e, -env KEY=VAL: 設置環境變量。

7.help

獲得⼀個命令的幫助。

8.images

格式為docker-compose images [options] [SERVICE...]。列出服務所創建的鏡像。⽀持選項為:

  • --q: 僅顯⽰鏡像的ID。

9.kill

格式為docker-compose kill [options] [SERVICE...]。通過發送SIGKILL信號來強制停⽌服務容器。⽀持通過-s參數來指定發送的信號, 例如通過如下指令發送SIGINT信號。

$ docker-compose kill -s SIGINT

10.logs

格式為docker-compose logs [options] [SERVICE...]。查看服務容器的輸出。 默認情況下, docker-compose 將對不同的服務輸出使⽤不同的顏⾊來區分。 可以通過 --no-color 來關閉顏⾊。該命令在調試問題的時候⼗分有⽤。⽀持選項為:

  • --no-color: 關閉彩⾊輸出;
  • -f, -follow: 持續跟蹤輸出⽇志消息;
  • --t, -timestamps: 顯⽰時間戳信息;
  • --tail="all": 僅顯⽰指定⾏數的最新⽇志消息。

11.pause

格式為docker-compose pause [SERVICE...]。暫停⼀個服務容器。

12.port

格式為docker-compose port [options] SERVICE PRIVATE_PORT。打印某個容器端⼜所映射的公共端⼜。選項:

  • --protocol=proto: 指定端⼜協議, tcp(默認值) 或者udp;
  • --index=index: 如果同⼀服務存在多個容器, 指定命令對象容器的序號(默認為1) 。

13.ps

格式為docker-compose ps [options] [SERVICE...]。列出項⽬中⽬前的所有容器。選項包括

  • -q: 只打印容器的ID信息。

14.pull

格式為docker-compose pull [options] [SERVICE...]。拉取服務依賴的鏡像。選項包括 --ignore-pull-failures: 忽略拉取鏡像過程中的錯誤。

15.push

格式為docker-compose push [options] [SERVICE...]。推送服務創建的鏡像到鏡像倉庫。選項包括 --ignore-push-failures: 忽略推送鏡像過程中的錯誤。

16.restart

格式為docker-compose restart [options] [SERVICE...]。重啟項⽬中的服務。選項包括

  • -t, --timeout TIMEOUT: 指定重啟前停⽌容器的超時(默認為10秒) 。

17.rm

格式為docker-compose rm [options] [SERVICE...]。刪除所有(停⽌狀態的) 服務容器。 推薦先執⾏docker-compose stop命令來停⽌容器。選項:

  • -f, --force: 強制直接刪除, 包括⾮停⽌狀態的容器。 ⼀般盡量不要使⽤該選項。
  • -v: 刪除容器所掛載的數據卷。

18.run

格式為docker-compose run [options] [-p PORT...] [-eKEY=VAL...] SERVICE [COMMAND] [ARGS...]。在指定服務上執⾏⼀個命令。例如:

$ docker-compose run ubuntu ping docker.com

將會啟動⼀個ubuntu服務容器, 並執⾏ping docker.com命令。默認情況下, 如果存在關聯, 則所有關聯的服務將會⾃動被啟動, 除⾮這些服務已經在運⾏中。該命令類似啟動容器后運⾏指定的命令, 相關卷、 鏈接等等都將會按照配置⾃動創建。
兩個不同點:

  • 給定命令將會覆蓋原有的⾃動運⾏命令;
  • 會⾃動創建端口, 以避免沖突。如果不希望⾃動啟動關聯的容器, 可以使⽤--no-deps選項, 例如
$ docker-compose run --no-deps web python manage.py shell

將不會啟動web容器所關聯的其他容器。選項:

  • -d: 后台運⾏容器;
  • --name NAME: 為容器指定⼀個名字;·--entrypoint CMD: 覆蓋默認的容器啟動指令;
  • -e KEY=VAL: 設置環境變量值, 可多次使⽤選項來設置多個環境變量;
  • -u, --user="": 指定運⾏容器的⽤戶名或者uid;
  • --no-deps: 不⾃動啟動關聯的服務容器;
  • --rm: 運⾏命令后⾃動刪除容器, d模式下將忽略;
  • -p, --publish=[]: 映射容器端⼜到本地主機;
  • --service-ports: 配置服務端⼜並映射到本地主機;
  • -T: 不分配偽tty, 意味着依賴tty的指令將⽆法運⾏。

19.scale

格式為docker-compose scale [options] [SERVICE=NUM...]。設置指定服務運⾏的容器個數。通過service=num的參數來設置數量。 例如:

$ docker-compose scale web=3 db=2

將啟動3個容器運⾏web服務, 2個容器運⾏db服務。⼀般的, 當指定數⽬多於該服務當前實際運⾏容器, 將新創建並啟動容器; 反之, 將停⽌容器。選項包括-t, --timeout TIMEOUT: 停⽌容器時候的超時(默認為10秒) 。

20.start

格式為docker-compose start [SERVICE...]。啟動已經存在的服務容器。

21.stop

格式為docker-compose stop [options] [SERVICE...]。停⽌已經處於運⾏狀態的容器, 但不刪除它。 通過 docker-compose start 可以再次啟動這些容器。選項包括

  • -t, --timeout TIMEOUT: 停⽌容器時候的超時(默認為10秒) 。

22.top

格式為docker-compose top [SERVICE...]。顯⽰服務棧中正在運⾏的進程信息。

23.unpause

格式為docker-compose unpause [SERVICE...]。恢復處於暫停狀態中的服務。

24.up

格式為docker-compose up [options] [SERVICE...]。該命令⼗分強⼤, 它將嘗試⾃動完成包括構建鏡像, (重新) 創建服務, 啟動服務, 並關聯服務相關容器的⼀系列操作。鏈接的服務都將會被⾃動啟動, 除⾮已經處於運⾏狀態。可以說, ⼤部分時候都可以直接通過該命令來啟動⼀個項⽬。默認情況, docker-compose up 啟動的容器都在前台, 控制台將會同時打印所有容器的輸出信息, 可以很⽅便進⾏調試。當通過 Ctrl-C 停⽌命令時, 所有容器將會停⽌。如果使⽤docker-compose up -d, 將會在后台啟動並運⾏所有的容器。
⼀般推薦⽣產環境下使⽤該選項。

默認情況, 如果服務容器已經存在, docker-compose up將會嘗試停⽌容器, 然后重新創建(保持使⽤volumes-from掛載的卷) , 以保證新啟動的服務匹配 docker-compose.yml ⽂件的最新內容。 如果⽤戶不希望容器被停⽌並重新創建, 可以使⽤ docker-compose up --no-recreate。 這樣將只會啟動處於停⽌狀態的容器, ⽽忽略已經運⾏的服務。 如果⽤戶只想重新部署某個服務, 可以使⽤docker-compose up --no-deps -d <SERVICE_NAME>來重新創建服務並后台停⽌舊服務, 啟動新服務, 並不會影響到其所依賴的服務。

選項:

  • -d: 在后台運⾏服務容器;
  • --no-color: 不使⽤顏⾊來區分不同的服務的控制台輸出;
  • --no-deps: 不啟動服務所鏈接的容器;
  • --force-recreate: 強制重新創建容器, 不能與--no-recreate同時使⽤;
  • --no-recreate: 如果容器已經存在了, 則不重新創建, 不能與--forcerecreate同時使⽤;
  • --no-build: 不⾃動構建缺失的服務鏡像;
  • --abort-on-container-exit: 當有容器停⽌時中⽌整個服務, 與-d選項沖突。
  • -t, --timeout TIMEOUT: 停⽌容器時候的超時(默認為10秒) , 與 -d 選項沖突;
  • --remove-orphans: 刪除服務中未定義的孤⼉容器;
  • --exit-code-from SERVICE: 退出時返回指定服務容器的退出符;
  • --scale SERVICE=NUM: 擴展指定服務實例到指定數⽬。

25.version

格式為docker-compose version。打印版本信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM