首頁>技術>

一、功能說明

容器在當今的雲端計算中極為重要,是構建微服務的重要組成部分。而一個微服務如果由多個容器,比如nginx+php+mysql,單個容器分開管理會非常麻煩 。目前華為雲、阿里雲等廠商都提供了很多Docker容器的管理工具。Docker Compose 可以輕鬆、高效的管理容器,它是一個用於定義和執行多容器 Docker 的應用程式工具。

一個使用docker-compose的架構示例

二、安裝

Linux下的安裝命令:

sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-composedocker-compose -v

Mac環境在使用安裝檔案安裝Docker時會自帶Compose

三、常用命令# 列出所有容器docker-compose ps# 看服務日誌docker-compose logs# 列印繫結的公共埠,下面是個示例docker-compose port eureka 8761# 構建服務docker-compose build# 啟動指定服務已存在的容器docker-compose start eureka# 停止已執行的服務的容器docker-compose stop eureka# 刪除指定服務的容器docker-compose rm eureka# 構建啟動容器,更新容器docker-compose up# kill:通過傳送 SIGKILL 訊號來停止指定服務的容器docker-compose kill eureka# pull:下載服務映象# scale:設定指定服務運氣容器的個數,以 service=num 形式指定docker-compose scale user=3 movie=3# run:在一個服務上執行一個命令docker-compose run web bash四、使用步驟使用 Dockerfile 定義應用程式的環境。使用 docker-compose.yml 定義構成應用程式的服務,這樣它們可以在隔離環境中一起執行。docker-compose up 啟動。五、測試步驟1. 準備檔案mkdir composetestcd composetestvim app.pyimport timeimport redisfrom flask import Flaskapp = 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)

這個示例Python去訪問redis服務,埠6379。

在 composetest 目錄中建立另一個名為 requirements.txt 的檔案,內容如下:

flaskredis2. 編輯vim Dockerfile檔案FROM python:3.7-alpineWORKDIR /codeENV FLASK_APP app.pyENV FLASK_RUN_HOST 0.0.0.0RUN apk add --no-cache gcc musl-dev linux-headersCOPY requirements.txt requirements.txtRUN pip install -r requirements.txtCOPY . .CMD ["flask", "run"]

這個Dockerfile是構建Python容器使用。欄位解釋如下:

FROM python:3.7-alpine: 從 Python 3.7 映像開始構建映象。WORKDIR /code: 將工作目錄設定為 /code。ENV FLASK_APP app.py flask主檔案設定ENV FLASK_RUN_HOST 0.0.0.0 設定 flask 命令使用的環境變數。RUN apk add --no-cache gcc musl-dev linux-headers: 安裝 gcc,以便諸如 MarkupSafe 和 SQLAlchemy 之類的 Python 包可以編譯加速。COPY requirements.txt requirements.txtRUN pip install -r requirements.txt 複製 requirements.txt 並安裝 Python 依賴項。COPY . .: 將 . 專案中的當前目錄複製到 . 映象中的工作目錄。CMD ["flask", "run"]: 容器提供預設的執行命令為:flask run。3. 建立 docker-compose.yml

在測試目錄中建立一個名為 docker-compose.yml 的檔案:

# yaml 配置version: '3'services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"

該 Compose 檔案定義了兩個服務:web 和 redis。

version: 指定 docker-compose.yml 檔案的寫法格式services: 多個容器的集合web:該 web 服務使用從 Dockerfile 當前目錄中構建的映象。然後,它將容器和主機繫結到暴露的埠 5000。此示例服務使用 Flask Web 伺服器的預設埠 5000 。redis:該 redis 服務使用 Docker Hub 的公共 Redis 映像。links: 服務之間可以使用服務名稱相互訪問,links 允許定義一個別名,從而使用該別名訪問其它服務,如:version: '2'services: web: build: . links: - "db:database" db: image: postgres

Web 服務就可以使用 db 或 database 作為 hostname 訪問 db 服務了。

4. 使用 Compose 命令構建和執行應用

在測試目錄中,執行以下命令來啟動應用程式:

docker-compose up

後臺執行該服務可以加上 -d 引數:

docker-compose up -d

執行效果:

六、yml 配置指令參考version

指定本 yml 依從的 compose 哪個版本制定的。

build

指定為構建映象上下文路徑:例如 webapp 服務,指定為從上下文路徑 ./dir/Dockerfile 所構建的映象:

version: "3.7"services: webapp: build: ./dir

或者,作為具有在上下文指定的路徑的物件,以及可選的 Dockerfile 和 args:

version: "3.7"services: webapp: build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1 labels: - "com.example.description=Accounting webapp" - "com.example.department=Finance" - "com.example.label-with-empty-value" target: prod
context:上下文路徑。dockerfile:指定構建映象的 Dockerfile 檔名。args:新增構建引數,這是隻能在構建過程中訪問的環境變數。labels:設定構建映象的標籤target:多層構建,可以指定構建哪一層。cap_add,cap_drop

新增或刪除容器擁有的宿主機的核心功能。

cap_add: - ALL # 開啟全部許可權cap_drop: - SYS_PTRACE # 關閉 ptrace許可權
cgroup_parent

為容器指定父 cgroup 組,意味著將繼承該組的資源限制。

cgroup_parent: m-executor-abcd
command

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

command: ["bundle", "exec", "thin", "-p", "3000"]
container_name

指定自定義容器名稱,而不是生成的預設名稱。

depends_on

設定依賴關係。

deploy

指定與服務的部署和執行有關的配置。只在 swarm 模式下才會有用。

endpoint_mode:

訪問叢集服務的方式。

devices

指定裝置對映列表。

dns

自定義 DNS 伺服器,可以是單個值或列表的多個值。

dns_search

自定義 DNS 搜尋域。可以是單個值或列表。

entrypoint

覆蓋容器預設的 entrypoint。

env_file

從檔案新增環境變數。可以是單個值或列表的多個值。

environment

新增環境變數。您可以使用陣列或字典、任何布林值,布林值需要用引號引起來,以確保 YML 解析器不會將其轉換為 True 或 False。

expose

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

extra_hosts

新增主機名對映。類似 docker client --add-host。

healthcheck

用於檢測 docker 服務是否健康執行。

image

指定容器執行的映象。

logging

服務的日誌記錄配置。

network_mode

設定網路模式。

restart

重啟策略

secrets

儲存敏感資料

security_opt

修改容器預設的 schema 標籤。

stop_grace_period

指定在容器無法處理 SIGTERM (或者任何 stop_signal 的訊號),等待多久後傳送 SIGKILL 訊號關閉容器。

stop_signal

設定停止容器的替代訊號。

sysctls

設定容器中的核心引數,可以使用陣列或字典格式。

tmpfs

在容器內安裝一個臨時檔案系統。可以是單個值或列表的多個值。

ulimits

覆蓋容器預設的 ulimit。

volumes

將主機的資料卷或著檔案掛載到容器裡。

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • VSCode + WSL 2 + Ruby環境搭建詳解