Câu trả lời ngắn:
EXPOSElà 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:
EXPOSEcó liên quan đến Dockerfiles( tài liệu )
--publishcó 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 EXPOSEtừ khóa trong Dockerfile hoặc --exposecờ để 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 --publishhoặc --publish-allgắ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 --publishhoặc -pgắ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
... EXPOSEHướ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/ --publishkhô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 EXPOSEhoặc --publish, hostvà mạng khác containerscủ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 buildhình ảnh là "testexpose" và runmộ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 curltừ máy chủ hoặc các thùng chứa khác để lấy trang chủ của mini-httpd.