วิธีการเขียนสำหรับการเชื่อมกับเน็ตเวิร์คภายนอก โดยจากเท่าที่เคนรู้มาเหมือน 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 ที่อยู่ภายนอกได้แล้ว