Trong Dockerfile, EXPOSE là một chỉ thị được sử dụng để khai báo các cổng mạng mà container Docker sẽ lắng nghe khi chạy.
Chỉ thị EXPOSE không mở các cổng trên host machine hoặc container, mà chỉ thông báo rằng container sẽ lắng nghe các cổng đã được khai báo khi chạy. Để thực tế mở các cổng và kết nối chúng với các cổng trên host machine, bạn cần sử dụng tùy chọn -p hoặc –publish khi chạy lệnh docker run.
Cú pháp của EXPOSE trong Dockerfile như sau:
EXPOSE <port1> [<port2>...]
- <port1>, <port2>, vv.: Các cổng mạng mà container sẽ lắng nghe.
Ví dụ, để khai báo rằng container sẽ lắng nghe cổng 80 và 443, bạn có thể thêm dòng sau vào Dockerfile:
EXPOSE 80 443
Khi chạy container từ image đã xây dựng, bạn có thể mở các cổng trên host machine và kết nối chúng với các cổng trong container bằng cách sử dụng -p hoặc –publish:
docker run -p 8080:80 -p 8443:443 tên_image
Trong ví dụ trên, cổng 80 trong container sẽ được kết nối với cổng 8080 trên host machine và cổng 443 trong container sẽ được kết nối với cổng 8443 trên host machine.
Chú ý rằng chỉ thị EXPOSE chỉ là một khai báo trong Dockerfile và không thực hiện thay đổi trên host machine hoặc container. Nó chỉ thông báo rằng các cổng đã được khai báo sẽ được container lắng nghe. Việc mở và kết nối các cổng thực tế sẽ được thực hiện khi chạy container bằng lệnh docker run với tùy chọn -p hoặc –publish.
Các bước
- Tạo một hình ảnh với hướng dẫn EXPOSE
- Kiểm tra cổng EXPOSE trong ảnh
- Xuất bản tất cả các cổng tiếp xúc
Tạo một image với EXPOSE
Dockerfile
FROM nginx:alpine LABEL maintainer="hocdevops" EXPOSE 80/tcp EXPOSE 80/udp CMD [ "nginx","-g","daemon off;" ]
Build docker image
$ docker build -t expose:v1 .
Tạo container dựa trên image Exposure:v1
$ docker container run --rm -d --name expose-inst expose:v1
Kiểm tra cổng EXPOSE trong image
$ docker image inspect --format= expose:v1
Publish tất cả các port
Chúng ta có thể publish tất cả port EXPOSE bằng flag -P .
$ docker container run --rm -P -d --name expose-inst-Publish expose:v1
Kiểm tra published port
$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 24983e09bd86 expose:v1 "nginx -g 'daemon of…" 46 seconds ago Up 45 seconds 0.0.0.0:32768->80/tcp, 0.0.0.0:32768->80/udp expose-inst-Publish