Câu trả lời ngắn:
EXPOSE
là một cách để làm tài liệu
--publish
(hoặc -p
) là một cách để lập bản đồ một cổng máy chủ để một chạy cảng container
Lưu ý bên dưới rằng:
EXPOSE
có liên quan đến Dockerfiles
( tài liệu )
--publish
có liên quan đến docker run ...
( thực thi / thời gian chạy )
Các cổng tiếp xúc và xuất bản
Trong mạng Docker, có hai cơ chế khác nhau liên quan trực tiếp đến các cổng mạng: phơi bày và xuất bản cổng. Điều này áp dụng cho mạng cầu mặc định và mạng cầu do người dùng xác định.
Bạn hiển thị các cổng bằng cách sử dụng EXPOSE
từ khóa trong Dockerfile hoặc --expose
cờ để docker chạy. Các cổng tiếp xúc là một cách để ghi lại các cổng nào được sử dụng, nhưng thực tế không ánh xạ hoặc mở bất kỳ cổng nào . Các cổng tiếp xúc là tùy chọn.
Bạn xuất bản các cổng bằng cách sử dụng --publish
hoặc --publish-all
gắn cờ docker run
. Điều này cho Docker biết cổng nào sẽ mở trên giao diện mạng của container. Khi một cổng được xuất bản, nó được ánh xạ tới một cổng thứ tự cao có sẵn (cao hơn 30000
) trên máy chủ, trừ khi bạn chỉ định cổng để ánh xạ tới máy chủ trong thời gian chạy. Bạn không thể chỉ định cổng để ánh xạ tới máy chủ khi bạn xây dựng hình ảnh (trong Dockerfile), vì không có cách nào để đảm bảo rằng cổng sẽ có sẵn trên máy chủ nơi bạn chạy hình ảnh .
từ: Docker container mạng
Cập nhật tháng 10 năm 2019 : đoạn văn bản trên không còn trong tài liệu mà là phiên bản lưu trữ ở đây: docs.docker.com/v17.09/engine/userguide/networking/#exposeing-and-publishing-ports
Có thể tài liệu hiện tại là dưới đây:
Cổng xuất bản
Theo mặc định, khi bạn tạo một thùng chứa, nó không xuất bản bất kỳ cổng nào của nó ra thế giới bên ngoài. Để cung cấp một cổng có sẵn cho các dịch vụ bên ngoài Docker hoặc với các container Docker không được kết nối với mạng của bộ chứa, hãy sử dụng --publish
hoặc -p
gắn cờ. Điều này tạo ra một quy tắc tường lửa ánh xạ một cổng container tới một cổng trên máy chủ Docker.
và có thể được tìm thấy ở đây: docs.docker.com/config/containers/container-networking/#published-ports
Cũng thế,
LỘ RA
... EXPOSE
Hướng dẫn không thực sự xuất bản 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.
từ: Tham chiếu Dockerfile
Truy cập dịch vụ khi EXPOSE
/ --publish
không được xác định:
Tại câu trả lời của @Golo Roden, có ghi rằng ::
"Nếu bạn không chỉ định bất kỳ thứ nào trong số đó, dịch vụ trong container sẽ không thể truy cập được từ bất cứ đâu ngoại trừ từ bên trong chính container."
Có thể đó là trường hợp tại thời điểm câu trả lời được viết, nhưng bây giờ có vẻ như ngay cả khi bạn không sử dụng EXPOSE
hoặc --publish
, host
và mạng khác containers
của cùng một mạng sẽ có thể truy cập dịch vụ mà bạn có thể bắt đầu bên trong container đó.
Cách kiểm tra cái này:
Tôi đã sử dụng như sau Dockerfile
. Về cơ bản, tôi bắt đầu với Ubuntu và cài đặt một máy chủ web nhỏ:
FROM ubuntu
RUN apt-get update && apt-get install -y mini-httpd
Tôi build
hình ảnh là "testexpose" và run
một thùng chứa mới với:
docker run --rm -it testexpose bash
Trong container, tôi khởi chạy một vài trường hợp mini-httpd
:
root@fb8f7dd1322d:/# mini_httpd -p 80
root@fb8f7dd1322d:/# mini_httpd -p 8080
root@fb8f7dd1322d:/# mini_httpd -p 8090
Sau đó tôi có thể sử dụng curl
từ máy chủ hoặc các thùng chứa khác để lấy trang chủ của mini-httpd
.