Docker 容器編排利器 Docker Compose

Compose 簡介

  

  通過前面幾篇文章的學習,我們可以通過 Dockerfile 文件讓用戶很方便的定義一個單獨的應用容器。然而,在日常工作中,經常會碰到需要多個容器相互配合來完成某項任務的情況,例如之前我給大家講過的《Docker 搭建 Redis Cluster 集羣》,或者開發一個 Web 應用,除了 Web 服務容器本身,還需要數據庫服務容器、緩存容器,甚至還包括負載均衡容器等等。

  Docker Compose 恰好滿足了這樣的需求,它是用於定義和運行多容器 Docker 應用程序的工具。通過 Compose,您可以使用 YAML 文件來配置應用程序所需要的服務。然後使用一個命令,就可以通過 YAML 配置文件創建並啓動所有服務。

  Docker Compose 項目是 Docker 官方的開源項目,來源於之前的 Fig 項目,使用 Python 語言編寫。負責實現對 Docker 容器集羣的快速編排。項目地址爲:https://github.com/docker/compose/releases

  Docker Compose 使用的三個步驟爲:

  • 使用 Dockerfile 文件定義應用程序的環境;
  • 使用 docker-compose.yml 文件定義構成應用程序的服務,這樣它們可以在隔離環境中一起運行;
  • 最後,執行 docker-compose up 命令來創建並啓動所有服務。

  

Compose 安裝

  

下載

  

  官方文檔:https://docs.docker.com/compose/install/

  您可以在 macOS,Windows 和 Linux 上運行 Compose。本文演示基於 Linux 環境的安裝。我們可以使用 curl 命令從 Github 下載它的二進制文件來使用,運行以下命令下載 Docker Compose 的當前穩定版本。或者從網頁下載後上傳至服務器指定目錄 /usr/local/bin 也行。

sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

  

  因爲 Docker Compose 存放在 GitHub,可能不太穩定。你也可以通過執行下面的命令,高速安裝 Compose。該加速通道由 DaoCloud 提供:http://get.daocloud.io/#install-compose

sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

  您可以通過修改 URL 中的版本,自定義您所需要的版本文件。

  

授權

  

  安裝完成以後,查看指定目錄,發現該文件沒有可執行權限,進行授權操作。

# 將可執行權限應用於該二進制文件
sudo chmod +x /usr/local/bin/docker-compose

  

測試

  

docker-compose --version

  

卸載

  

  卸載 Compose 非常簡單,直接刪除二進制文件即可。

sudo rm /usr/local/bin/docker-compose

  

docker-compose.yml 文件詳解

  

概念

  

  官方文檔:https://docs.docker.com/compose/compose-file/

  Docker Compose 允許用戶通過 docker-compose.yml 文件(YAML 格式)來定義一組相關聯的容器爲一個工程(project)。一個工程包含多個服務(service),每個服務中定義了創建容器時所需的鏡像、參數、依賴等。

工程名若無特殊指定,即爲 docker-compose.yml 文件所在目錄的名稱。

  Docker Compose 模板文件我們需要關注的頂級配置有 versionservicesnetworksvolumes 幾個部分,除 version 外,其他幾個頂級配置下還有很多下級配置,後面也會詳細給大家介紹,先來看看這幾個頂級配置都什麼意思:

  • version:描述 Compose 文件的版本信息,當前最新版本爲 3.8,對應的 Docker 版本爲 19.03.0+
  • services:定義服務,可以多個,每個服務中定義了創建容器時所需的鏡像、參數、依賴等;
  • networkds:定義網絡,可以多個,根據 DNS server 讓相同網絡中的容器可以直接通過容器名稱進行通信;
  • volumes:數據卷,用於實現目錄掛載。

  

案例

  

  在配置文件中,所有的容器通過 services 來定義,然後使用 docker-compose 腳本來啓動,停止和重啓容器,非常適合多個容器組合使用進行開發的場景。我們先從一個簡單的 Compose 案例學起。

  編寫 docker-compose.yml 文件。

# 創建目錄
mkdir -p /usr/local/docker-nginx
# 切換至指定目錄
cd /usr/local/docker-nginx/
# 編寫 docker-compose.yml 文件
vi docker-compose.yml

  

  在文件中添加以下內容:

# 描述 Compose 文件的版本信息
version: "3.8"
# 定義服務,可以多個
services:
  nginx: # 服務名稱
    image: nginx # 創建容器時所需的鏡像
    container_name: mynginx # 容器名稱,默認爲"工程名稱_服務條目名稱_序號"
    ports: # 宿主機與容器的端口映射關係
      - "80:80" # 左邊宿主機端口:右邊容器端口
    networks: # 配置容器連接的網絡,引用頂級 networks 下的條目
      - nginx-net

# 定義網絡,可以多個。如果不聲明,默認會創建一個網絡名稱爲"工程名稱_default"的 bridge 網絡
networks:
  nginx-net: # 一個具體網絡的條目名稱
    name: nginx-net # 網絡名稱,默認爲"工程名稱_網絡條目名稱"
    driver: bridge # 網絡模式,默認爲 bridge

  

  使用 docker-compose up 創建並啓動所有服務。這個簡單的案例中就只有一個 Nginx 後續我們會來一些複雜的練習:

# 前臺啓動
docker-compose up
# 後臺啓動
docker-compose up -d

  

  瀏覽器訪問:http://192.168.10.10/ 結果如下:

  

  使用 docker-compose down 可以停止並刪除容器、網絡。

  

version

  

  描述 Compose 文件的版本信息,當前最新版本爲 3.8,對應的 Docker 版本爲 19.03.0+。關於每個版本的詳細信息請參考:https://docs.docker.com/compose/compose-file/compose-versioning/

  以下爲 Compose 文件的版本信息所對應的 Docker 版本。

Compose file format Docker Engine release
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+
1.0 1.9.1.+

  

services

  

  剛纔我們提到 docker-compose.yml 文件中包含很多下級配置項,下面帶大家把一些常用的配置項詳細瞭解一下,先從頂級配置 services 開始。

  services 用來定義服務,可以多個,每個服務中定義了創建容器時所需的鏡像、參數、依賴等,就像將命令行參數傳遞給 docker run 一樣。同樣,網絡和數據卷的定義也是一樣的。

  比如,之前我們通過 docker run 命令構建一個 MySQL 應用容器的命令如下:

docker run -di --name mysql8 -p 3306:3306 -v /mydata/docker_mysql/conf:/etc/mysql/conf.d -v /mydata/docker_mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 mysql:8

  使用 docker-compose.yml 以後則可以這樣定義:

# 描述 Compose 文件的版本信息
version: "3.8"
# 定義服務,可以多個
services:
  mysql: # 服務名稱
    image: mysql:8 # 創建容器時所需的鏡像
    container_name: mysql8 # 容器名稱,默認爲"工程名稱_服務條目名稱_序號"
    ports: # 宿主機與容器的端口映射關係
      - "3306:3306" # 左邊宿主機端口:右邊容器端口
    environment: # 創建容器時所需的環境變量
      MYSQL_ROOT_PASSWORD: 1234
    volumes:
      - "/mydata/docker_mysql/conf:/etc/mysql/conf.d"
      - "/mydata/docker_mysql/data:/var/lib/mysql"

  然後通過 dokcer-compose 相關命令即可完成容器的創建,停止或刪除等一系列操作。

  

image

  

  指定創建容器時所需的鏡像名稱標籤或者鏡像 ID。如果鏡像在本地不存在,會去遠程拉取。

services:
  web:
    image: hello-world

  

build

  

  除了可以基於指定的鏡像構建容器,還可以基於 Dockerfile 文件構建,在使用 up 命令時會執行構建任務。

  通過 build 配置項可以指定 Dockerfile 所在文件夾的路徑。Compose 將會利用 Dockerfile 自動構建鏡像,然後使用鏡像啓動服務容器。

  build 配置項可以使用絕對路徑,也可以使用相對路徑。

# 絕對路徑,在該路徑下基於名稱爲 Dockerfile 的文件構建鏡像
/usr/local/docker-centos
# 相對路徑,相對當前 docker-compose.yml 文件所在目錄,基於名稱爲 Dockerfile 的文件構建鏡像
.

  

  接下來我們來個稍微複雜點的練習,通過基礎鏡像 centos:7,在該鏡像中安裝 jdk 和 tomcat 以後將其製作爲一個新的鏡像 mycentos:7

  創建目錄並編寫 Dockerfile 文件。

# 創建目錄
mkdir -p /usr/local/docker-centos
# 切換至指定目錄
cd /usr/local/docker-centos/
# 編寫 Dockerfile 文件
vi Dockerfile

  Dockerfile 文件內容如下:

# 指明構建的新鏡像是來自於 centos:7 基礎鏡像
FROM centos:7
# 通過鏡像標籤聲明瞭作者信息
LABEL maintainer="mrhelloworld.com"
# 設置工作目錄
WORKDIR /usr/local
# 新鏡像構建成功以後創建指定目錄
RUN mkdir -p /usr/local/java && mkdir -p /usr/local/tomcat
# 拷貝文件到鏡像中並解壓
ADD jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java
ADD apache-tomcat-9.0.37.tar.gz /usr/local/tomcat
# 暴露容器運行時的 8080 監聽端口給外部
EXPOSE 8080
# 設置容器內 JAVA_HOME 環境變量
ENV JAVA_HOME /usr/local/java/jdk-11.0.6/
ENV PATH $PATH:$JAVA_HOME/bin
# 啓動容器時啓動 tomcat 並查看 tomcat 日誌信息
CMD ["/usr/local/tomcat/apache-tomcat-9.0.37/bin/catalina.sh", "run"]

  將所需的資源包 jdktomcat 上傳至 Dockerfile 同一目錄。

  創建目錄並編寫 docker-compose.yml 文件。

# 描述 Compose 文件的版本信息
version: "3.8"
# 定義服務,可以多個
services:
  mycentos: # 服務名稱
    build: . # 相對當前 docker-compose.yml 文件所在目錄,基於名稱爲 Dockerfile-alternate 的文件構建鏡像
    container_name: mycentos7 # 容器名稱,默認爲"工程名稱_服務條目名稱_序號"
    ports: # 宿主機與容器的端口映射關係
      - "8080:8080" # 左邊宿主機端口:右邊容器端口

  然後通過 dokcer-compose 相關命令即可完成容器的創建,停止或刪除等一系列操作。

  

context

  

  該選項可以是 Dockerfile 文件的絕對/相對路徑,也可以是遠程 Git 倉庫的 URL,當提供的值是相對路徑時,相對當前 docker-compose.yml 文件所在目錄。

build:
  context: . # 相對當前 docker-compose.yml 文件所在目錄,基於名稱爲 Dockerfile 的文件構建鏡像

  

dockerfile

  

  一般情況下,默認都基於文件名叫 Dockerfile 的文件構建鏡像,當然也可以是自定義的文件名,使用 dockerfile 聲明,不過這個選項只能聲明文件名,文件所在路徑還是要通過 centext 來聲明。

build:
  context: . # 相對當前 docker-compose.yml 文件所在目錄
  dockerfile: Dockerfile-alternate # 基於名稱爲 Dockerfile-alternate 的文件構建鏡像

  

container_name

  

  Compose 創建的容器默認生成的名稱格式爲:工程名稱_服務條目名稱_序號。如果要使用自定義名稱,使用 container_name 聲明。

services:
  mycentos:
    build: .
    container_name: mycentos7 # 容器名稱,默認爲"工程名稱_服務條目名稱_序號"

因爲 Docker 容器名稱必須是唯一的,所以如果指定了自定義名稱,就不能將服務擴展至多個容器。這樣做可能會導致錯誤。

  

關於序號

  

  序號是幹什麼用的呢,看下面這個例子你就懂了,docker-compose.yml 文件內容如下:

# 描述 Compose 文件的版本信息
version: "3.8"
# 定義服務,可以多個
services:
  helloworld: # 服務名稱
    image: hello-world

  

  然後通過 --scale 指定 helloworld 服務一次性啓動 3 個。

docker-compose up -d --scale helloworld=3

  

  通過下圖可以看到有 3 個容器被創建,容器名稱最後的序號是從 1 開始累加的,這就是序號的作用。所以如果指定了自定義名稱,就不能將服務擴展至多個容器。

  

depends_on

  

  使用 Compose 最大的好處就是敲最少的命令做更多的事情,但一般項目容器啓動的順序是有要求的,如果直接從上到下啓動容器,必然會因爲容器依賴問題而啓動失敗。例如在沒有啓動數據庫容器的情況下啓動了 Web 應用容器,應用容器會因爲找不到數據庫而退出。depends_on 就是用來解決容器依賴、啓動先後問題的配置項。

version: "3.8"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: mysql

  上述 YAML 文件定義的容器會先啓動 db 和 redis 兩個服務,最後才啓動 web 服務。

  

ports

  

  容器對外暴露的端口,格式:左邊宿主機端口:右邊容器端口

ports:
  - "80:80"
  - "8080:8080"

  

expose

  

  容器暴露的端口不映射到宿主機,只允許能被連接的服務訪問。

expose:
  - "80"
  - "8080"

  

restart

  

  容器重啓策略,簡單的理解就是 Docker 重啓以後容器要不要一起啓動:

  • no:默認的重啓策略,在任何情況下都不會重啓容器;
  • on-failure:容器非正常退出時,比如退出狀態爲非0(異常退出),纔會重啓容器;
  • always:容器總是重新啓動,即使容器被手動停止了,當 Docker 重啓時容器也還是會一起啓動;
  • unless-stopped:容器總是重新啓動,除非容器被停止(手動或其他方式),那麼 Docker 重啓時容器則不會啓動。
services:
  nginx:
    image: nginx
    container_name: mynginx
    ports:
      - "80:80"
    restart: always

  

environment

  

  添加環境變量。可以使用數組也可以使用字典。布爾相關的值(true、false、yes、no)都需要用引號括起來,以確保 YML 解析器不會將它們轉換爲真或假。

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

  或者以下格式:

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

  

env_file

  

  從文件中獲取環境變量,可以指定一個或多個文件,其優先級低於 environment 指定的環境變量。

env_file:
  - /opt/runtime_opts.env # 絕對路徑
  - ./common.env # 相對路徑,相對當前 docker-compose.yml 文件所在目錄
  - ./apps/web.env # 相對路徑,相對當前 docker-compose.yml 文件所在目錄

注意:env 文件中的每一行需採用 鍵=值 格式。以 # 開頭的行會被視爲註釋並被忽略。空行也會被忽略。

  

command

  

  覆蓋容器啓動後默認執行的命令。

command: echo "helloworld"

  該命令也可以是一個列表。

command: ["echo", "helloworld"]

  

volumes

  

  數據卷,用於實現目錄掛載,支持指定目錄掛載匿名掛載具名掛載

  • 指定目錄掛載的格式爲:左邊宿主機目錄:右邊容器目錄,或者左邊宿主機目錄:右邊容器目錄:讀寫權限
  • 匿名掛載格式爲:容器目錄即可,或者容器目錄即可:讀寫權限
  • 具名掛載格式爲:數據卷條目名稱:容器目錄,或者數據卷條目名稱:容器目錄:讀寫權限

關於匿名掛載/具名掛載更多的內容請閱讀《Docker 最常用的鏡像命令和容器命令》文章中容器相關命令部分的目錄掛載(容器數據卷操作)的內容。

# 描述 Compose 文件的版本信息
version: "3.8"
# 定義服務,可以多個
services:
  mysql: # 服務名稱
    image: mysql:8 # 創建容器時所需的鏡像
    container_name: mysql8 # 容器名稱,默認爲"工程名稱_服務條目名稱_序號"
    ports: # 宿主機與容器的端口映射關係
      - "3306:3306" # 左邊宿主機端口:右邊容器端口
    environment: # 創建容器時所需的環境變量
      MYSQL_ROOT_PASSWORD: 1234
    volumes:
      # 絕對路徑
      - "/mydata/docker_mysql/data:/var/lib/mysql"
      # 相對路徑,相對當前 docker-compose.yml 文件所在目錄
      - “./conf:/etc/mysql/conf.d“
      # 匿名掛載,匿名掛載只需要寫容器目錄即可,容器外對應的目錄會在 /var/lib/docker/volume 中生成
      - "/var/lib/mysql"
      # 具名掛載,就是給數據捲起了個名字,容器外對應的目錄會在 /var/lib/docker/volume 中生成
      - "mysql-data-volume:/var/lib/mysql"

# 定義數據卷,可以多個
volumes:
  mysql-data-volume: # 一個具體數據卷的條目名稱
    name: mysql-data-volume # 數據卷名稱,默認爲"工程名稱_數據卷條目名稱"

  

network_mode

  

  設置網絡模式,類似 docker run 時添加的參數 --net host 或者 --network host 的用法。

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

  

networks

  

  配置容器連接的網絡,引用頂級 networks 下的條目。

# 定義服務,可以多個
services:
  nginx: # 服務名稱
    networks: # 配置容器連接的網絡,引用頂級 networks 下的條目
      - nginx-net # 一個具體網絡的條目名稱

# 定義網絡,可以多個。如果不聲明,默認會創建一個網絡名稱爲"工程名稱_default"的 bridge 網絡
networks:
  nginx-net: # 一個具體網絡的條目名稱
    name: nginx-net # 網絡名稱,默認爲"工程名稱_網絡條目名稱"
    driver: bridge # 網絡模式,默認爲 bridge

  

aliases

  

  網絡上此服務的別名。同一網絡上的其他容器可以使用服務名或此別名連接到服務容器。同一服務在不同的網絡上可以具有不同的別名。

# 定義服務,可以多個
services:
  nginx: # 服務名稱
    networks: # 配置容器連接的網絡,引用頂級 networks 下的條目
      nginx-net: # 一個具體網絡的條目名稱
        aliases: # 服務別名,可以多個
          - nginx1 # 同一網絡上的其他容器可以使用服務名或此別名連接到服務容器

# 定義網絡,可以多個。如果不聲明,默認會創建一個網絡名稱爲"工程名稱_default"的 bridge 網絡
networks:
  nginx-net: # 一個具體網絡的條目名稱
    name: nginx-net # 網絡名稱,默認爲"工程名稱_網絡條目名稱"
    driver: bridge # 網絡模式,默認爲 bridge

  

volumes

  

  通過頂級配置 services 的學習,大家應該已經明白頂級配置 volumes 是幹嘛的了,這裏再詳細把配置的不同方式講解一下。

  以下方式的數據卷聲明創建卷時會使用默認的名稱:"工程名稱_數據卷條目名稱"

# 描述 Compose 文件的版本信息
version: "3.8"
# 定義服務,可以多個
services:
  mysql:
    image: mysql:8
    container_name: mysql8
    ports:
      - "3306:3306"
    environment
      MYSQL_ROOT_PASSWORD: 1234
    volumes:
      # 具名掛載,就是給數據捲起了個名字,容器外對應的目錄會在 /var/lib/docker/volume 中生成
      - "mysql-data-volume:/var/lib/mysql"

# 定義數據卷,可以多個
volumes:
  mysql-data-volume: # 一個具體數據卷的條目名稱

  

  以下方式的數據卷聲明創建卷時會使用自定義的名稱。

# 描述 Compose 文件的版本信息
version: "3.8"
# 定義服務,可以多個
services:
  mysql:
    image: mysql:8
    container_name: mysql8
    ports:
      - "3306:3306"
    environment
      MYSQL_ROOT_PASSWORD: 1234
    volumes:
      # 具名掛載,就是給數據捲起了個名字,容器外對應的目錄會在 /var/lib/docker/volume 中生成
      - "mysql-data-volume:/var/lib/mysql"

# 定義數據卷,可以多個
volumes:
  mysql-data-volume: # 一個具體數據卷的條目名稱
    name: mysql-data-volume # 數據卷名稱,默認爲"工程名稱_數據卷條目名稱"

  

networks

  

  通過頂級配置 services 的講解,大家其實已經明白頂級配置 volumes 是幹嘛的了,這裏再詳細把配置的不同方式講解一下。

  如果不聲明網絡,每個工程默認會創建一個網絡名稱爲"工程名稱_default"bridge 網絡。

# 描述 Compose 文件的版本信息
version: "3.8"
# 定義服務,可以多個
services:
  nginx:
    image: nginx
    container_name: mynginx
    ports:
      - "80:80"

# 定義網絡,可以多個。如果不聲明,默認會創建一個網絡名稱爲"工程名稱_default"的 bridge 網絡
#networks:

  

  以下方式的網絡聲明創建網絡時會使用默認的名稱:"工程名稱_網絡條目名稱",網絡模式默認爲 bridge

# 描述 Compose 文件的版本信息
version: "3.8"
# 定義服務,可以多個
services:
  nginx:
    image: nginx
    container_name: mynginx
    ports:
      - "80:80"
    networks: # 配置容器連接的網絡,引用頂級 networks 下的條目
      nginx-net:

# 定義網絡,可以多個
networks:
  nginx-net: # 一個具體網絡的條目名稱

  

  以下方式的網絡聲明創建網絡時會使用自定義的名稱,還可以通過 driver 選擇網絡模式,默認爲 bridge

# 描述 Compose 文件的版本信息
version: "3.8"
# 定義服務,可以多個
services:
  nginx:
    image: nginx
    container_name: mynginx
    ports:
      - "80:80"
    networks: # 配置容器連接的網絡,引用頂級 networks 下的條目
      nginx-net:

# 定義網絡,可以多個
networks:
  nginx-net: # 一個具體網絡的條目名稱
    name: nginx-net # 網絡名稱,默認爲"工程名稱_網絡條目名稱"
    driver: bridge # 網絡模式,默認爲 bridge

  

Compose 常用命令

  

  官方文檔:https://docs.docker.com/compose/reference/overview/

  爲了更熟練的使用 Compose,以下常用命令大家多多練習,方可熟能生巧。

docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]

  部分命令選項如下:

  • -f,--file:指定使用的 Compose 模板文件,默認爲 docker-compose.yml,可以多次指定,指定多個 yml;
  • -p, --project-name:指定工程名稱,默認使用 docker-compose.yml 文件所在目錄的名稱;
  • -v:打印版本並退出;
  • --log-level:定義日誌等級(DEBUG, INFO, WARNING, ERROR, CRITICAL)。

  

help

  

  docker-compose -help 查看幫助。

[root@localhost ~]# docker-compose -help
Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file
                              (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name
                              (default: directory name)
  -c, --context NAME          Specify a context name
  --verbose                   Show more output
  --log-level LEVEL           Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
  --no-ansi                   Do not print ANSI control characters
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to

  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don't check the daemon's hostname against the
                              name specified in the client certificate
  --project-directory PATH    Specify an alternate working directory
                              (default: the path of the Compose file)
  --compatibility             If set, Compose will attempt to convert keys
                              in v3 files to their non-Swarm equivalent
  --env-file PATH             Specify an alternate environment file

Commands:
  build              Build or rebuild services
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

  

config

  

  docker-compose config -q 驗證 docker-compose.yml 文件。當配置正確時,不輸出任何內容,當配置錯誤時,輸出錯誤信息。

  

pull

  

  docker-compose pull 拉取服務依賴的鏡像。

# 拉取工程中所有服務依賴的鏡像
docker-compose pull
# 拉取工程中 nginx 服務依賴的鏡像
docker-compose pull nginx
# 拉取鏡像過程中不打印拉取進度信息
docker-compose pull -q

  

up

  

  docker-compose up 創建並啓動所有服務的容器。指定多個 yml 加 -f 選項。以守護進程模式運行加 -d 選項。

# 前臺啓動
docker-compose up
# 後臺啓動
docker-compose up -d
# -f 指定使用的 Compose 模板文件,默認爲 docker-compose.yml,可以多次指定,指定多個 yml
docker-compose -f docker-compose.yml up -d 

  

logs

  

  docker-compose logs 查看服務容器的輸出日誌。默認情況下,docker-compose 將對不同的服務輸出使用不同的顏色來區分。可以通過 --no-color 來關閉顏色。

# 輸出日誌,不同的服務輸出使用不同的顏色來區分
docker-compose logs
# 跟蹤日誌輸出
docker-compose logs -f
# 關閉顏色
docker-compose logs --no-color

  

ps

  

  docker-compose ps 列出工程中所有服務的容器。

# 列出工程中所有服務的容器
docker-compose ps
# 列出工程中指定服務的容器
docker-compose ps nginx

  

run

  

  docker-compose run 在指定服務容器上執行一個命令。

# 在工程中指定服務的容器上執行 echo "helloworld"
docker-compose run nginx echo "helloworld"

  

exec

  

  docker-compose exec 進入服務容器。

# 進入工程中指定服務的容器
docker-compose exec nginx bash
# 當一個服務擁有多個容器時,可通過 --index 參數進入到該服務下的任何容器
docker-compose exec --index=1 nginx bash

  

pause

  

  docker-compose pause 暫停服務容器。

# 暫停工程中所有服務的容器
docker-compose pause
# 暫停工程中指定服務的容器
docker-compose pause nginx

  

unpause

  

  docker-compose unpause 恢復服務容器。

# 恢復工程中所有服務的容器
docker-compose unpause
# 恢復工程中指定服務的容器
docker-compose unpause nginx

  

restart

  

  docker-compose restart 重啓服務容器。

# 重啓工程中所有服務的容器
docker-compose restart
# 重啓工程中指定服務的容器
docker-compose restart nginx

  

start

  

  docker-compose start 啓動服務容器。

# 啓動工程中所有服務的容器
docker-compose start
# 啓動工程中指定服務的容器
docker-compose start nginx

  

stop

  

  docker-compose stop 停止服務容器。

# 停止工程中所有服務的容器
docker-compose stop
# 停止工程中指定服務的容器
docker-compose stop nginx

  

kill

  

  docker-compose kill 通過發送 SIGKILL 信號停止指定服務的容器。

# 通過發送 SIGKILL 信號停止工程中指定服務的容器
docker-compose kill nginx

  

rm

  

  docker-compose rm 刪除服務(停止狀態)容器。

# 刪除所有(停止狀態)服務的容器
docker-compose rm
# 先停止所有服務的容器,再刪除所有服務的容器
docker-compose rm -s
# 不詢問是否刪除,直接刪除
docker-compose rm -f
# 刪除服務容器掛載的數據卷
docker-compose rm -v
# 刪除工程中指定服務的容器
docker-compose rm -sv nginx

  

down

  

  停止並刪除所有服務的容器、網絡、鏡像、數據卷。

# 停止並刪除工程中所有服務的容器、網絡
docker-compose stop
# 停止並刪除工程中所有服務的容器、網絡、鏡像
docker-compose down --rmi all
# 停止並刪除工程中所有服務的容器、網絡、數據卷
docker-compose down -v

  

create

  

  docker-compose create 爲服務創建容器,已不推薦使用。推薦使用 docker-compose up 來實現該功能。

  

scale

  

  docker-compose scale 設置指定服務運行的容器個數,已不推薦使用。

  推薦使用 --scale service=num 的參數來設置數量。

# 通過 --scale 指定 helloworld 服務一次性啓動 3 個
docker-compose up -d --scale helloworld=3

  

images

  

  docker-compose images 打印服務容器所對應的鏡像。

# 打印所有服務的容器所對應的鏡像
docker-compose images
# 打印指定服務的容器所對應的鏡像
docker-compose images nginx

  

port

  

  docker-compose port 打印指定服務容器的某個端口所映射的宿主機端口。

[root@localhost docker-nginx]# docker-compose port nginx 80
0.0.0.0:80

  

top

  

  docker-compose top 顯示正在運行的進程。

# 顯示工程中所有服務的容器正在運行的進程
docker-compose top
# 顯示工程中指定服務的容器正在運行的進程
docker-compose top nginx

  

總結

  

  Docker Compose 的整體使用步驟還是比較簡單的,三個步驟爲:

  • 使用 Dockerfile 文件定義應用程序的環境;
  • 使用 docker-compose.yml 文件定義構成應用程序的服務,這樣它們可以在隔離環境中一起運行;
  • 最後,執行 docker-compose up 命令來創建並啓動所有服務。

  雖然 docker-compose.yml 文件詳解Compose 常用命令這兩大塊的內容比較多,但是如果要快速入門使用 Compose,其實只需要瞭解其中部分內容即可。後期大家可在項目生產環境中根據自身情況再進一步深入學習即可。

  接下來我們使用 Docker Compose 搭建一遍 Redis Cluster 集羣環境,感受感受與之前的區別。

  

參考資料

  

本文采用 知識共享「署名-非商業性使用-禁止演繹 4.0 國際」許可協議

大家可以通過 分類 查看更多關於 Docker 的文章。

  

🤗 您的點贊轉發是對我最大的支持。

📢 掃碼關注 哈嘍沃德先生「文檔 + 視頻」每篇文章都配有專門視頻講解,學習更輕鬆噢 ~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章