iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
0
自我挑戰組

自我學習Docker的30天奇幻旅程系列 第 6

Day6 Docker Compose組在一起比較香

這幾天我們學習了如何建立Container image、建置運行APP、使用Volumes、Bind Mounts以及建立自己的MySQL,但是每次執行、更新、停止都要一個一個指令實在太花時間了,難道沒有辦法一次就能執行完嗎!?

沒問題!就讓Docker Compose來解決你的困擾。

Docker Compose

Docker Compose只要一行指令就能執行multi-container的全部動作!只需要透過YAML定義好APP的設置,相等於使用批次檔管理檔案的概念。

接下來讓我們開始來實作Docker Compose吧!

首先要先定義好APP的設置因此從各個建置container image的命令看起吧,昨天建立的multi-container共有APP跟MySQL這兩個container因此接下來就根據這兩個來建立。

建置Docker Compose

首先需要在APP的root底下建立compose檔案,因此先建立docker-compose.yml,並先寫上要使用的版本。

docker-compose.yml

version: "3.8"

APP

昨天我們在執行APP的時候使用了以下的指令

docker run -dp 3000:3000 \
  -w /app -v "$(pwd):/app" \
  --network todo-app \
  -e MYSQL_HOST=mysql \
  -e MYSQL_USER=root \
  -e MYSQL_PASSWORD=secret \
  -e MYSQL_DB=todos \
  node:12-alpine \
  sh -c "yarn install && yarn run dev"

根據以上的命令編寫至compose檔案裡

docker-compose.yml

version: "3.8"
services:
# services 代表需要執行的containers
    app:
    # container 名稱
        image: node:12-alpine
        # image FROM
        command: sh -c "yarn install && yarn run dev"
        # 帶入-c flag的指令
        ports:
            - 3000:3000
        working_dir: /app
        # 帶入-w flag的路徑
        volumes:
            - ./:/app
        # 帶入-v flag的路徑
        environment:
            MYSQL_HOST: mysql
            MYSQL_USER: root
            MYSQL_PASSWORD: secret
            MYSQL_DB: todos
        # 帶入-e flag的內容

MySQL

昨天我們在執行MySQL的時候使用了以下的指令

docker run -d \
  --network todo-app --network-alias mysql \
  -v todo-mysql-data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=secret \
  -e MYSQL_DATABASE=todos \
  mysql:5.7

根據以上的命令編寫至compose檔案裡

docker-compose.yml

version: "3.8"

services:
  app:
    # The app service definition
    # ...
  mysql:
    image: mysql:5.7
    # image FROM
    volumes:
        - todo-mysql-data:/var/lib/mysql
    # 帶入-v flag的路徑
    environment:
        MYSQL_ROOT_PASSWORD: secret
        MYSQL_DATABASE: todos
    # 帶入-e flag的內容

volumes:
# 在這邊指定的volumes會提供給全部的services
    todo-mysql-data:

最後compose則會呈現這樣

version: '3.8'
services:
    app:
        image: node:12-alpine
        command: sh -c "yarn install && yarn run dev"
        ports:
            - 3000:3000
        working_dir: /app
        volumes:
            - ./:/app
        environment:
            MYSQL_HOST: mysql
            MYSQL_USER: root
            MYSQL_PASSWORD: secret
            MYSQL_DB: todos
    mysql:
        image: mysql:5.7
        volumes:
            - todo-mysql-data:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: secret
            MYSQL_DATABASE: todos

volumes:
    todo-mysql-data:

執行Docker Compose

在我們擁有compose檔案之後就可以開始執行!!
執行以下命令

docker-compose up -d

還記得我們執行APP、MySQL都會使用的 -d flag嗎,其實不是忘記加在compose檔案裡呢,而是在這邊執行就好了。

執行完可以在輸出看到

Creating network "app_default" with the default driver
Creating volume "app_todo-mysql-data" with default driver
Creating app_app_1   ... done
Creating app_mysql_1 ... done

可以看到Docker Compose很貼心的幫我們建立了網路來連接volume了

移除Docker Compose

如果要移除Docker Compose也是非常方便
只要執行以下命令,既然開始是up那結束自然是down瞜

docker-compose down

這邊要注意的是,移除compose的時候不會幫你移除volume,要一同移除volume則需要加上--volumes flag

總結:

終於把基礎教學學習完了,也了解了Image Layering、Layer Caching以及Multi-Stage Builds的概念,只是篇幅會太長就決定不加入此次文章。
這次的挑戰是打算只查看相關的官方文件而不參考他人文章教學的作法,因此有些不太懂得地方會先以主觀認知帶過,用意在於能夠不被他人的主觀意識影響,自行去了解其概念理論。
接下來的預估了幾個目標,例如簡單了解雲端部屬Docker、K8s等進階管理使用Docker的方法,之後再來詳細研究Docker常用的命令及各種flag,以及Dockerfile、Docker Compose file的寫法,預期還會有Docker api的使用 就敬請期待了。

參考文獻:
Docker官方文件


上一篇
Day5 container混戰拉!
下一篇
Day7 你好!Kubernetes
系列文
自我學習Docker的30天奇幻旅程24

尚未有邦友留言

立即登入留言