iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 9
0
DevOps

就是「懶」才更需要重視DevOps系列 第 9

Day9 該如何將Docker Run 指令,轉換成Docker-compose內容

初學 Docker 時,很常發生在不知道 docker-compose.yml 該如何撰寫,且官方網站又沒有提供範例參考,僅僅丟下一行 docker run 指令,ex:Redis Container

接下來將會示範該如何拆解 docker run 指令,並撰寫 docker-compose.yml

$ docker run -v ./redis.conf:/usr/local/etc/redis/redis.conf --name myredis redis redis-server /usr/local/etc/redis/redis.conf

首先每一個 docker-compose.yml 最重要的內容就是選擇使用 docker-compose 的版本號

version: "3"                        # docker-compose 版本號

services:                           # 開始撰寫 container 服務
  redis:                            # 可以隨意命名,通常以有意義的字串命名
    image: redis:5.0.5-alpine       # 服務容器,若無指定版號表示使用 latest 版本, alpine 容器佔用空間較小,通常建議使用

接著開始拆解 docker 指令,並轉換至 docker-compose.yml

  • -v 表示掛載,並且使用「:」分隔容器內外的路徑。
## 該範例表示機器當前路徑內的「redis.conf」
## 掛載至容器內的「/usr/local/etc/redis/redis.conf」
-v ./redis.conf:/usr/local/etc/redis/redis.conf

看看 docker-compose.yml 該如何繼續延伸:

version: "3"                        # docker-compose 版本號

services:                           # 開始撰寫 container 服務
  redis:                            # 可以隨意命名,通常以有意義的字串命名
    image: redis:5.0.5-alpine       # 服務容器,若無指定版號表示使用 latest 版本, alpine 容器佔用空間較小,通常建議使用
    volumes:                        # 掛載的撰寫方式,如果有多組不同路徑掛載,只需要在新增幾行條件即可。
      - ./redis.conf:/usr/local/etc/redis/redis.conf
  • 「- -name」表示指定容器名稱
  • 預設會將使用「資料夾名稱 + 第三行字定義名稱 + 順序數字」
--name myredis

看看 docker-compose.yml 該如何繼續延伸:

version: "3"                        # docker-compose 版本號

services:                           # 開始撰寫 container 服務
  redis:                            # 可以隨意命名,通常以有意義的字串命名
    image: redis:5.0.5-alpine       # 服務容器,若無指定版號表示使用 latest 版本, alpine 容器佔用空間較小,通常建議使用
    volumes:                        # 掛載的撰寫方式,如果有多組不同路徑掛載,只需要在新增幾行條件即可。
      - ./redis.conf:/usr/local/etc/redis/redis.conf
    container_name: myredis         # 指容器名稱,這裡比較不同的是指令使用「--name」,但在yml應該使用「container_name」

最後剩下一個指令要進行拆解

## 這一行是指當容器啟動後,該執行的動作
## 表示容器啟動後還需要跑起redis,才算完成。
## 這邊的 redis.conf 即剛剛掛載進入的redis.conf
## 可以先行編輯完內容在掛載。
redis-server /usr/local/etc/redis/redis.conf

看看 docker-compose.yml 該如何繼續延伸:

version: "3"                        # docker-compose 版本號

services:                           # 開始撰寫 container 服務
  redis:                            # 可以隨意命名,通常以有意義的字串命名
    image: redis:5.0.5-alpine       # 服務容器,若無指定版號表示使用 latest 版本, alpine 容器佔用空間較小,通常建議使用
    volumes:                        # 掛載的撰寫方式,如果有多組不同路徑掛載,只需要在新增幾行條件即可。
      - ./redis.conf:/usr/local/etc/redis/redis.conf
    container_name: myredis         # 指容器名稱,這裡比較不同的是指令使用「--name」,但在yml應該使用「container_name」
    command: redis-server /usr/local/etc/redis/redis.conf # command 表示啟動容器後預備執行的動作

另外有時會看見以下範例

$ docker run -e "ENV=develop" redis
  • 「-e」表示將參數帶入容器內
    通常會定義「key=value」,在容器內呼叫時,只需要呼叫「key」即可,看看以下 docker-compose.yml 範例。
version: "3"                        # docker-compose 版本號

services:                           # 開始撰寫 container 服務
  redis:                            # 可以隨意命名,通常以有意義的字串命名
    image: redis:5.0.5-alpine       # 服務容器,若無指定版號表示使用 latest 版本, alpine 容器佔用空間較小,通常建議使用
    volumes:                        # 掛載的撰寫方式,如果有多組不同路徑掛載,只需要在新增幾行條件即可。
      - ./redis.conf:/usr/local/etc/redis/redis.conf
    container_name: myredis         # 指容器名稱,這裡比較不同的是指令使用「--name」,但在yml應該使用「container_name」
    command: redis-server /usr/local/etc/redis/redis.conf # command 表示啟動容器後預備執行的動作
    environment:                    # 提供參數至容器內部,docker 指令是使用「-e 或者 --env」,但在yml應該使用「environment」
      - ENV=develop

以上就完成了 docker run 指令的拆解了,明天會在示範該如何建制自己的 image 。


上一篇
Day8 不同yml檔,也可以讓容器彼此都能溝通
下一篇
Day10 打造屬於團隊的 Image
系列文
就是「懶」才更需要重視DevOps30

尚未有邦友留言

立即登入留言