1. 程式人生 > >使用Docker Compose管理多個容器

使用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,將執行以下幾步:

  1. 建立一個名為ghost_blog的網路 。
  2. 以服務名(ghost-app、nginx、db)分別建立三個容器(Service與容器對應),新增到ghost網路中 。
  3. 容器以服務名作為其hostname相互訪問。

如果一切正常會建立三個服務,可以使用docker-compose ps檢視到。

這裡寫圖片描述

如果出現異常服務沒起來,那麼需要檢查配置檔案並通過docker-compose logs檢視日誌來找打問題以解決,我們可以先使用stop命令停止服務並使用rm命令清除一下,最後使用docker-compose build命令再次重建服務。
這裡寫圖片描述

服務起來後來到瀏覽器訪問locahost地址,可以看ghost主頁。
這裡寫圖片描述

然後訪問localhost/ghost地址,註冊一個使用者,簡單釋出一篇部落格。
這裡寫圖片描述

最後回到主頁,可以看到我們釋出的內容了。
這裡寫圖片描述