使用Docker Compose管理多個容器
Docker Compose是一個用來定義和運行復雜應用的Docker工具。使用Compose,你可以在一個檔案中定義一個多容器應用,然後使用一條命令來啟動你的應用,完成一切準備工作。
安裝Docker Compose
Linux系統安裝步驟如下圖:
$(uname -s)
輸出的是Linux,$(uname -m)
輸出的是x86_64。上面的地址http://github.com/docker/compose/releases/download/1.18.0/docker-compose-Linux-x86_64。然後通過管道將檔案寫到本機的docker-compose檔案中。
配置檔案
1.Compose的配置檔案是docker-compose.yml。在配置檔案中,所有的容器通過services來定義,然後使用docker-compose指令碼來啟動,停止和重啟應用,和應用中的服務以及所有依賴服務的容器。讓我們看看下面這個檔案:
version: '3' networks: blog: services: ghost-app: build: ghost restart: always networks: - blog depends_on: - db ports: - "2368:2368" nginx: build: nginx networks: - blog depends_on: - ghost-app ports: - "80:80" db: image: "mysql:5.7.15" networks: - blog environment: MYSQL_ROOT_PASSWORD: mysqlroot MYSQL_USER: ghost MYSQL_PASSWORD: 12345 volumes: - $PWD/data:/var/lib/mysql ports: - "3306:3306"
可以看到一份標準配置檔案應該包含 version、services、networks 三大部分,其中最關鍵的就是 services 和 networks 兩個部分,
version關鍵字指明Compose file Format的版本,目前官方所給出的版本:
networks關鍵字
配置檔案中頂級networks關鍵字,可以用來建立更加複雜的網路拓撲,指定自定義網路驅動和選項, 也可以用它來連線外部建立(非Compose建立)的網路。 每個Service可通過service內部的networks關鍵字來指定它要使用的頂級網路。 給Service指定networks的好處是,實現網路隔離或連線。
services宣告應用所需要的服務,下面先來看 services 的書寫規則。
- image
標明映象名稱或映象 ID,這個image ID可以是本地也可以是遠端的,如果本地不存在,Compose會嘗試去pull下來。
- build
服務除了可以基於指定的映象,還可以基於一份 Dockerfile,在使用 up 啟動之時執行構建任務,這個構建標籤就是 build,它可以指定 Dockerfile 所在資料夾的路徑。Compose 將會利用它自動構建這個映象,然後使用這個映象啟動服務容器。
- depends_on
在使用 Compose 時,最大的好處就是少打啟動命令,但是一般專案容器啟動的順序是有要求的,如果直接從上到下啟動容器,必然會因為容器依賴問題而啟動失敗。depends_on這個標籤解決了容器的依賴、啟動先後的問題。
- links
連結到其它服務中的容器,使一個容器可以主動的去和另外一個容器通訊。預設情況下,docker-compose下的Servcie之間是可通過服務名稱(容器名稱,也即hostname相互訪問的。 links只不過為Service提供了以別名訪問其它Service的一種方式。
- ports
ports暴露容器埠到主機的任意埠或指定埠,用法:
ports:
- "80:80" # 繫結容器的80埠到主機的80埠
- "443" # 繫結容器的443埠到主機的任意埠,容器啟動時隨機分配繫結的主機埠號
- expose
expose暴露容器給link到當前容器的容器,用法:
expose:
- "3000" #將當前容器的埠3000暴露給link到本容器的容器
ports和expose兩種方式都可以暴露容器的埠,區別是,expose不會將埠暴露給主機,只被連線的服務訪問。
- environment
設定環境變數。你可以使用陣列或字典兩種格式。
只給定名稱的變數會自動獲取它在 Compose 主機上的值,可以用來防止洩露不必要的資料。
Docker Compose將所管理的容器分為三層,工程(project),服務(service)以及容器(contaienr)。Docker Compose執行的目錄下的所有檔案(docker-compose.yml, extends檔案或環境變數檔案等)組成一個工程,若無特殊指定工程名即為當前目錄名。一個工程當中可包含多個服務,每個服務中定義了容器執行的映象,引數,依賴。一個服務當中可包括多個容器例項,Docker Compose並沒有解決負載均衡的問題,因此需要藉助其他工具實現服務發現及負載均衡。
使用例項
這裡我們使用ghost/nginx/mysql搭建一個部落格系統。使用者通過nginx來訪問ghost部落格系統,整體流程如下:
所有我們需要建立三個服務,在docker目錄下建立ghost,然後我們操作都在ghost目錄下進行。在ghost目錄下又分別建立data、ghost、nginx三個目錄
- 配置ghost服務
首先進入ghost目錄下建立Dockerfile檔案,編寫如下內容:
FROM ghost:1-alpine
COPY ./config.js /var/lib/ghost/config.js
EXPOSE 2368
#CMD ["npm", "start","--production"]
然後建立一個config.js檔案,用於ghost的配置:
var path = require('path'),
config;
config = {
production: {
url: 'http://my-ghost-blog.com',
mail: {},
database: {
client: 'mysql',
connection: {
host: 'db',
user: 'ghost',
password: '12345',
database: 'ghost',
port: '3306',
charset: 'utf8'
},
debug: false
},
paths: {
contentPath: path.join(process.env.GHOST_CONTENT, '/')
},
server: {
host: '0.0.0.0',
port: '2368'
},
}
}
// Export config
module.exports = config;
ghost目錄下完成這些可以了。
- 配置nginx服務
進入nginx目錄,編寫Dockerfile檔案
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
編寫nginx的配置檔案nginx.conf:
worker_processes 4;
events {worker_connections 1024;}
http {
server {
listen 80;
location / {
proxy_pass http://ghost-app:2368;
}
}
}
這裡http地址中的ghost-app就是docker-compose.yml檔案中的ghost-app服務。
最後編寫docker-compose配置檔案docker-compose.yml,檔案內容已在前面給出。
接下來使用docker-compose up -d
來建立並執行服務,-d
仍然表示後臺執行。docker-conpose為你的應用建立一個網路,docker-compose為每個服務建立一個容器,並加入到這個網路中,被網路中的其它容器訪問和發現。此容器能夠以容器名稱作為hostname標識,被其它容器訪問。
在ghost目錄使用命令docker-compose up
,將執行以下幾步:
- 建立一個名為ghost_blog的網路 。
- 以服務名(ghost-app、nginx、db)分別建立三個容器(Service與容器對應),新增到ghost網路中 。
- 容器以服務名作為其hostname相互訪問。
如果一切正常會建立三個服務,可以使用docker-compose ps
檢視到。
如果出現異常服務沒起來,那麼需要檢查配置檔案並通過docker-compose logs
檢視日誌來找打問題以解決,我們可以先使用stop命令停止服務並使用rm命令清除一下,最後使用docker-compose build
命令再次重建服務。
服務起來後來到瀏覽器訪問locahost
地址,可以看ghost主頁。
然後訪問localhost/ghost
地址,註冊一個使用者,簡單釋出一篇部落格。
最後回到主頁,可以看到我們釋出的內容了。