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 ได้อย่างมีประสิทธิภาพ