วิธีการเขียนสำหรับการเชื่อมกับเน็ตเวิร์คภายนอก โดยจากเท่าที่เคนรู้มาเหมือน bridge จะเป็น network พื้นฐาน หากเราทำการ docker run แบบไม่กำหนด network มันจะเข้าไปที่ bridge ก่อน
โดยตอนนี้ที่เคนมีปัญหาคือ เคนทำการรัน ตัว nginx-proxy ที่ภายนอกโดยไม่ได้ใช้ docker-compose ทำให้เวลา docker inspect ดูจะเห็นว่า network มันคือ bridge
จากนั้นเคนทำการเขียนไฟล์ docker-compose.yml เพื่อทำการสร้าง WordPress จากนั้นทำการรัน ปัญหาต่อมาก็คือ มันไม่สามารถเชื่อมเป็น Reverse proxy ไปเจอกับตัว nginx-proxy ได้เพราะมันต้องเชื่อม network ไปให้ถึงตัว nginx-proxy ด้วย
ดังนั้นวิธีแก้ปัญหาจะเป็นแบบนี้
ที่ไฟล์ docker-compose.yml
version: '3'
services:
docker-wp:
image: wordpress
restart: always
environment:
VIRTUAL_HOST: docker-wp.local
VIRTUAL_PORT: 5000
LETENCRYPT_HOST: docker-wp.local
LETENCRYPT_EMAIL: [email protected]
network_mode: bridge
จากโค้ดด้านบนจะเห็นว่า เคนใช้ Docker Image ของ WordPress แต่เคนไม่ได้กำหนดอะไรให้มันเลย มีแค่สั่งรันให้ได้แค่นั้น จริง ๆ มันต้องมีการกำหนดอีกหลายค่ามากเลย
ทีนี้อยากให้สังเกตุตรง network สำหรับการเชื่อมกับ bridge มันจะพิเศษนิดนึงตรงที่ใช้ network_mode: bridge
เพราะโดยปกติเวลาจะเชื่อมกับเน็ตเวิร์คภายนอกน่าจะต้องใช้คำสั่งประมาณนี้
version: '3'
services:
docker-wp:
image: wordpress
restart: always
environment:
VIRTUAL_HOST: docker-wp.local
VIRTUAL_PORT: 5000
LETENCRYPT_HOST: docker-wp.local
LETENCRYPT_EMAIL: [email protected]
networks
- default
- nginx-default
networks:
nginx-default:
external:
name: nginx_default
ขอบคุณการแก้ปัญหาดี ๆ แบบนี้ที่ค้นหาตั้งนาน จากคุณ marucjmar ที่ github.com
มาดูกันต่ออีกนิดนึง
ทีนี้ถ้าเราจะทำตัว nginx-proxy แบบที่ไม่ได้ใช้ไฟล์ docker-compose.yml แต่อยากให้ docker-compose.yml ที่เป็น WordPress เชื่อมได้ทำยังไง
ในเหตุการณ์นี้ สมมติว่าตัว Docker Container ของ nginx-proxy ชื่อว่า nginx-proxy นะครับ
ทำการสร้าง network ใหม่ให้ตัว nginx-proxy ก่อน ด้วยคำสั่ง docker network create <name of network> เช่น docker network create nginx-proxy-1
จากนั้นทำการเชื่อม nginx-proxy เข้าไปใน network nginx-proxy-1 ด้วยคำสั่ง docker network connect nginx-proxy-1 nginx-proxy
เมื่อเชื่อมแล้วในไฟล์ docker-compose.yml ของ WordPress ก็สร้าง networks ขึ้นมาและใช้มันแบบนี้
services:
wordpress:
...
networks
- nginx-proxy-1
- wordpress-network
networks:
wordpress-network:
nginx-proxy-network:
external:
name: nginx-proxy-1
เท่านี้ก็จะสามารถเชื่อมระหว่าง container ที่สร้างด้วย docker-compose.yml กับ ที่รันด้วย docker run ที่อยู่ภายนอกได้แล้ว
