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 คือ
- webapp ใช้ image ที่ชื่อว่า
atlasx-webapp:1.0.0และตั้งชื่อ container ว่าwebappและเปิด port ที่เป็น และเชื่อม port8080ของ Host ไปที่ port80ของ container และกำหนดให้ container นี้ restart ใหม่อัตโนมัติหาก container นี้เสียหาย - 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 downDocker จะทำการหยุด 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 ให้ครบถ้วน ซึ่งประกอบไปด้วย
| Variable | Description |
|---|---|
NPM_TOKEN | npm token ของ atlasx npm registry |
ซึ่ง npm token นั้นสามารถหาได้จากไฟล์ .npmrc
# MacOS / Linux
cat $HOME/.npmrc | grep _authToken# Windows
type %USERPROFILE%\.npmrc | findstr _authTokenNote
🚨 ห้าม 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 downCompose 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 ให้ครบถ้วน ซึ่งประกอบไปด้วย
| Variable | Description |
|---|---|
NUGET_TELERIK_USER | Username ของ telerik สามารถขอได้จากทีม AtlasX |
NUGET_TELERIK_PASSWORD | Password ของ telerik สามารถขอได้จากทีม AtlasX |
NUGET_ATLASX_USER | Username ของ CDG Account |
NUGET_ATLASX_PASSWORD | Password ของ 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