Tại sao nên sử dụng EXPOSE trong Dockerfile - vì dù sao bạn cũng có thể liên kết với tất cả các cổng


23

Tôi có thể docker run -p 3000:3000 image không EXPOSE có cổng đó trong container (xem bên dưới). Nếu đó là sự thật, vậy thì tại sao lại phải đặt EXPOSE vào Dockerfile? Có phải nó chỉ để giao tiếp với người dùng hình ảnh? Bởi vì tôi không biết lý do chức năng để TIẾP TỤC cổng nếu tất cả chúng đều có thể ràng buộc.


Dưới đây là các bước cho thấy tôi ràng buộc với một cổng trong một container mặc dù thực tế nó không phải là MỞ RỘNG

$ cat Dockerfile
FROM alpine
RUN apk add nodejs npm vim
COPY webserver /webserver
CMD [ "node", "/webserver/index.js" ]


$ docker build .
Sending build context to Docker daemon  1.931MB
Step 1/4 : FROM alpine
 ---> 11cd0b38bc3c
Step 2/4 : RUN apk add nodejs npm vim
 ---> Using cache
 ---> 4270f8bdb201
Step 3/4 : COPY webserver /webserver
 ---> Using cache
 ---> 67f4cda61ff0
Step 4/4 : CMD [ "node", "/webserver/index.js" ]
 ---> Using cache
 ---> 1df8f9024b85
Successfully built 1df8f9024b85


$ curl localhost:4400
curl: (7) Failed to connect to localhost port 4400: Connection refused


$ docker run -d -p 4400:3000 1df8f9024b85
7d0e6c56f8ad8827fe72830a30c1aac96821104b8ea111291ca39e6536aad8fd


$ curl localhost:4400
Hello World!


$

Câu trả lời:


29

Tài liệu EXPOSE của Docker giải quyết điểm cụ thể này:

Các EXPOSEhướng dẫn không thực sự xuất bản các cổng. Nó có chức năng như một loại tài liệu giữa người xây dựng hình ảnh và người điều hành container, về những cổng nào được dự định xuất bản. Để thực sự xuất bản cổng khi chạy container, hãy sử dụng -pcờ trên docker runđể xuất bản và ánh xạ một hoặc nhiều cổng hoặc -Pcờ để xuất bản tất cả các cổng bị lộ và ánh xạ chúng tới các cổng theo thứ tự cao.

Hãy chú ý đến câu cuối cùng, nếu bạn để lộ nhiều cổng thì -Psẽ trở nên hữu ích để tránh đặt nhiều -ptrên dòng lệnh.


"Tài liệu" ở dạng siêu dữ liệu hình ảnh. Ngoài việc hữu ích cho -Pcờ, các tiện ích khác có thể truy vấn các thùng chứa đang chạy cho siêu dữ liệu này, rất hữu ích trong các proxy tự động cập nhật quy tắc chuyển tiếp của chúng bằng cách sử dụng các cổng được hiển thị này làm mặc định.
BMitch

@BMitch hoàn toàn, tôi cảm thấy đó là một thông tin không hữu ích đối với OP, nhưng hãy thoải mái chỉnh sửa nó.
Tensibai

TIẾNG VIỆT là tài liệu
井上 文 Mitch

4

Điều này được thực hiện cho lợi ích tự động hóa. Bạn có thể có một lệnh phổ quát chạy docker run -Pđể khởi động một container và chính Dockerfile được sử dụng để chỉ định container nào hiển thị cổng nào. Trong trường hợp bạn đang xử lý hàng chục hoặc hàng trăm container đang được xây dựng thông qua một đường ống, điều này khá hữu ích. Việc chuyển các chi tiết bên ngoài không có trong Dockerfile cùng với container qua đường ống từ giai đoạn này sang giai đoạn khác là khá khó khăn ở quy mô.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.