docker-compose เชื่อมกับ external network – bridge

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

Leave a Reply

Please Login to comment
avatar
  Subscribe  
Notify of
Navigate