Network Containers
ในบทนี้จะพูดถึงการสร้างเครือข่ายให้กับcontainer
เริ่งต้นกับ container ด้วย เครือข่ายพื้นฐาน
Docker ได้รวบรวมการช่วยเหลือต่างๆ สำหรับการสร้างเครือข่ายของ container ผ่านทางการใช้ network driver โดยปกติแล้วจะมี network driver สองตัวได้แก่
- bridge driver
- overlay driver
ทุกการติ้งตั้ง docker engine จะมี driver มาให้ สามตัว ได้แก่ $ docker network ls
NETWORK ID NAME DRIVER
18a2866682b8 none null
c288470c46f6 host host
7b369448dccb bridge bridge
network ชื่อ bridge เป็น networkพิเศษ นอกจากคุณเรียกใช้มัน มิฉะนั้นแล้ว docker จะเป็นผู้เริ่มต้น ให้ container ของคุณอยู่ใน network นี้
การสร้าง bridge network ให้เป็นของคุณเอง
Docker Engine โดยกำเนิดแล้วจะมีตัวช่วยเหลือทั้ง bridge network และ overlay network bridge network จะมีข้อจำกัดอยู่ที่ จะมีแค่ host แค่ตัวเดียวที่รันอยู่บน docker engine overlay network จำสามารถเพิ่ม host เพิ่มเข้ามาได้
ขั้นตอนการสร้าง bridge network
$ docker network create -d bridge my-bridge-network
-d flags เป็นการบอก docker ว่าให้ใช้ dridge driver ในการสร้าง network ใหม่
คุณสามารถตรวจสอบ network ที่สร้างขึ้นมาได้โดยใช้คำสั่ง
$ docker network inspect my-bridge-network
[ { "Name": "my-bridge-network", "Id": "5a8afc6364bccb199540e133e63adb76a557906dd9ff82b94183fc48c40857ac", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": [ { "Subnet": "172.18.0.0/16", "Gateway": "172.18.0.1/16" } ] }, "Containers": {}, "Options": {} } ]
การเพ่ิม containers เข้าสู่network
ในการสร้าง web application ที่มีการทำงานร่วมกันแต่ต้องการความปลอดภัย ได้โดยการสร้าง network
โดยในบทความ นี้เราจะมาเพื่ม webapp container และ training/postgres container เข้าไปในnetwork ที่เราสร้างขึ้นมา
เริ่มต้นด้วย container ที่รัน PostgresSQL database และส่งมันไปยัง my-network-bridge
$ docker run -d --network=my-bridge-network --name db training/postgres
และลองเพ่ิม web application ด้วยคำสั่ง $ docker run -d --name web training/webapp python app.py
จากนั้นลองเข้าไปในหน้า bash ของ postgressql database ด้วยคำสั่ง $ docker exec -it db bash
root@a205f0dd33b2:/# ping 172.17.0.2 ping 172.17.0.2 PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data. ^C --- 172.17.0.2 ping statistics --- 44 packets transmitted, 0 received, 100% packet loss, time 43185ms
จากภาพด้านบนจะเห็นว่าเมื่อลอง ping ไปยัง ip ของ web application(172.17.0.2) นั้นจะไม่สามารถสื่อสารกันได้ เนื่องเพราะ ตอนนี้นั้น ทั้งสอง containers นั้นอยู่กันคนละ network โดย
- training/postgres container อยู่ใน my-bridge-network network
- webapp container อยู่ใน bridge network
เราสามารถแก้ปัญหานี้ได้โดยการเชื่อมต่อ webapp container กับ my-bridge-network network ได้โดยการใช้คำสั้ง
$ docker network connect my-bridge-network web