Using Docker Compose

Using Docker Compose

โดยปกติแล้ววิธีการที่เหมาะสมที่สุดในการรัน container คือการใช้ Docker Compose ซึ่งจะทำให้เราสามารถรัน container ได้ง่ายขึ้น โดยไม่ต้องรันคำสั่ง docker run ทุกครั้ง อีกทั้งยังสามารถรัน container ได้หลาย ๆ container พร้อมกันในคำสั่งเดียวได้เช่นกัน

รวมถึงการใช้ Docker Compose นั้นสามารถรัน container ขึ้นมาจาก Dockerfile ได้โดยที่ไม่ต้อง build image ด้วยตัวเองเพราะว่า Docker Compose มีคุณสมบัติที่สามารถ build image ให้เราได้โดยอัตโนมัติ

Introduction

โดยปกติแล้วการรันด้วย Docker Compose เราต้องมี compose file ที่เป็นไฟล์ YAML เช่น docker-compose.yml ในการกำหนดค่าต่าง ๆ ของ container ไม่ว่าจะเป็น

  • ชื่อ container
  • port ของ container
  • network ของ container
  • volume ของ container
  • environment variable ของ container
  • และอื่น ๆ

Example

# docker-compose.yml
version: '3.8'

services:
  webapp:
    image: 'atlasx-webapp:1.0.0'
    container_name: webapp
    ports:
      - '8080:8080'
    restart: unless-stopped

เช่น compose file นี้ จะเป็นการรัน AtlasX Web Application ซึ่งลักษณะการรันคือ ใช้ image ที่ชื่อว่า atlasx-webapp:1.0.0 และตั้งชื่อ container ว่า webapp และเชื่อม port 8080 ของ Host ไปที่ port 80 ของ container และกำหนดให้ container นี้ restart ใหม่อัตโนมัติหาก container นี้เสียหาย

ซึ่งเราสามารถรวม stack การรัน container ได้หลาย ๆ container โดยใช้ compose file ไฟล์เดียวได้เช่นกัน

# docker-compose.yml
version: '3.8'

services:
  webapp:
    image: 'atlasx-webapp:1.0.0'
    container_name: webapp
    ports:
      - '8080:8080'
    restart: unless-stopped
  webservice:
    image: 'atlasx-webservice:1.0.0'
    container_name: webservice
    ports:
      - '5080:80'
    restart: unless-stopped

เช่น compose file นี้ จะเป็นการรัน AtlasX Web Application และ AtlasX Web Service พร้อมกัน โดยจะแบ่งออกเป็น 2 service คือ

  1. webapp ใช้ image ที่ชื่อว่า atlasx-webapp:1.0.0 และตั้งชื่อ container ว่า webapp และเปิด port ที่เป็น และเชื่อม port 8080 ของ Host ไปที่ port 80 ของ container และกำหนดให้ container นี้ restart ใหม่อัตโนมัติหาก container นี้เสียหาย
  2. webservice ใช้ image ที่ชื่อว่า atlasx-webservice:1.0.0 และตั้งชื่อ container ว่า webservice และเปิด port ที่เป็น 5080 ของ host และเปิด port ที่เป็น 80 ของ container และกำหนดให้ container นี้ restart ใหม่อัตโนมัติหาก container นี้เสียหาย

ซึ่งในการรันผ่าน Docker Compose นั้นก็ให้ไปที่ directory ที่มี compose file นี้อยู่ แล้วรันคำสั่ง

docker-compose up -d

โดยที่ -d คือ flag ที่ใช้ในการรัน container ใน background ถ้าหากต้องการรัน container ใน foreground ก็ให้ลบ flag นี้ออกไป

และเมื่อต้องการหยุดการรัน container ก็ให้รันคำสั่ง

docker-compose down

Docker จะทำการหยุด container ที่รันอยู่และลบ container ที่รันอยู่ออกไปให้โดยอัตโนมัติ

Compose AtlasX Web Application

ใน AtlasX Web Application เราได้ทำการเพิ่มไฟล์ docker-compose.yml ไปให้แล้วดังนี้

version: '3.8'

services:
  webapp:
    build:
      context: ClientApp
      dockerfile: docker/Dockerfile
      args:
        - NPM_TOKEN=${NPM_TOKEN}
    container_name: webapp
    ports:
      - '8080:8080'
    restart: unless-stopped

กำหนด build arguments ด้วยการคัดลอกไฟล์ example.env ไปเป็นไฟล์ .env แล้วแก้ไขค่าในไฟล์ .env ให้ครบถ้วน ซึ่งประกอบไปด้วย

VariableDescription
NPM_TOKENnpm token ของ atlasx npm registry

ซึ่ง npm token นั้นสามารถหาได้จากไฟล์ .npmrc

# MacOS / Linux
cat $HOME/.npmrc | grep _authToken
# Windows
type %USERPROFILE%\.npmrc | findstr _authToken
Note

🚨 ห้าม push ไฟล์ .env ขึ้นไปที่ VSC หรือเปิดเผย credentials ใดๆ ในไฟล์ .env นี้โดยเด็ดขาด

จากนั้นให้ไปที่ directory ที่มีไฟล์ docker-compose.yml นี้อยู่ แล้วรันคำสั่ง

docker-compose up -d

สามารถใช้ option --build ในการ build image ใหม่ได้

docker-compose up -d --build

แล้วลองเข้าไปที่ http://localhost:8080 เพื่อดูผลลัพธ์

Clean Up

เมื่อทำการทดสอบเสร็จแล้ว สามารถทำการลบ container ที่รันอยู่ได้โดยใช้คำสั่ง

docker-compose down

Compose AtlasX Web Service

ใน AtlasX Web Service เราได้ทำการเพิ่มไฟล์ docker-compose.yml ไปให้แล้วดังนี้

version: '3.8'

services:
  webservice:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        - NUGET_TELERIK_USER=${NUGET_TELERIK_USER}
        - NUGET_TELERIK_PASSWORD=${NUGET_TELERIK_PASSWORD}
        - NUGET_ATLASX_USER=${NUGET_ATLASX_USER}
        - NUGET_ATLASX_PASSWORD=${NUGET_ATLASX_PASSWORD}
    container_name: webservice
    ports:
      - '5000:8080'
    restart: unless-stopped

กำหนด build arguments ด้วยการคัดลอกไฟล์ example.env ไปเป็นไฟล์ .env แล้วแก้ไขค่าในไฟล์ .env ให้ครบถ้วน ซึ่งประกอบไปด้วย

VariableDescription
NUGET_TELERIK_USERUsername ของ telerik สามารถขอได้จากทีม AtlasX
NUGET_TELERIK_PASSWORDPassword ของ telerik สามารถขอได้จากทีม AtlasX
NUGET_ATLASX_USERUsername ของ CDG Account
NUGET_ATLASX_PASSWORDPassword ของ CDG Account
Note

🚨 ห้าม push ไฟล์ .env ขึ้นไปที่ VSC หรือเปิดเผย credentials ใดๆ ในไฟล์ .env นี้โดยเด็ดขาด

จากนั้นให้ไปที่ directory ที่มีไฟล์ docker-compose.yml นี้อยู่ แล้วรันคำสั่ง

docker-compose up -d

สามารถใช้ option --build ในการ build image ใหม่ได้

docker-compose up -d --build

แล้วลองเข้าไปที่ http://localhost:5000/applogin เพื่อดูผลลัพธ์

Clean Up

เมื่อทำการทดสอบเสร็จแล้ว สามารถทำการลบ container ที่รันอยู่ได้โดยใช้คำสั่ง

docker-compose down