一、功能說明
容器在當今的云計算中極為重要,是構建微服務的重要組成部分。而一個微服務如果由多個容器,比如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-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-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 composetest
cd composetest
vim App.py
import time
import redis
from flask import Flask
app = 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 的文件,內容如下:
flask
redis
2. 編輯vim Dockerfile文件
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
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.txt
- RUN 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
將主機的數據卷或著文件掛載到容器里。