Skip to main content

Exposing Ports in Docker

การเปิดพอร์ต (Exposing Ports) ใน Docker​

เมื่อคุณใช้ Docker เพื่อสร้างและรัน container, อุปกรณ์ต่างๆ เช่น แอปพลิเคชันใน container ต้องการการเชื่อมต่อกับโลกภายนอกผ่าน network ports. การ เปิดพอร์ต (Exposing Ports) คือกระบวนการที่ทำให้ container สามารถรับการเชื่อมต่อจากภายนอกผ่านพอร์ตที่ระบุ

การเปิดพอร์ตใน Docker​

Docker ใช้คำสั่ง -p หรือ --publish เพื่อทำการเชื่อมต่อพอร์ตระหว่าง host (เครื่องที่รัน Docker) และ container. การเปิดพอร์ตใน Docker ช่วยให้แอปพลิเคชันที่ทำงานใน container สามารถเข้าถึงได้จากภายนอก

Syntax:​

docker run -p <host_port>:<container_port> <image_name>
  • host_port: พอร์ตที่คุณต้องการเปิดในเครื่อง host
  • container_port: พอร์ตที่ใช้ภายใน container
  • image_name: ชื่อของ Docker image ที่คุณต้องการรัน

ตัวอย่าง:

docker run -p 8080:80 my-web-app

ในตัวอย่างนี้:

  • 8080 คือพอร์ตที่เปิดในเครื่อง host
  • 80 คือพอร์ตที่แอปพลิเคชันใน container กำหนดให้รับการเชื่อมต่อ
  • my-web-app คือ Docker image ที่จะรัน

วิธีการ Expose พอร์ตใน Dockerfile​

นอกจากการเปิดพอร์ตขณะรัน container, คุณสามารถกำหนดพอร์ตที่ต้องการเปิดใน Dockerfile ของโปรเจค โดยใช้คำสั่ง EXPOSE. การใช้คำสั่ง EXPOSE ใน Dockerfile จะทำให้ container สามารถรับการเชื่อมต่อจากภายนอกที่พอร์ตนั้นๆ ได้

ตัวอย่างการใช้ EXPOSE ใน Dockerfile:​

FROM nginx:latest
EXPOSE 80

ในตัวอย่างนี้:

  • เราใช้ nginx image และเปิดพอร์ต 80 ภายใน container
  • เมื่อ container นี้ถูกสร้างขึ้น พอร์ต 80 จะถูกเปิดและสามารถเชื่อมต่อได้จากภายนอก (หากมีการใช้คำสั่ง docker run -p เพื่อเชื่อมต่อกับพอร์ตในเครื่อง host)

หมายเหตุ: การใช้คำสั่ง EXPOSE ใน Dockerfile ไม่ได้ทำให้พอร์ตเปิดใช้งานทันที มันเพียงแค่ระบุว่า container ควรจะรับการเชื่อมต่อที่พอร์ตนี้เมื่อ container ถูกใช้งาน

การเปิดพอร์ตหลายๆ พอร์ต​

หาก container ต้องการเปิดหลายพอร์ตในเวลาเดียวกัน คุณสามารถใช้คำสั่ง -p หลายๆ ครั้งเพื่อเชื่อมต่อพอร์ตได้

ตัวอย่าง:

docker run -p 8080:80 -p 443:443 my-web-app

ในตัวอย่างนี้:

  • พอร์ต 8080 ในเครื่อง host จะเชื่อมต่อกับพอร์ต 80 ใน container
  • พอร์ต 443 ในเครื่อง host จะเชื่อมต่อกับพอร์ต 443 ใน container

การเปิดพอร์ตแบบ Dynamic​

นอกจากการกำหนดพอร์ตที่ชัดเจนแล้ว, คุณสามารถเปิดพอร์ตแบบ dynamic หรือ random ได้โดยไม่ต้องระบุพอร์ตที่ต้องการในเครื่อง host:

docker run -p 80 my-web-app

ในกรณีนี้:

  • Docker จะเลือกพอร์ตที่ว่างในเครื่อง host โดยอัตโนมัติและทำการเชื่อมต่อพอร์ตนั้นกับพอร์ต 80 ใน container
  • คุณสามารถดูพอร์ตที่ถูกเลือกได้โดยใช้คำสั่ง docker ps

การตรวจสอบพอร์ตที่เปิดอยู่​

เมื่อ container กำลังรัน, คุณสามารถใช้คำสั่ง docker ps เพื่อตรวจสอบพอร์ตที่เปิดอยู่และการเชื่อมต่อระหว่าง host และ container:

docker ps

การแสดงผลจะมีลักษณะคล้ายๆ นี้:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
abcd1234abcd my-web-app:latest "nginx -g 'daemon of…" 10 minutes ago Up 9 minutes 0.0.0.0:8080->80/tcp my-running-app

ในที่นี้:

  • พอร์ต 8080 บนเครื่อง host ถูกเชื่อมต่อกับพอร์ต 80 ใน container

การเชื่อมต่อกับพอร์ตภายใน container โดยตรง​

หากคุณต้องการเข้าถึงพอร์ตภายใน container โดยตรงจากภายในเครื่อง host หรือจากเครื่องอื่นๆ ในเครือข่ายเดียวกัน, คุณสามารถใช้ Docker network ในการจัดการการเชื่อมต่อเหล่านี้

ตัวอย่างการสร้างและใช้ Docker network:

docker network create my-network
docker run --network my-network -p 8080:80 my-web-app

สรุป​

การ เปิดพอร์ต (Exposing Ports) ใน Docker เป็นวิธีการที่สำคัญในการทำให้ container สามารถรับการเชื่อมต่อจากโลกภายนอกได้ การเปิดพอร์ตสามารถทำได้ทั้งในขณะรัน container โดยใช้คำสั่ง -p หรือใน Dockerfile ด้วยคำสั่ง EXPOSE การเปิดหลายๆ พอร์ตหรือการใช้พอร์ตแบบ dynamic ยังสามารถทำได้เช่นกัน การเข้าใจและใช้งานการเปิดพอร์ตอย่างถูกต้องจะช่วยให้สามารถสื่อสารและเข้าถึงแอปพลิเคชันที่รันใน Docker container ได้อย่างมีประสิทธิภาพ