Hướng dẫn Mapping Port trong Docker – Mở port (expose và publish) – Bài 7

Chào các bạn, trong bài viết này, chúng ta sẽ tìm hiểu cách mở port cho container trong Docker, để có thể truy cập dịch vụ đang chạy bên trong container từ bên ngoài hệ thống hoặc từ trình duyệt.

Xem thêm:

Cách truy cập container trong Docker để kiểm tra và xử lý sự cố – Bài 5

Docker Registry và Docker Repo – Bài 6

1. Tạo container nhưng KHÔNG mở port

Giả sử bạn chạy container Apache như sau:

docker run -d --name web01 php:apache
  • Container này chạy nền (-d) và sử dụng image php:apache.
  • Tuy nhiên, bạn không mở cổng nào để truy cập từ bên ngoài.

Kiểm tra container:

docker ps

Bạn sẽ thấy web01 đang chạy, nhưng không có port nào được publish ra máy chủ (host).

2. Mỗi dịch vụ có cổng mặc định riêng

Khi chạy container, bạn có thể kiểm tra cổng mặc định bằng lệnh:

docker image inspect php:apache

Tìm dòng "ExposedPorts" – với php:apache, cổng mặc định là 80.

Tương tự, với database như mariadb, bạn sẽ thấy port mặc định là 3306.

3. Mở port cho container bằng -p

Cú pháp:

docker run -d --name <tên_container> -p <port_host>:<port_container> <image>

Ví dụ:

docker run -d --name web02 -p 4444:80 php:apache
  • Cổng 80 trong container (Apache) được gắn ra cổng 4444 trên máy chủ Linux.
  • Truy cập vào http://<IP_máy_chủ>:4444 sẽ kết nối tới container web02.

Bạn có thể tạo nhiều container dùng chung cổng 80 bên trong, nhưng bên ngoài (host) mỗi container phải có port khác nhau:

docker run -d --name web03 -p 5555:80 php:apache
docker run -d --name web04 -p 6666:80 php:apache

Nếu bạn cố dùng cùng một port host (-p 4444:80) cho nhiều container, Docker sẽ báo lỗi:

Error: port is already allocated

4. Kiểm tra container và port đang publish

docker ps

Kết quả ví dụ:

CONTAINER ID   NAMES     PORTS
abcd1234       web02     0.0.0.0:4444->80/tcp
efgh5678       web03     0.0.0.0:5555->80/tcp
ijkl9012       web04     0.0.0.0:6666->80/tcp

5. Truy cập container từ trình duyệt

Bước 1: Xác định IP của máy chủ (host)

ip a

Giả sử IP là: 192.168.1.100

Bước 2: Mở trình duyệt

Truy cập các container theo từng port:

  • http://192.168.1.100:4444 → container web02
  • http://192.168.1.100:5555 → container web03
  • http://192.168.1.100:6666 → container web04

6. Tạo file index.html để hiển thị nội dung

Mặc định container php:apache không có file index.html, nên truy cập sẽ bị 403 Forbidden.

Truy cập vào container:

docker exec -it web02 sh

Tạo file:

echo "Hello from web02" > /var/www/html/index.html

Rồi truy cập lại trình duyệt sẽ thấy nội dung này được hiển thị.

Làm tương tự cho web03, web04 với nội dung khác nhau để phân biệt.

7. Kiểm tra port hoạt động bằng curl

Từ máy chủ, bạn có thể kiểm tra port container có đang hoạt động hay không bằng:

curl http://localhost:4444
curl http://localhost:5555

Nếu container hoạt động tốt, bạn sẽ thấy nội dung Hello from web0x.

Kết luận

Lệnh Mục đích
-p host_port:container_port Gắn port container ra ngoài
docker ps Kiểm tra container và các port đã mở
docker exec -it <tên> sh Truy cập vào container
curl http://localhost:<port> Kiểm tra port hoạt động

Mỗi container có thể dùng chung port nội bộ (ví dụ: 80), nhưng phải gắn ra các port host khác nhau (ví dụ: 4444, 5555, 6666…).

Bài viết cùng chủ đề:

Hướng dẫn sử dụng Docker Volume – Bài 8

Docker Network là gì? Làm sao các container kết nối với nhau? – Bài 9

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em