Инструкция EXPOSE
Dockerfile сама по себе не публикует порты контейнера (см. Справочный раздел Dockerfile в документации ; инструкция только добавляет метаданные к созданному вами изображению и позволяет вам давать указание, какие порты прослушивает служба, работающая в вашем контейнере.
Инструкция EXPOSE
является необязательной , и даже без настройки этого порта вы можете подключиться к порту, который прослушивает контейнер.
Чтобы сделать порт доступным;
- сначала убедитесь, что служба в вашем контейнере прослушивает порт (ваш пример Dockerfile основан на официальном образе
php:7.2-apache
, который прослушивает порт 80 по умолчанию
- убедитесь, что служба в вашем контейнере прослушивает любой IP-адрес (
0.0.0.0
), а не localhost / 127.0.0.1
(потому что localhost - это "localhost" внутри контейнера , что означает, что если ваша служба прослушивает localhost, она будет доступна только внутри самого контейнера)
- когда работает контейнер, вы можете сопоставить порт контейнера с портом, к которому вы хотите, чтобы он был доступен («сопоставление портов») (также см. сетевой раздел в документации .
Опция -p
/ --publish
имеет сокращение и расширенный синтаксис; Я буду использовать сокращенный синтаксис в моих примерах; эта запись использует формат: -p <host-port>:<container-port>
Например, если ваш контейнер прослушивает порт 80
, и вы хотите опубликовать (или «сопоставить») этот порт с портом 8090
на вашем хосте;
docker run -d -p 8090:80 myimage
Ваш контейнер теперь может быть достигнут в:
http://<ip-address of your host>:8090
- (в зависимости от настроек):
http://localhost:8090