Mục tiêu bài học
- Phân biệt Expose và Publish ports
- Sử dụng các flags:
--expose,-p,-P - Kiểm tra kết nối bằng
curl
Gán nhiều loại port (TCP, UDP)
1. Tạo container nginx không gán port
docker run -d nginx
docker container ls
curl localhost # Connection refused
Vì sao?
Container đang mở port 80, nhưng chưa map nó ra ngoài host.
Kiểm tra IP container:
docker inspect <container_id>
curl <container_ip> # Truy cập được
2. Dùng -expose: Chỉ mở cổng trong nội bộ
docker container run -d --expose 3000 nginx
Điều này chỉ cho phép cổng có thể được map, không tự động publish.
Kiểm tra:
docker container ls
3. Dùng p: Map port host → container
docker container run -d -p 80:3000 nginx
Cổng 80 (host) map vào cổng 3000 (container)
curl localhost:3000 # Không có tiến trình nào ở port 3000
Giải thích: Container không có ứng dụng nào đang lắng nghe tại 3000.
4. Map đúng cổng có tiến trình (vd: nginx cổng 80)
docker container run -d -p 8080:80 nginx
curl localhost:8080 # Hiện trang Welcome của nginx
5. Map nhiều loại giao thức (TCP/UDP)
docker container run -d \
-p 8081:80/tcp \
-p 8081:80/udp nginx
Dùng -p nhiều lần để map nhiều cổng hoặc nhiều giao thức.
6. Random map cổng với P
docker container run -d -P nginx
docker container ls
Docker tự chọn cổng trên host (vd: 32768 → 80 container)
7. Kiểm tra port với docker container port
docker container port <container_name or id>
Ví dụ:
80/tcp -> 8081
80/udp -> 8081
Tổng kết nhanh
| Lệnh / Flag | Chức năng |
|---|---|
--expose | Mở cổng container nhưng không map |
-p x:y | Map cổng x của host → y container |
-P | Random map cổng host đến cổng container |
docker container port | Xem danh sách cổng đã map |
Note:
-expose= Mở cổng nội bộp= Map rõ ràngP= Docker tự chọn cổng