天天看點

Docker容器實戰十四:Docker Compose介紹

在前面的介紹中我們都是以單個容器為例來進行示範。但在實際的生産環境中,一個應用往往會有多個元件,并分别運作在不同的容器。在這種多容器的場景下,使用Docker用戶端進行管理會存在較大的不便利性。

基于這類場景,Docker官方提供了一個多容器的管理工具 Docker Compose。它是一個Python開發的工具,可對具有多個容器的應用進行操作,進而實作快速高效的管理。

本文将對Docker Compose相關的使用方法進行講解介紹。

一. 部署安裝

Compose作為一個獨立的工具,本身并沒有與Docker用戶端進行內建 ,需要單獨安裝。(注:在安裝之前,主機上必須先安裝好Docker引擎)

Compose的部署安裝有RPM包、二進制、腳本安裝等幾種方式,本文将示範RPM包與二進制的安裝操作。

1. RPM包安裝

  • 安裝
$ yum install -y docker-compose-plugin      
  •  驗證程式是否正常
$ docker compose version
Docker Compose version v2.6.0      

2. 二進制檔案安裝

  • 下載下傳二進制檔案 
$ mkdir -p /usr/local/lib/docker/cli-plugins
$ curl -SL https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose      
  • 添加執行權限
$ sudo chomd +x /usr/local/lib/docker/cli-plugins/docker-compose      
  • 驗證程式是否正常
$ docker compose version
Docker Compose version v2.6.0      

二. 模闆檔案 

Docker Compose使用基于yml格式的模闆檔案來定義應用,預設的模闆檔案名稱為docker-compose.yml。

我們先來了解一下模闆的格式 ,如下是一個模闆示例,它定義了兩個應用服務。

version: "3.9"
services:
  myapp:
    build: ./myapp
    ports:
      - "80:80"
    container_name: myapp
    depends_on:
      - database
    networks:
      - mynet
  database:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    ports:
      - "3306:3306"
    container_name: db
    volumes:
      - "mydata:/var/lib/mysql"
    networks:
      - mynet
networks:
  mynet:
    driver: bridge


volumes:
  mydata:      

下面我們根據模闆的各個功能參數來進行拆分講解:

version 

定義了Compose檔案使用的API版本(并非Compose産品自身版本),一般建議使用最新的版本,此處使用3.9。

services

用于定義不同的應用服務,此處定義了兩個服務:web和database。Docker Compose會将每個服務部署在各自的容器中。

build

指定Dockerfile所在檔案夾的路徑(可支援絕對路徑或相對路徑),Compose 會使用它來建構鏡像,該鏡像會被用于啟動該服務的容器。

ports

指定Docker容器的端口映射到主機,該功能與docker run  啟動容器的 -p 選項一樣,格式為“主機端口:容器端口”。如果隻指定了容器端口,那麼主機端口将使用随機端口。

container_name

用于指定容器名稱,如果不指定的話,則預設會使用“目錄名+服務名+序号”這樣的格式來表示。

depends_on

指定服務間的依賴關系。如本例所示,由于myapp依賴于database服務,是以Docker Compose會先啟動database服務對應的容器,然後再進行myapp的啟動。

networks

一級的networks參數用于指定建立服務所使用的網絡,此處指定名稱為mynet,Compose會在該名稱前面再加上目錄名稱作為建立的網絡名稱,格式為“目錄名_mynet”。網絡驅動使用bridge,表明這是一個bridge網絡。

services 項中的服務使用networks用于指定加入的網絡,此處都使用mynet網絡。

image

指定服務使用的鏡像。本示例中的database服務使用mysql:5.7的鏡像,Compose會自動下載下傳該鏡像用于啟動容器。

environment

設定環境變量,該變量會在容器啟動時自動加載。如果隻指定了變量名稱,則會自動擷取Compose主機上對應變量的值,這種方式可用來防止重要資料的洩漏。

示例:

environment:
  api_key:      

volumes

指定容器挂載的資料卷,可以使用目錄挂載或volumes挂載。

示例:目錄挂載

volumes:
      - "/data/mysql:/var/lib/mysql"      

示例:volumes挂載

volumes:
  - mydata:/var/lib/mysql
  
volumes:
  mydata:      

除了以上這些常用的參數外,Docker Compose還有不少其他的參數可以使用,限于篇幅原因在此不做過多介紹,有興趣的讀者可自己檢視相關資料。

三. 管理應用

Docker Compose在新的版本中,使用的指令格式與其他docker 指令類似,為“ docker compose + 選項 + [參數]”。原有的“docker-compose 指令不再使用。

1. 檢視幫助

執行"docker compose --help" 可檢視指令的詳細介紹

$ docker compose --help
......
Commands:
  build       Build or rebuild services
  convert     Converts the compose file to platform's canonical format
  cp          Copy files/folders between a service container and the local filesystem
  create      Creates containers for a service.
  down        Stop and remove containers, networks
  events      Receive real time events from containers.
  exec        Execute a command in a running container.
  images      List images used by the created containers
  kill        Force stop service containers.
  logs        View output from containers
......      

2. 建構鏡像

使用docker compose build 指令可用于建構項目中鏡像,我們可以使用此指令先提前準備好相關的鏡像。否則 ,相關鏡像将在啟動服務時進行建構。

$ docker compose build
[+] Building 3.3s (2/3)                                                                                                                                      
 => [internal] load build definition from Dockerfile                                  0.0s
 => => transferring dockerfile: 92B                                                   0.0s
 => [internal] load .dockerignore                                                     0.0s
 => => transferring context: 2B                                                       0.0s
 => [internal] load metadata for docker.io/library/python:3.7-alpine  
 ......      

建構完成後,我們可以看到鏡像已經生成,鏡像名稱格式為“目錄名+服務名”。​

$ docker compose images
Container           Repository          Tag                 Image Id            Size
myapp               test_myapp          latest              fda100c4b2ae        51.6MB      

3. 服務建立并啟動

使用docker compose up 指令可啟動docker-compose.yml 模闆檔案中定義的服務,通常會在指令後面加上 -d ,用于背景啟動。該指令會建構所需的鏡像、建立網絡和存儲卷、然後進行容器的啟動等操作。

由于前面已提前建構好myapp的鏡像,故這裡隻需要拉取database的鏡像,并建立相關的容器資源即可。

$ docker compose up -d
[+] Running 12/12
 ⠿ database Pulled                                                                                                                                     98.0s
   ⠿ 72a69066d2fe Pull complete                                                                                                                        35.4s
   ⠿ 93619dbc5b36 Pull complete                                                                                                                        35.5s
   ⠿ 99da31dd6142 Pull complete                                                                                                                        35.7s
   ⠿ 626033c43d70 Pull complete                                                                                                                        35.9s
   ⠿ 37d5d7efb64e Pull complete                                                                                                                        35.9s
   ⠿ ac563158d721 Pull complete                                                                                                                        36.8s
   ⠿ d2ba16033dad Pull complete                                                                                                                        36.9s
   ⠿ 0ceb82207cd7 Pull complete                                                                                                                        36.9s
   ⠿ 37f2405cae96 Pull complete                                                                                                                        80.7s
   ⠿ e2482e017e53 Pull complete                                                                                                                        80.7s
   ⠿ 70deed891d42 Pull complete                                                                                                                        80.8s
[+] Running 4/4
 ⠿ Network test_mynet    Created                                                                                                                        0.2s
 ⠿ Volume "test_mydata"  Created                                                                                                                        0.0s
 ⠿ Container db          Started                                                                                                                        0.5s
 ⠿ Container myapp       Started      

檢視容器狀态,可看到服務容器已正常啟動。

docker compose ps
NAME                COMMAND                  SERVICE             STATUS              PORTS
db                  "docker-entrypoint.s…"   database            running             0.0.0.0:3306->3306/tcp, :::3306->3306/tcp
myapp               "python /opt/myapp/m…"   myapp               running             0.0.0.0:80->80/tcp, :::80->80/tcp      

4.  停止/啟動服務

使用docker compose stop/start 指令可對服務相關的容器進行停止/啟動。

停止服務

$ docker compose stop 
[+] Running 2/2
 ⠿ Container myapp  Stopped                    10.2s
 ⠿ Container db     Stopped      

啟動服務

$ docker compose start
[+] Running 2/2
 ⠿ Container db     Started                     0.4s
 ⠿ Container myapp  Started      

5. 服務下線

$ docker compose down
[+] Running 3/3
 ⠿ Container myapp     Removed                             10.2s
 ⠿ Container db        Removed                             1.9s
 ⠿ Network test_mynet  Removed