Docker 容器編排利器 Docker Compose

来源:https://www.cnblogs.com/taoxiaoxin/p/18095523
-Advertisement-
Play Games

目錄一、Docker Compose 簡介二、Docker Compose 安裝2.1 Mac、Windows 平臺預設支持2.2 Linux 安裝(通過包管理)2.2.1 安裝2.2.2 測試2.2.3 卸載2.3 使用PIP 安裝與卸載2.3.1 PIP安裝2.3.2 PIP 卸載三、基本使用3 ...


目錄

一、Docker Compose 簡介

Docker Compose 項目是 Docker 官方的開源項目,Compose 定位是 「定義和運行多個 Docker 容器的應用(Defining and running multi-container Docker applications)」,來源於之前的 Fig 項目,使用 Python 語言編寫。負責實現對 Docker 容器集群的快速編排。項目地址為:https://github.com/docker/compose/releases

Compose 的預設管理對象是項目,通過子命令對項目中的一組容器進行便捷地生命周期管理,實現上調用了 Docker 服務提供的 API 來對容器進行管理。因此,只要所操作的平臺支持 Docker API,就可以在其上利用 Compose 來進行編排管理。

我們知道使用一個 Dockerfile 模板文件,可以讓用戶很方便的定義一個單獨的應用容器。然而,在日常工作中,經常會碰到需要多個容器相互配合來完成某項任務的情況。例如要實現一個 Web 項目,除了 Web 服務容器本身,往往還需要再加上後端的負載均衡容器等。

Docker Compose 恰好滿足了這樣的需求,它是用於定義和運行多容器 Docker 應用程式的工具。它允許用戶通過一個單獨的 docker-compose.yml 模板文件(YAML 格式)來定義一組相關聯的應用容器為一個項目(project)。然後使用一個命令,就可以通過 YAML 配置文件創建並啟動所有服務。

Compose 中有兩個重要的概念:

  • 服務 (service):一個應用的容器,實際上可以包括若幹運行相同鏡像的容器實例。
  • 項目 (project):由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 文件中定義。

Docker Compose 使用的三個步驟為:

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

二、Docker Compose 安裝

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

2.1 Mac、Windows 平臺預設支持

Docker Desktop for Mac/Windows 自帶 docker-compose 二進位文件,安裝 Docker 之後可以直接使用。

$ docker-compose --version
Docker Compose version v2.23.3-desktop.2

2.2 Linux 安裝(通過包管理)

2.2.1 安裝

運行以下命令以下載Docker Compose的當前穩定版本:

# 烏班圖 安裝
sudo apt-get install docker-compose-plugin -y
# Centos 安裝
sudo yum install docker-compose-plugin -y 

2.2.2 測試

docker compose version

2.2.3 卸載

如果您需要卸載 Docker Compose,可以使用以下命令:

在 Ubuntu 上:

sudo apt-get remove docker-compose-plugin -y

在 CentOS 上:

sudo yum remove docker-compose-plugin -y

2.3 使用PIP 安裝與卸載

2.3.1 PIP安裝

這種方式是將 Compose 當作一個 Python 應用來從 pip 源中安裝。

首先,確保你的系統已經安裝了Python和pip。你可以在終端中運行以下命令來檢查它們是否已經安裝:

python --version
pip --version

如果這些命令返回版本信息,則說明Python和pip已經安裝。如果沒有安裝,請根據你使用的操作系統安裝Python和pip。

沒有安裝的話請參考教程:Linux系統安裝python3.8與卸載教程

接下來,使用pip安裝docker-compose。在終端中運行以下命令:

$ sudo pip install -U docker-compose

2.3.2 PIP 卸載

如果是通過 pip 安裝的,則執行如下命令即可刪除。

$ sudo pip uninstall docker-compose

三、基本使用

3.1 術語

首先介紹幾個術語。

  • 服務 (service):一個應用容器,實際上可以運行多個相同鏡像的實例。
  • 項目 (project):由一組關聯的應用容器組成的一個完整業務單元。

可見,一個項目可以由多個服務(容器)關聯而成,Compose 面向項目進行管理。

3.2 部署Flask 應用

下麵我們部署一個web 網站,該項目應該包含 web 應用和緩存。

我們用Flask 框架構建一個能夠記錄頁面訪問次數的 web 網站。

首先,創建一個簡單的 Flask 應用。創建一個新目錄 flask-app,併在其中創建一個名為 app.py 的文件:

# flask-app/app.py
from flask import Flask
from redis import Redis

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

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

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

接著,編寫 Dockerfile 文件,內容為:

FROM python:3.12-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
CMD ["python", "app.py"]

編寫 docker-compose.yml 文件,這個是 Compose 使用的主模板文件。

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

這個 docker-compose.yml 文件定義了兩個服務:webredisweb 服務使用當前目錄下的 Dockerfile 構建,並將容器內的埠 5000 綁定到宿主機的埠 5000。web 服務依賴於 redis 服務。

flask-app 目錄中,運行以下命令來啟動應用:

docker compose up --build

這個命令會構建 Flask 應用的 Docker 鏡像,啟動 Redis 容器,然後啟動 Flask 應用容器。看到終端輸出如下,說明容器啟動起來了。

現在,您可以通過瀏覽器訪問 http://localhost:5000 來查看您的 Flask 應用,並且每次刷新頁面都會看到訪問次數的增加。

或者終端使用 curl 命令訪問本地運行的 Flask 應用

curl http://localhost:5000

如圖,此時訪問本地 5000 埠,每次刷新頁面,計數就會加 1。

四、Compose 常用命令

4.1 命令對象與格式

docker 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)。

我們通過終端輸入命令docker compose可以查看到所有命令和選項:

用法:  docker compose [選項] 命令

使用 Docker 定義和運行多容器應用程式

選項:
      --ansi string                控制何時列印 ANSI 控制字元 ("never"|"always"|"auto")
                                   (預設 "auto")
      --compatibility              以向後相容模式運行 Compose
      --dry-run                    以乾運行模式執行命令
      --env-file stringArray       指定一個替代的環境文件
  -f, --file stringArray           指定 Compose 配置文件
      --parallel int               控制最大並行性,-1 為無限制 (預設 -1)
      --profile stringArray         指定要啟用的配置文件
      --progress string             設置進度輸出的類型 (auto, tty, plain, quiet) (預設 "auto")
      --project-directory string   指定一個替代的工作目錄
                                   (預設:第一個指定的 Compose 文件的路徑)
  -p, --project-name string        項目名稱

命令:
  attach      將本地標準輸入、輸出和錯誤流附加到服務的運行容器上
  build       構建或重建服務
  config      解析、解析並呈現 Compose 文件的規範格式
  cp          在服務容器和本地文件系統之間複製文件/文件夾
  create      為服務創建容器
  down        停止並刪除容器和網路
  events      從容器接收實時事件
  exec        在運行中的容器內執行命令
  images      列出由創建的容器使用的鏡像
  kill        強制停止服務容器
  logs        查看容器的輸出
  ls          列出運行中的 Compose 項目
  pause      暫停服務
  port        列印埠的公共埠綁定
  ps          列出容器
  pull        拉取服務鏡像
  push        推送服務鏡像
  restart     重啟服務容器
  rm          刪除已停止的服務容器
  run         對服務運行一次性命令
  scale       設置服務運行的容器數量
  start       啟動服務
  stats       顯示容器的實時資源使用統計信息
  stop        停止服務
  top         顯示正在運行的進程
  unpause     恢復暫停的服務
  up          創建並啟動容器
  version     顯示 Docker Compose 版本信息
  wait        阻塞直到第一個服務容器停止
  watch       監視服務的構建上下文,併在文件更新時重建/刷新容器

運行 'docker compose 命令 --help' 以獲取有關一個命令的更多信息。

4.2 docker-compose 常用命令

4.2.1 config

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

4.2.2 pull

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

4.2.3 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 

4.2.4 logs

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

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

4.2.5 ps

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

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

4.2.6 run

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

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

4.2.7 exec

docker compose exec 進入服務容器。

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

4.2.8 pause

docker compose pause 暫停服務容器。

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

4.2.9 unpause

docker compose unpause 恢復服務容器。

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

4.2.10 restart

docker compose restart 重啟服務容器。

# 重啟工程中所有服務的容器
docker compose restart
# 重啟工程中指定服務的容器
docker compose restart redis

4.2.11 start

docker compose start 啟動服務容器。

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

4.2.12 stop

docker compose stop 停止服務容器。

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

4.2.13 kill

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

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

4.2.14 rm

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

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

4.2.15 down

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

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

4.2.16 images

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

# 列印所有服務的容器所對應的鏡像
docker compose images
# 列印指定服務的容器所對應的鏡像
docker compose images redis

4.2.17 port

docker compose port 列印指定服務容器的某個埠所映射的宿主機埠。 

[root@VM-16-centos flask-app]# docker compose port nginx 80
0.0.0.0:80

4.2.18 top

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

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

五、docker-compose.yml 文件詳解

5.1 概念

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:數據捲,用於實現目錄掛載。

5.2 案例

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

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

在文件 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 創建並啟動所有服務。

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

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

https://mrhelloworld.com/resources/articles/docker/image-20200904182520177.png

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

https://mrhelloworld.com/resources/articles/docker/image-20200905151142759.png

5.3 version

  • version是Docker Compose文件的一個主要組成部分,用於指定當前Docker Compose文件的版本。

version欄位通常在文件的頂部進行定義,如下所示:

version: "3.8"

在這個例子中,version被設置為'3.8',這意味著這個Docker Compose文件使用的是3.8版本的語法和功能。

重要的是要註意不同版本的Docker Compose之間可能存在不相容性。因此,在升級或更改您的docker-compose.yaml文件時,請確保查看有關版本的特定說明和變更日誌,以便瞭解您當前所使用版本的支持的功能和變更情況。

官網提供的鏈接比較老了,且compose版本和其version欄位不相同,對應起來比較麻煩(二者的對應關係可以參考鏈接

5.4 services

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

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

5.4.1 services 簡單舉例

舉個例子,之前我們通過 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 # MySQL root 用戶的密碼
    volumes:
      - "/mydata/docker_mysql/conf:/etc/mysql/conf.d"
      - "/mydata/docker_mysql/data:/var/lib/mysql"

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

5.4.2 image

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

services:
  web:
    image: mysql:8

5.4.3 build

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

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

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

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

接下來我們來個稍微複雜點的練習,首先我們使用Go編寫一個HTTP Server:

創建一個目錄:

# 創建目錄
mkdir -p /usr/local/docker-centos
# 切換至指定目錄
cd /usr/local/docker-centos/
mkdir ./httpserver

編寫main.go內容如下:

package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", rootHandler)
	http.HandleFunc("/ping", pingHandler)
	fmt.Println("Server started at http://localhost:8080")
	http.ListenAndServe(":8080", nil)
}

func rootHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "哈嘍,Go!")
}

func pingHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "pong")
}

接著通過基礎鏡像 centos:8,在該鏡像中安裝 go 和 並且運行HTTP Server以後將其製作為一個新的鏡像 mycentos:8。編寫 Dockerfile 文件。

# 編寫 Dockerfile 文件
vi Dockerfile

Dockerfile 文件內容如下:

# 指明構建的新鏡像是來自於 centos:8 基礎鏡像
FROM centos:8

# 通過鏡像標簽聲明瞭作者信息
LABEL maintainer="blog.jarvis.com"

# 設置工作目錄
WORKDIR /usr/local

# 拷貝 Go 語言壓縮包並解壓到指定目錄
ADD go1.22.1.linux-amd64.tar.gz /usr/local/

# 設置 Go 環境變數
ENV GOROOT=/usr/local/go
ENV GOPATH=/usr/local/gopath
ENV PATH=$PATH:$GOROOT/bin:$GOPATH/bin

# 將 httpserver 代碼拷貝到容器中
COPY ./httpserver /usr/local/httpserver

# 設置工作目錄到 httpserver 目錄
WORKDIR /usr/local/httpserver

# 編譯 Go HTTP 伺服器
RUN go build -o httpserver main.go

# 暴露容器運行時的 8080 監聽埠給外部
EXPOSE 8080

# 使用 CMD 運行 HTTP 伺服器
CMD ["./httpserver"]

接著通過如下命令下載Go 編譯器:

# 下載GO 編譯器
wget https://golang.google.cn/dl/go1.22.1.linux-amd64.tar.gz

創建目錄並編寫 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 的文件構建鏡像

5.4.4 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 開始累加的,這就是序號的作用。所以如果指定了自定義名稱,就不能將服務擴展至多個容器。

  

5.4.5 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 服務。 

5.4.6 ports

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

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

5.4.7 expose

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

expose:
  - "80"
  - "8080"

5.4.8 restart

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

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

5.4.9 environment

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

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

或者以下格式:

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

5.4.10 env_file

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

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

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

5.4.11 command

覆蓋容器啟動後預設執行的命令。

command: echo "helloworld"

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

command: ["echo", "helloworld"]

5.4.12 volumes

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

  • 指定目錄掛載的格式為:左邊宿主機目錄:右邊容器目錄,或者左邊宿主機目錄:右邊容器目錄:讀寫許可權
  • 匿名掛載格式為:容器目錄即可,或者容器目錄即可:讀寫許可權
  • 具名掛載格式為:數據捲條目名稱:容器目錄,或者數據捲條目名稱:容器目錄:讀寫許可權
# 描述 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 # 數據捲名稱,預設為"工程名稱_數據捲條目名稱"

5.4.13 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]"

5.4.14 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

5.5 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 # 數據捲名稱,預設為"工程名稱_數據捲條目名稱"

5.6 networks

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

如果不聲明網路,每個工程預設會創建一個網路名稱為"工程名稱_default"bridge 網路。

# 描述 Compose 文件的版本信息
version: "3.8"

# 定義服務,可以多個
services:
  nginx:
    image: nginx
    container_name: mynginx
    ports:
      - "80:80"

# 定義網路,可以多個。如果不聲明,預設會創建一個網路名稱為"工程名稱_default"的 bridge 網路
#networks:

https://mrhelloworld.com/resources/articles/docker/image-20200907170121843.png

以下方式的網路聲明創建網路時會使用預設的名稱:"工程名稱_網路條目名稱",網路模式預設為 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

六、小結

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

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

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

本文由博客一文多發平臺 OpenWrite 發佈!

分享是一種快樂,開心是一種態度!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 習慣了在 css 文件裡面編寫樣式,其實JavaScript 的 CSS對象模型也提供了強大的樣式操作能力, 那就隨文章一起看看,有多少能力是你不知道的吧。 樣式來源 客從八方來, 樣式呢, 樣式五方來。 chrome舊版本用戶自定義樣式目錄: %LocalAppData%/Google/Ch ...
  • VUE 腳手架 腳手架文件結構 ├── node_modules ├── public │ ├── favicon.ico: 頁簽圖標 │ └── index.html: 主頁面 ├── src │ ├── assets: 存放靜態資源 │ │ └── logo.png │ │── componen ...
  • 最近看到了許多關於 :has() 選擇器的知識點,在此總結下來。 MDN 對 :has() 選擇器 的解釋是這樣的: CSS 函數式偽類 :has() 表示一個元素,如果作為參數傳遞的任何相對選擇器在錨定到該元素時,至少匹配一個元素。這個偽類通過把可容錯相對選擇器列表作為參數,提供了一種針對引用元素 ...
  • 系統功能文檔是一種描述軟體系統功能和操作方式的文檔。它讓開發團隊、測試人員、項目管理者、客戶和最終用戶對系統行為有清晰、全面的瞭解。 通過ChatGPT,我們能讓編寫系統功能文檔的效率提升10倍以上。 用ChatGPT生成系統功能文檔 我們以線上商城系統為例,介紹如何使用ChatGPT幫我們完成系統 ...
  • isa 走點陣圖 在講 OC->Class 底層類結構之前,先看下下麵這張圖: 通過isa走點陣圖 得出的結論是: 1,類,父類,元類都包含了 isa, superclass 2,對象isa指向類對象,類對象的isa指向了元類,元類的 isa 指向了根元類,根元類 isa 指向自己 3,類的 super ...
  • 零售商家為什麼要建設線上商城? 傳統的實體門店服務範圍有限,只能吸引周邊500米以內的消費者。因此,如何拓展服務範圍,吸引更多的消費者到店,成為了店家迫切需要解決的問題。 缺乏忠實顧客,客戶基礎不穩,往往是一次性購物,門店無法形成有效的顧客迴流。在當前的市場環境下,構建並維護粉絲群體,成為了商家的核 ...
  • C-04.邏輯架構 1.邏輯架構剖析 1.1 伺服器處理客戶端請求 首先MySQL是典型的C/S架構,即Client/Server架構,客戶端使用的是mysql,伺服器端程式使用的mysqld。 不論客戶端進程和伺服器進程是採用那種方式進行通信,最後實現的效果都是:客戶端進程向伺服器進程發送一段文本 ...
  • 多任務進程與線程 一、多任務介紹 ​ 我們生活中有很多事情是同時進行的,比如開車的時候 手和腳共同來駕駛汽車,再比如唱歌跳舞也是同時進行的;用程式來模擬: from time import sleep def sing(): for i in range(3): print("正在唱歌...%d"% ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...