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 imagephp: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
80trong container (Apache) được gắn ra cổng4444trên máy chủ Linux. - Truy cập vào
http://<IP_máy_chủ>:4444sẽ kết nối tới containerweb02.
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→ containerweb02http://192.168.1.100:5555→ containerweb03http://192.168.1.100:6666→ containerweb04
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