第 02 章 基礎設施即服務 Docker-compose(5.1)

什麼是 Docker Compose

Docker Compose 是 Docker 官方編排(Orchestration)項目之一,負責快速的部署分佈式應用。

Docker Compose 簡介

Compose 項目是 Docker 官方的開源項目,負責實現對 Docker 容器集羣的快速編排。從功能上看,跟 OpenStack 中的 Heat 十分類似。

其代碼目前在 https://github.com/docker/compose 上開源。

Compose 定位是 「定義和運行多個 Docker 容器的應用(Defining and running multi-container Docker applications)」,其前身是開源項目 Fig。

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

Compose 恰好滿足了這樣的需求。它允許用戶通過一個單獨的 docker-compose.yml 模板文件(YAML 格式)來定義一組相關聯的應用容器爲一個項目(project)。

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

Compose 的默認管理對象是項目,通過子命令對項目中的一組容器進行便捷地生命週期管理。

Compose 項目由 Python 編寫,實現上調用了 Docker 服務提供的 API 來對容器進行管理。因此,只要所操作的平臺支持 Docker API,就可以在其上利用 Compose 來進行編排管理。

Docker Compose 安裝與卸載

Compose 支持 Linux、macOS、Windows 10 三大平臺。

Compose 可以通過 Python 的包管理工具 pip 進行安裝,也可以直接下載編譯好的二進制文件使用,甚至能夠直接在 Docker 容器中運行。

前兩種方式是傳統方式,適合本地環境下安裝使用;最後一種方式則不破壞系統環境,更適合雲計算場景。

Docker for Mac 、Docker for Windows 自帶 docker-compose 二進制文件,安裝 Docker 之後可以直接使用。
$ docker-compose –version

docker-compose version 1.17.1, build 6d101fb

Linux 系統請使用以下介紹的方法安裝。

二進制包

在 Linux 上的也安裝十分簡單,從 官方 GitHub Release 處直接下載編譯好的二進制文件即可。

例如,在 Linux 64 位系統上直接下載對應的二進制包。
$ sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

PIP 安裝

注: x86_64 架構的 Linux 建議按照上邊的方法下載二進制包進行安裝,如果您計算機的架構是 ARM (例如,樹莓派),再使用 pip 安裝。

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

執行安裝命令:
$ sudo pip install -U docker-compose

可以看到類似如下輸出,說明安裝成功。
Collecting docker-compose
Downloading docker-compose-1.17.1.tar.gz (149kB): 149kB downloaded

Successfully installed docker-compose cached-property requests texttable websocket-client docker-py dockerpty six enum34 backports.ssl-match-hostname ipaddress

bash 補全命令
$ curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

容器中執行

Compose 既然是一個 Python 應用,自然也可以直接用容器來執行它。
$ curl -L https://github.com/docker/compose/releases/download/1.8.0/run.sh > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose

實際上,查看下載的 run.sh 腳本內容,如下
set -e

VERSION=”1.8.0”
IMAGE=”docker/compose:$VERSION”

Setup options for connecting to docker host

if [ -z “DOCKERHOST];thenDOCKERHOST=/var/run/docker.sockfiif[S DOCKER_HOST” ]; then
DOCKER_ADDR=”-v DOCKERHOST: DOCKER_HOST -e DOCKER_HOST”
else
DOCKER_ADDR=”-e DOCKER_HOST -e DOCKER_TLS_VERIFY -e DOCKER_CERT_PATH”
fi

Setup volume mounts for compose config and context

if [ “(pwd)!=/];thenVOLUMES=v (pwd):(pwd)fiif[n COMPOSE_FILE” ]; then
compose_dir=(dirname COMPOSE_FILE)
fi

TODO: also check –file argument

if [ -n “composedir];thenVOLUMES= VOLUMES -v composedir: compose_dir”
fi
if [ -n “HOME];thenVOLUMES= VOLUMES -v HOME: HOME -v HOME:/root” # mount HOME in /root to share docker.config
fi

Only allocate tty if we detect one

if [ -t 1 ]; then
DOCKER_RUN_OPTIONS=”-t”
fi
if [ -t 0 ]; then
DOCKER_RUN_OPTIONS=”$DOCKER_RUN_OPTIONS -i”
fi

exec docker run –rm DOCKERRUNOPTIONS DOCKER_ADDR COMPOSEOPTIONS VOLUMES -w “(pwd)" IMAGE “$@”

可以看到,它其實是下載了 docker/compose 鏡像並運行。

卸載

如果是二進制包方式安裝的,刪除二進制文件即可。
$ sudo rm /usr/local/bin/docker-compose

如果是通過 pip 安裝的,則執行如下命令即可刪除。
$ sudo pip uninstall docker-compose

Docker Compose 使用

術語

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

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

場景

最常見的項目是 web 網站,該項目應該包含 web 應用和緩存。

下面我們用 Python 來建立一個能夠記錄頁面訪問次數的 web 網站。

web 應用

新建文件夾,在該目錄中編寫 app.py 文件
from flask import Flask
from redis import Redis

app = Flask(name)
redis = Redis(host=’redis’, port=6379)

@app.route(‘/’)
def hello():
count = redis.incr(‘hits’)
return ‘Hello World! 該頁面已被訪問 {} 次。\n’.format(count)

if name == “main“:
app.run(host=”0.0.0.0”, debug=True)

Dockerfile

編寫 Dockerfile 文件,內容爲
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
CMD [“python”, “app.py”]

docker-compose.yml

編寫 docker-compose.yml 文件,這個是 Compose 使用的主模板文件。
version: ‘3’
services:

web:
build: .
ports:
- “5000:5000”

redis:
image: “redis:alpine”

運行 compose 項目
$ docker-compose up

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

Docker Compose 命令說明

命令對象與格式

對於 Compose 來說,大部分命令的對象既可以是項目本身,也可以指定爲項目中的服務或者容器。如果沒有特別的說明,命令對象將是項目,這意味着項目中所有的服務都會受到命令影響。

執行 docker-compose [COMMAND] –help 或者 docker-compose help [COMMAND] 可以查看具體某個命令的使用格式。

docker-compose 命令的基本的使用格式是
docker-compose [-f=…] [options] [COMMAND] [ARGS…]

命令選項
•-f, –file FILE 指定使用的 Compose 模板文件,默認爲 docker-compose.yml,可以多次指定。
•-p, –project-name NAME 指定項目名稱,默認將使用所在目錄名稱作爲項目名。
•–x-networking 使用 Docker 的可拔插網絡後端特性
•–x-network-driver DRIVER 指定網絡後端的驅動,默認爲 bridge
•–verbose 輸出更多調試信息。
•-v, –version 打印版本並退出。

命令使用說明

build

格式爲 docker-compose build [options] [SERVICE…]。

構建(重新構建)項目中的服務容器。

服務容器一旦構建後,將會帶上一個標記名,例如對於 web 項目中的一個 db 容器,可能是 web_db。

可以隨時在項目目錄下運行 docker-compose build 來重新構建服務。

選項包括:
•–force-rm 刪除構建過程中的臨時容器。
•–no-cache 構建鏡像過程中不使用 cache(這將加長構建過程)。
•–pull 始終嘗試通過 pull 來獲取更新版本的鏡像。

config

驗證 Compose 文件格式是否正確,若正確則顯示配置,若格式錯誤顯示錯誤原因。

down

此命令將會停止 up 命令所啓動的容器,並移除網絡

exec

進入指定的容器。

help

獲得一個命令的幫助。

images

列出 Compose 文件中包含的鏡像。

kill

格式爲 docker-compose kill [options] [SERVICE…]。

通過發送 SIGKILL 信號來強制停止服務容器。

支持通過 -s 參數來指定發送的信號,例如通過如下指令發送 SIGINT 信號。
$ docker-compose kill -s SIGINT

logs

格式爲 docker-compose logs [options] [SERVICE…]。

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

該命令在調試問題的時候十分有用。

pause

格式爲 docker-compose pause [SERVICE…]。

暫停一個服務容器。

port

格式爲 docker-compose port [options] SERVICE PRIVATE_PORT。

打印某個容器端口所映射的公共端口。

選項:
•–protocol=proto 指定端口協議,tcp(默認值)或者 udp。
•–index=index 如果同一服務存在多個容器,指定命令對象容器的序號(默認爲 1)。

ps

格式爲 docker-compose ps [options] [SERVICE…]。

列出項目中目前的所有容器。

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

pull

格式爲 docker-compose pull [options] [SERVICE…]。

拉取服務依賴的鏡像。

選項:
•–ignore-pull-failures 忽略拉取鏡像過程中的錯誤。

push

推送服務依賴的鏡像到 Docker 鏡像倉庫。

restart

格式爲 docker-compose restart [options] [SERVICE…]。

重啓項目中的服務。

選項:
•-t, –timeout TIMEOUT 指定重啓前停止容器的超時(默認爲 10 秒)。

rm

格式爲 docker-compose rm [options] [SERVICE…]。

刪除所有(停止狀態的)服務容器。推薦先執行 docker-compose stop 命令來停止容器。

選項:
•-f, –force 強制直接刪除,包括非停止狀態的容器。一般儘量不要使用該選項。
•-v 刪除容器所掛載的數據卷。

run

格式爲 docker-compose run [options] [-p PORT…] [-e KEY=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 的指令將無法運行。

scale

格式爲 docker-compose scale [options] [SERVICE=NUM…]。

設置指定服務運行的容器個數。

通過 service=num 的參數來設置數量。例如:
$ docker-compose scale web=3 db=2

將啓動 3 個容器運行 web 服務,2 個容器運行 db 服務。

一般的,當指定數目多於該服務當前實際運行容器,將新創建並啓動容器;反之,將停止容器。

選項:
•-t, –timeout TIMEOUT 停止容器時候的超時(默認爲 10 秒)。

start

格式爲 docker-compose start [SERVICE…]。

啓動已經存在的服務容器。

stop

格式爲 docker-compose stop [options] [SERVICE…]。

停止已經處於運行狀態的容器,但不刪除它。通過 docker-compose start 可以再次啓動這些容器。

選項:
•-t, –timeout TIMEOUT 停止容器時候的超時(默認爲 10 秒)。

top

查看各個服務容器內運行的進程。

unpause

格式爲 docker-compose unpause [SERVICE…]。

恢復處於暫停狀態中的服務。

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 來重新創建服務並後臺停止舊服務,啓動新服務,並不會影響到其所依賴的服務。

選項:
•-d 在後臺運行服務容器。
•–no-color 不使用顏色來區分不同的服務的控制檯輸出。
•–no-deps 不啓動服務所鏈接的容器。
•–force-recreate 強制重新創建容器,不能與 –no-recreate 同時使用。
•–no-recreate 如果容器已經存在了,則不重新創建,不能與 –force-recreate 同時使用。
•–no-build 不自動構建缺失的服務鏡像。
•-t, –timeout TIMEOUT 停止容器時候的超時(默認爲 10 秒)。

version

格式爲 docker-compose version。

打印版本信息。

Docker Compose 模板文件

模板文件是使用 Compose 的核心,涉及到的指令關鍵字也比較多。但大家不用擔心,這裏面大部分指令跟 docker run 相關參數的含義都是類似的。

默認的模板文件名稱爲 docker-compose.yml,格式爲 YAML 格式。
version: “3”

services:
webapp:
image: examples/web
ports:
- “80:80”
volumes:
- “/data”

注意每個服務都必須通過 image 指令指定鏡像或 build 指令(需要 Dockerfile)等來自動構建生成鏡像。

如果使用 build 指令,在 Dockerfile 中設置的選項(例如:CMD, EXPOSE, VOLUME, ENV 等) 將會自動被獲取,無需在 docker-compose.yml 中再次設置。

下面分別介紹各個指令的用法。

build

指定 Dockerfile 所在文件夾的路徑(可以是絕對路徑,或者相對 docker-compose.yml 文件的路徑)。 Compose 將會利用它自動構建這個鏡像,然後使用這個鏡像。
version: ‘3’
services:

webapp:
build: ./dir

你也可以使用 context 指令指定 Dockerfile 所在文件夾的路徑。

使用 dockerfile 指令指定 Dockerfile 文件名。

使用 arg 指令指定構建鏡像時的變量。
version: ‘3’
services:

webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1

使用 cache_from 指定構建鏡像的緩存
build:
context: .
cache_from:
- alpine:latest
- corp/web_app:3.14

cap_add, cap_drop

指定容器的內核能力(capacity)分配。

例如,讓容器擁有所有能力可以指定爲:
cap_add:
- ALL

去掉 NET_ADMIN 能力可以指定爲:
cap_drop:
- NET_ADMIN

command

覆蓋容器啓動後默認執行的命令。
command: echo “hello world”

configs

僅用於 Swarm mode

cgroup_parent

指定父 cgroup 組,意味着將繼承該組的資源限制。

例如,創建了一個 cgroup 組名稱爲 cgroups_1。
cgroup_parent: cgroups_1

container_name

指定容器名稱。默認將會使用 項目名稱服務名稱序號 這樣的格式。
container_name: docker-web-container

注意: 指定容器名稱後,該服務將無法進行擴展(scale),因爲 Docker 不允許多個容器具有相同的名稱。

deploy

僅用於 Swarm mode

devices

指定設備映射關係。
devices:
- “/dev/ttyUSB1:/dev/ttyUSB0”

depends_on

解決容器的依賴、啓動先後的問題。以下例子中會先啓動 redis db 再啓動 web
version: ‘3’

services:
web:
build: .
depends_on:
- db
- redis

redis:
image: redis

db:
image: postgres

注意:web 服務不會等待 redis db 「完全啓動」之後才啓動。

dns

自定義 DNS 服務器。可以是一個值,也可以是一個列表。
dns: 8.8.8.8

dns:
- 8.8.8.8
- 114.114.114.114

dns_search

配置 DNS 搜索域。可以是一個值,也可以是一個列表。
dns_search: example.com

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

tmpfs

掛載一個 tmpfs 文件系統到容器。
tmpfs: /run
tmpfs:
- /run
- /tmp

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

environment

設置環境變量。你可以使用數組或字典兩種格式。

只給定名稱的變量會自動獲取運行 Compose 主機上對應變量的值,可以用來防止泄露不必要的數據。
environment:
RACK_ENV: development
SESSION_SECRET:

environment:
- RACK_ENV=development
- SESSION_SECRET

如果變量名稱或者值中用到 true|false,yes|no 等表達 布爾 含義的詞彙,最好放到引號裏,避免 YAML 自動解析某些內容爲對應的布爾語義。這些特定詞彙,包括
y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF

expose

暴露端口,但不映射到宿主機,只被連接的服務訪問。

僅可以指定內部端口爲參數
expose:
- “3000”
- “8000”

external_links

注意:不建議使用該指令。

鏈接到 docker-compose.yml 外部的容器,甚至並非 Compose 管理的外部容器。
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql

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

healthcheck

通過命令檢查容器是否健康運行。
healthcheck:
test: [“CMD”, “curl”, “-f”, “http://localhost“]
interval: 1m30s
timeout: 10s
retries: 3

image

指定爲鏡像名稱或鏡像 ID。如果鏡像在本地不存在,Compose 將會嘗試拉取這個鏡像。
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd

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

注意:不推薦使用該指令。

logging

配置日誌選項。
logging:
driver: syslog
options:
syslog-address: “tcp://192.168.0.42:123”

目前支持三種日誌驅動類型。
driver: “json-file”
driver: “syslog”
driver: “none”

options 配置日誌驅動的相關參數。
options:
max-size: “200k”
max-file: “10”

network_mode

設置網絡模式。使用和 docker run 的 –network 參數一樣的值。
network_mode: “bridge”
network_mode: “host”
network_mode: “none”
network_mode: “service:[service name]”
network_mode: “container:[container name/id]”

networks

配置容器連接的網絡。
version: “3”
services:

some-service:
networks:
- some-network
- other-network

networks:
some-network:
other-network:

pid

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

ports

暴露端口信息。

使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者僅僅指定容器的端口(宿主將會隨機選擇端口)都可以。
ports:
- “3000”
- “8000:8000”
- “49100:22”
- “127.0.0.1:8001:8001”

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

secrets

存儲敏感數據,例如 mysql 服務密碼。
version: “3.1”
services:

mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
secrets:
- db_root_password
- my_other_secret

secrets:
my_secret:
file: ./my_secret.txt
my_other_secret:
external: true

security_opt

指定容器模板標籤(label)機制的默認屬性(用戶、角色、類型、級別等)。例如配置標籤的用戶名和角色名。
security_opt:
- label:user:USER
- label:role:ROLE

stop_signal

設置另一個信號來停止容器。在默認情況下使用的是 SIGTERM 停止容器。
stop_signal: SIGUSR1

sysctls

配置容器內核參數。
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0

sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0

ulimits

指定容器的 ulimits 限制值。

例如,指定最大進程數爲 65535,指定文件句柄數爲 20000(軟限制,應用可以隨時修改,不能超過硬限制) 和 40000(系統硬限制,只能 root 用戶提高)。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000

volumes

數據卷所掛載路徑設置。可以設置宿主機路徑 (HOST:CONTAINER) 或加上訪問模式 (HOST:CONTAINER:ro)。

該指令中路徑支持相對路徑。
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro

其它指令

此外,還有包括 domainname, entrypoint, hostname, ipc, mac_address, privileged, read_only, shm_size, restart, stdin_open, tty, user, working_dir 等指令,基本跟 docker run 中對應參數的功能一致。

指定服務容器啓動後執行的入口文件。
entrypoint: /code/entrypoint.sh

指定容器中運行應用的用戶名。
user: nginx

指定容器中工作目錄。
working_dir: /code

指定容器中搜索域名、主機名、mac 地址等。
domainname: your_website.com
hostname: test
mac_address: 08-00-27-00-0C-0A

允許容器中運行一些特權命令。
privileged: true

指定容器退出後的重啓策略爲始終重啓。該命令對保持服務始終運行十分有效,在生產環境中推薦配置爲 always 或者 unless-stopped。
restart: always

以只讀模式掛載容器的 root 文件系統,意味着不能對容器內容進行修改。
read_only: true

打開標準輸入,可以接受外部輸入。
stdin_open: true

模擬一個僞終端。
tty: true

讀取變量

Compose 模板文件支持動態讀取主機的系統環境變量和當前目錄下的 .env 文件中的變量。

例如,下面的 Compose 文件將從運行它的環境中讀取變量 ${MONGO_VERSION} 的值,並寫入執行的指令中。
version: “3”
services:

db:
image: “mongo:${MONGO_VERSION}”

如果執行 MONGO_VERSION=3.2 docker-compose up 則會啓動一個 mongo:3.2 鏡像的容器;如果執行 MONGO_VERSION=2.8 docker-compose up 則會啓動一個 mongo:2.8 鏡像的容器。

若當前目錄存在 .env 文件,執行 docker-compose 命令時將從該文件中讀取變量。

在當前目錄新建 .env 文件並寫入以下內容。

支持 # 號註釋

MONGO_VERSION=3.6

執行 docker-compose up 則會啓動一個 mongo:3.6 鏡像的容器。

Docker Compose 實戰 Tomcat

version: ‘3.1’
services:
tomcat:
restart: always
image: tomcat
container_name: tomcat
ports:
- 8080:8080
volumes:
- /usr/local/docker/tomcat/webapps/test:/usr/local/tomcat/webapps/test
environment:
TZ: Asia/Shanghai

Docker Compose 實戰 MySQL

MySQL5
version: ‘3.1’
services:
mysql:
restart: always
image: mysql:5.7.22
container_name: mysql
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
command:
–character-set-server=utf8mb4
–collation-server=utf8mb4_general_ci
–explicit_defaults_for_timestamp=true
–lower_case_table_names=1
–max_allowed_packet=128M
–sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO”
volumes:
- mysql-data:/var/lib/mysql

volumes:
mysql-data:

MySQL8
version: ‘3.1’
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
command:
–default-authentication-plugin=mysql_native_password
–character-set-server=utf8mb4
–collation-server=utf8mb4_general_ci
–explicit_defaults_for_timestamp=true
–lower_case_table_names=1
ports:
- 3306:3306
volumes:
- ./data:/var/lib/mysql

adminer:
image: adminer
restart: always
ports:
- 8080:8080

Docker Compose 常用命令

前臺運行
docker-compose up

後臺運行
docker-compose up -d

啓動
docker-compose start

停止
docker-compose stop

停止並移除容器
docker-compose down

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