一、功能說明
容器在當今的雲端計算中極為重要,是構建微服務的重要組成部分。而一個微服務如果由多個容器,比如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 -vMac環境在使用安裝檔案安裝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: postgresWeb 服務就可以使用 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將主機的資料卷或著檔案掛載到容器裡。