我們知道使用一個 Dockerfile 模板文件可以定義一個單獨的應用容器,如果需要定義多個容器就需要服務編排。服務編排有很多種技術方案,今天給大家介紹 Docker 官方產品 Docker Compose 。
Dockerfile 可以讓用戶管理一個單獨的應用容器;而 Compose 則允許用戶在一個模板(YAML 格式)中定義一組相關聯的應用容器(被稱為一個 project,即項目),例如一個 Web 服務容器再加上后端的數據庫服務容器等。
在Docker for Windows中,docker-compose是被默認安裝的,你可以通過--version參數來查看安裝的版本:
Docker Compose 介紹
Docker-Compose 是 Docker 的一種編排服務,是一個用於在 Docker 上定義並運行復雜應用的工具,可以讓用戶在集群中部署分布式應用。
通過 Docker-Compose 用戶可以很容易地用一個配置文件定義一個多容器的應用,然后使用一條指令安裝這個應用的所有依賴,完成構建。Docker-Compose 解決了容器與容器之間如何管理編排的問題。
Docker Compose 工作原理圖
Compose 中有兩個重要的概念:
- 服務 (service) :一個應用的容器,實際上可以包括若干運行相同鏡像的容器實例。
- 項目 (project) :由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 文件中定義。
一個項目可以由多個服務(容器)關聯而成,Compose 面向項目進行管理,通過子命令對項目中的一組容器進行便捷地生命周期管理。
Compose 項目由 Python 編寫,實現上調用了 Docker 服務提供的 API 來對容器進行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 來進行編排管理。
Quick Start
我們以官網上的簡單示例來看看 docker compose 的使用方法。
我們設計這么一個場景,使用 Python 啟動一個 Web 服務,輸出一個hello()
方法,每次訪問的時候在 Redis 緩存中進行計數,並且將統計的結果打印到頁面中。
第一步,創建 Python 服務
創建項目路徑:
mkdir composetest cd composetest
在目錄下創建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) if __name__ == "__main__": app.run(host="0.0.0.0", debug=True)
在這個例子中, redis 使用了容器內的網絡默認端口是6379。這段 Python 程序的內容就是,啟動后連接 Redis 並且輸出 hello()
方法,當每次訪問的時候累計訪問次數並且將結果放回到頁面。
在同目錄下創建requirements.txt
文件,添加項目依賴的python包:
flask
redis
第二步,創建 Dockerfile
我們來寫一個 Dockerfile 來定義 Docker 鏡像,此鏡像包含了 Python 的依賴包和 Python 環境。
同樣在此目錄下,我們創建一個 Dockerfile 文件。
FROM python:3.4-alpine ADD . /code WORKDIR /code RUN pip install -r requirements.txt CMD ["python", "app.py"]
這段代碼表示:
- 使用基礎鏡像 Python 3.4
- 將當前目錄映射到鏡像
/code
目錄下 - 設置工作目錄為
/code
- 安裝 Python 依賴包
- 啟動
app.py
程序
第三步,使用 Compose 文件定義一個服務
在當期目錄下,我們創建一個 docker-compose.yml 文件,內容如下:
version: '2' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"
這個 Compose 文件定義了兩個服務, 一個 Pyhon Web 服務和 redis 服務。
- Pyhon Web 服務:使用 Dockerfile 構建了當前鏡像。將 Web 容器內部的5000端口映射到 host 的5000端口;並將 Web 容器與 redis 容器連接。
- redis服務:該容器直接由官方的 redis 鏡像創建。
此時,工作文件夾應如下:
第四步,使用 Compose 編譯啟動應用
使用命令docker-compose up
啟動(+d的話表示在后台啟動):
version: '2' services: web: build: . command: python app.py ports: - "5000:5000" volumes: - .:/code redis: image: "redis:alpine"
啟動成功之后,在瀏覽器訪問:http://ipaddress:5000/
,返回如下:
不斷的刷新數字會不斷的增長。
Docker Compose 常用命令
使用 docker-compose up -d
在后台啟動服務
C:\Users\20928\Downloads\composetest>docker-compose up Starting composetest_web_1 ... done Starting composetest_redis_1 ... done Attaching to composetest_web_1, composetest_redis_1
使用 docker-compose ps
命令查看啟動的服務
C:\Users\20928\Downloads\composetest>docker-compose ps 系統找不到指定的路徑。 Name Command State Ports --------------------------------------------------------------------- composetest_redis_1 docker-entrypoint.sh redis ... Exit 0 composetest_web_1 python app.py Exit 0
使用docker-compose stop
停止服務。
C:\Users\20928\Downloads\composetest>docker-compose stop Stopping composetest_web_1 ... done Stopping composetest_redis_1 ... done
其它常用命令
#查看幫助 docker-compose -h # -f 指定使用的 Compose 模板文件,默認為 docker-compose.yml,可以多次指定。 docker-compose -f docker-compose.yml up -d #啟動所有容器,-d 將會在后台啟動並運行所有的容器 docker-compose up -d #停用移除所有容器以及網絡相關 docker-compose down #查看服務容器的輸出 docker-compose logs #列出項目中目前的所有容器 docker-compose ps #構建(重新構建)項目中的服務容器。服務容器一旦構建后,將會帶上一個標記名,例如對於 web 項目中的一個 db 容器,可能是 web_db。可以隨時在項目目錄下運行 docker-compose build 來重新構建服務 docker-compose build #拉取服務依賴的鏡像 docker-compose pull #重啟項目中的服務 docker-compose restart #刪除所有(停止狀態的)服務容器。推薦先執行 docker-compose stop 命令來停止容器。 docker-compose rm #在指定服務上執行一個命令。 docker-compose run ubuntu ping docker.com #設置指定服務運行的容器個數。通過 service=num 的參數來設置數量 docker-compose scale web=3 db=2 #啟動已經存在的服務容器。 docker-compose start #停止已經處於運行狀態的容器,但不刪除它。通過 docker-compose start 可以再次啟動這些容器。 docker-compose stop
參考鏈接: