什麼是 Docker Compose?

compose 其實就是組合的意思

所以 Docker Compose 就是把專案內需要用到的映像檔進行組合。

既然都可以組合這些映像檔了,所以 Docker Compose 當然也可以管理利用這些映像檔跑起來的 container

為什麼需要 Docker Compose?

想像今天有個網頁專案

這個網頁專案原則上會分為以下幾個部分

  • 前端(web)
  • 網頁伺服器(nginx)
  • 反向代理伺服器(middleware)
  • 後端(backend)
  • 資料庫(db)

如果每個部分都自己寫一個 Dockerfile 之後再跑 docker build 以及 docker run 是不是就很麻煩。

所以 Docker Compose 就是為了應付這種狀況而產生的工具。

接下來就來講講 Docker Compose 的寫法吧!

Docker Compose 會 yaml 格式進行設定

副檔名會用 .yml 結尾

整個檔案就會命名為:docker-compose.yml

Docker Compose 內部可以分為四個區塊

  • version
  • services
  • volumes
  • network

這邊要提一個很重要的觀念,不管是 Dockerfile 還是 Docker Compose 都會用到映射這個觀念。

映射簡單來說就是把本地端的檔案丟給 Docker Container 內部使用。

什麼是 version ?

version 代表著這份 Docker Compose file 的版本,不同的版本其 Docker engine 的支援度不同

目前有 version 1 、 version 2、 version 3 三種版本,最常使用且支援度最高的是 version 3

宣告 Docker Compose file 版本,也很簡單只要寫成這樣即可:

version: '3'

什麼是 services ?

對於 Docker Compose 來說,只要是此專案需要用到的東西都統稱為服務(services)

以剛剛的例子來看,這個專案就會有五種服務,這些服務的描述就是寫在 services 內。

一步一步建立一個 service 吧!

定義這個 services 的名稱

              
                services:
                  web:
                    # write web settings
              
            

指定哪個映像檔

              
                # image 來自 Dockerfile build
                web:
                  build: ./front-end

                # image 來自 Docker Hub
                mysql:
                  build: mysql:5.7
              
            

指定對外以及 container 端口(port)

              
                # ports 寫法會是 "HOST:CONTAINER"
                ports:
                  "80:80"
                # 假如只寫一個則代表 "CONTAINER"
                ports:
                  "80"
              
            

服務彼此相依性

              
                depends_on:
                  - api_server
              
            

container 重啟

              
                # restart 有四種參數:"no"、always、on-failure、unless-stopped
                restart: always
              
            

最後組合起來就會像這樣:

再來講點進階版的設定

volumes 代表著將專案內檔案映射至 container 中指定資料夾

              
                volumes:
                  - db-data:/var/lib/mysql
              
            

environment 代表此服務的環境變數,這個就要看此映像檔支援哪些環境變數設定

              
                environment:
                  MYSQL_DATABASE: 'mytestdb'
                  MYSQL_USER: 'testuser'
                  MYSQL_PASSWORD: 'password'
                  MYSQL_ROOT_PASSWORD: 'password'
              
            

network 代表服務彼此間的內部溝通網路橋樑

              
                networks:
                  - myNetWork
              
            

expose 代表此服務要暴露哪個端口使其他的服務可以藉由此端口進行連接

              
                expose:
                  - '3306'
              
            

最後組合起來就會像這樣:

什麼是 volumes ?

volumes 的存在就是為了讓每次重啟 container 時都還可以引用到之前所存放的資料。

可以跟 services 區塊內的 volumes 搭配使用

              
                services:
                  db:
                    image: db
                    volumes:
                      - data-volume:/var/lib/db
              
                volumes:
                  data-volume:
              
            

什麼是 network ?

network 設定此專案的網路

在 network 中會搭配一些 driver ,常見的有:

  • bridge:將各個服務建立一座可以互相溝通的橋樑
  • overlay:在容器之間啟用 multi-host 通訊

最後寫法長像這樣:

              
                networks:
                  myNetwork:
                    driver: bridge
              
            

最後就來講講如何建立起來這些服務吧!

docker-compose build

docker-compose up -d

docker-compose stop

docker-compose start

docker-compose restart

docker-compose down

下次的分享會主題是 Kubernetes 的介紹

謝謝大家