Docker Part 9 - Docker compose 2

Docker Compose 2

ในตอนที่แล้วเราเริ่มใช้ docker-compose แทนคำสั่ง docker run กันแล้วซึ่งจะเห็นได้ว่าถ้าใช้ docker run เป็นจะมาใช้ตัว docker-compose นั้นง่ายมาก เพราะแค่เปลี่ยนวิธีประกาศเท่านั้นเอง ในตอนนี้เรามาลองประกาศหลายๆ container ในไฟล์ docker-compose.yml กันครับ

ลองสร้าง Container หลายตัว

เรามาลองสร้าง container หลายๆตัวใน compose file เดียว ซึ่งทำได้ง่ายมาก

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '3'

services :
nico_db :
image: "mysql:5.7"
ports :
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
pin_db :
image: "mysql:5.7"
ports :
- "3307:3306"
environment:
MYSQL_ROOT_PASSWORD: root

โดยจากตัวอย่างไฟล์เราจะสร้าง container ที่เป็น DB ขึ้นมาสองตัว โดยตัวนึง Bind ที่ Port 3306 อีกตัวที่ Port 3307 โดยเราสามารถดูผลลัพธ์การสร้างได้ด้วยคำสั่ง

1
2
3
docker ps
# หรือ
docker-compose ps

โดยตัว docker-compose ps จะแสดงเฉพาะ container ที่สร้างจาก docker-compose.yml โดยจากภาพจะเห็นว่ามี container สร้างขึ้นมาสองตัวโดยชื่อมันจะถูกตั้งโดย docker-compose โดยเอาชื่อ directory ที่ไฟล์ docker-compose.yml อยู่มาต่อกับชื่อ service แล้วต่อด้วยเลข ซึ่งจริงๆเราสามารถกำหนดชื่อให้ container ได้ด้วยการกำหนด container_name ใน docker-compose.yml ตัวอย่างเช่น

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '3'

services :
nico_db :
container_name: nico
image: "mysql:5.7"
ports :
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
pin_db :
container_name: pin
image: "mysql:5.7"
ports :
- "3307:3306"
environment:
MYSQL_ROOT_PASSWORD: root

Container ใน Compose คุยกันยังไง

Docker นั้นมีระบบ Network ที่ใช้เชื่อมต่อกัน ซึ่งมีหลายแบบซึ่งในส่วนนี้มีคนอธิบายไว้แล้ว สามารถตาม Link นี้ไปอ่านได้เลย ส่วนที่ผมจะอธิบายในตอนนี้จะเป็นวิธีที่ container ที่ประกาศไว้ docker-compose.yml จะคุยกันยังไง

อันดับแรกเรามาสร้าง container ที่เราต้องการจะคุยกันก่อน

1
2
3
4
5
6
7
8
9
10
11
version: '3'
services :
nico_busybox:
container_name: nico
image: "busybox"
# ตรง command นี้ไม่มีอะไร ผมอยากให้ container มัน run อยู่ไม่ดับหลังจาก start เสร็จ
command: ["tail", "-f", "/dev/null"]
kawjao_busybox:
container_name: kawjao
image: "busybox"
command: ["tail", "-f", "/dev/null"]

image : busybox คือ Image ของ busybox ที่มีคำสั่งพื้นฐานที่ใช้งานบ่อยๆ (มันเลยใช้คำว่า busy สินะ) ของ Linux ไว้ เช่น ls, telnet, ping ซึ่งอันนี้ไม่มีอะไรมากครับผมจะใช้ ping ลอง ping ไปหา container ต่างๆว่าจะต้องเรียกแบบไหน

จากนั้นสั่ง up แล้วจะได้ผลลัพธ์ด้านล่าง

1
docker-compose up -d

คล้ายนี้ลองเข้าไปใน container ของ nico เพื่อจะได้ทดลองการเชื่อมต่อ

1
docker exec -ti nico sh

จากนั้นลองสั่ง

1
2
ping kawjao
ping kawjao_busybox

จากภาพจะเห็นว่าเราสามารถอิงไปหา container kawjao ได้โดยใช้ container_name (kawjao) หรือใช้ service_name (kawjao_busybox) ซึ่งที่มันทำแบบนี้ได้เพราะ docker-compose มันทำให้ โดยถ้าเราไม่ได้ระบุว่า container นี้อยู่ใน network ไหน มันจะ default สร้างวง network ขึ้นมาให้เราและเอาทุก container ไปอยู่ในวง network นั้น โดยของผม docker-compose สร้างให้ตามชื่อ folder ที่ docker-compose.yml อยู่

ลองมาเล่นเกี่ยวกับ network กัน

มาลองเล่นเกี่ยวกับ Network กันครับ โดยผมจะสร้าง network ขึ้นมา 2 วงคือวง siamdream และ meltmallow และ container ขึ้นมา 3 ตัว โดยให้ nico อยู่ network : siamdream ส่วน pin, kawjao อยู่ network : meltmallow

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version: '3'
services :
nico_busybox:
container_name: nico
image: "busybox"
command: ["tail", "-f", "/dev/null"]
networks:
- siamdream
kawjao_busybox:
container_name: kawjao
image: "busybox"
command: ["tail", "-f", "/dev/null"]
networks:
- meltmallow
pin_busybox:
container_name: pin
image: "busybox"
command: ["tail", "-f", "/dev/null"]
# ส่วนนี้เป็นการบอกว่าให้ container นี้อยู่ network ไหนบ้าง
networks:
- meltmallow

# ส่วนนี้เป็นการประกาศว่า compose นี้มี network อะไรบ้าง
networks:
siamdream:
meltmallow:

คราวนี้มาลองเข้าเครื่อง nico เพื่อดูว่าจะสามารถติดต่อไป pin หรือ kawjao ได้ไหม และลองเข้าเครื่อง kawjao เพื่อดูว่าจะ ping ไปหา nico ได้ไหม

ซึ่งจากการทดลองจะเห็นว่า container ที่อยู่คนละ network กันไม่สามารถ ping หากันได้ แต่ถ้าอยู่ในวง network เดียวกันจะสามารถ ping ไปหากันได้ ซึ่งที่มันเป็นแบบนี้เพราะตัว docker นั้นไปสร้างวง network ให้อัตโนมัติดังภาพด้านล่าง ซึ่งจะเห็นว่าวง Network นั้นอยู่คนละวงกันจริงๆ โดยที่เราไม่ต้องไปกำหนดเอง ซึ่งด้วยวิธีทำให้ Developer สามารถจัด Zone การเชื่อมต่อระหว่าง Container ต่างๆได้โดยไม่ต้องไปกำหนด Network เองเหมือนสมัยก่อน

คราวนี้มาลองเพิ่ม Network เพิ่มเข้าไปแล้วดูว่าจะเป็นอย่างที่ผมบอกไหม

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version: '3'
services :
nico_busybox:
container_name: nico
image: "busybox"
command: ["tail", "-f", "/dev/null"]
networks:
- siamdream
- glasses_girl
kawjao_busybox:
container_name: kawjao
image: "busybox"
command: ["tail", "-f", "/dev/null"]
networks:
- meltmallow
pin_busybox:
container_name: pin
image: "busybox"
command: ["tail", "-f", "/dev/null"]
networks:
- meltmallow
- glasses_girl
networks:
siamdream:
meltmallow:
glasses_girl:

ซึ่งจากการทดลองจะเห็นว่า container nico สามารถ ping ไปหา container pin ได้แล้วเพราะสอง container นี้อยู่ในวง network : glasses_girl แต่ nico ไม่สามารถ ping ไปหา kawjao ได้เนื่องจากไม่ได้อยู่ network วงเดียวกัน ซึ่งจากตัวอย่างนี้ทำให้เห็นว่าเราจะสร้างวง network ขึ้นมากี่วงก็ได้ตามความต้องการ อยากให้ container ไหนเชื่อมต่อกันได้ก็เอาไปอยู่วงเดียวกัน ถ้าเทียบความเป็นจริงตามเขาก็จะจัดให้เครื่อง app ต่อ database ได้เท่านั้น ส่วนเครื่องขาเว็บพวก apache nginx ก็ต่อได้แค่เครื่อง app ดังนั้น ต่อให้ hack เครื่อง web ได้แต่ก็จะไปไม่ถึงเครื่อง database ต้อง hack ต่อไปให้ถึงเครื่อง app ก่อน ถึงจะ hack ต่อเข้าเครื่อง db ได้เป็นต้น

สรุป

สำหรับตอนนี้ทำให้เรารู้ว่าเราสามารถสร้างหลายๆ container ได้ในไฟล์ compose เดียว และได้รู้การเรียกหา container ต่างๆที่ถูกสร้างใน compose เดียวกันว่าต้องเรียกอย่างไร วิธีการสร้าง network ใน compose file และประกาศให้แต่ละ container อยู่ Network ไหน สำหรับตอนนี้ก็ขอจบเพียงเท่านี้

ไม่เกี่ยวกับ Docker แต่เกี่ยวกับไอดอล

Airi

Airi

เพลงประกอบการเขียน Blog

เพลงนี้ฟังตอนแรกนึกว่าเป็นเพลงรักหวานๆพูดถึงจดหมายจากวันวานเปิดอ่านแล้วรู้สึกหัวใจพองโตเพราะดนตรีมันฟังสบายๆ ฟังครั้งแรกคิดว่าอย่างงั้นจริงๆนะ พอฟังรอบสองตั้งใจฟังเนื้อร้อง เฮ้ย เดี่๋ยวนะเดี๋ยวก่อน… นี่มันอย่างเศร้าเลยนะยิ่งท่อน

หากเปลี่ยนวันให้ย้อนเวลา กลับไป.. ฉันขอทำให้เธอ ไม่เจอฉัน…

โหคือมันต้องรู้สึกเสียใจขนาดไหน