Docker: отображение порта на IP-адресе контейнера - PullRequest
1 голос
/ 14 апреля 2020

Я пытаюсь выставить порт на Docker контейнере без необходимости сопоставлять его с портом на хосте; это прекрасно работает для sql баз данных или веб-систем, таких как redmine, где я могу получить доступ к Redmine через порт 3000 IP-адреса контейнеров из хост-системы без сопоставления порта.

Мой Dockerfile выглядит примерно так это (тома, envs, et c удалены для «ясности»)

FROM python:2.7

RUN pip install gunicorn

EXPOSE 8000

CMD ["gunicorn", "-b", "0.0.0.0:8000", "myapp.wsgi" ]

Это должно сказать gunicorn для привязки (-b) к порту 8000 или всем адресам; поэтому я ожидал, что порт 8000 будет открыт в контейнере, когда я запустил его, скажем,

docker run myappthing

Но нет - даже если ганкорн работает успешно. И все же, если я сделаю

docker run -p 127.0.0.1:8028:8000 myappthing

, то не только будет открыт порт 8028 на хосте, но и 8000 на контейнере.

Что здесь происходит; что я пропустил?

Спасибо

docker ps порты отчетов по-разному, как показано ниже: redmine и mysql показывают, что они не сопоставлены с портом на хосте, где сопоставляется моя попытка

CONTAINER ID        IMAGE               COMMAND                   CREATED             STATUS              PORTS                      NAMES
b68765d57f0b        52adec2834c2        "gunicorn -b 172.18.…"    45 minutes ago      Up 45 minutes       127.0.0.1:8028->8000/tcp   afc-timerec-manual
aaecd3cd319d        9671544d5284        "/docker-entrypoint.…"    7 months ago        Up 7 weeks          3000/tcp                   afc-redmine
fb4e55d352b2        1571059e8458        "docker-entrypoint.s…"    13 months ago       Up 4 days           3306/tcp                   afc-glpi-data

Дополнительные иллюстрации: если я открою оболочку на контейнере, я могу сделать это:

lynx http://127.0.0.1:8000
lynx http://172.18.0.28:8000 

(где 172.18.0.28 - IP-адрес контейнера), и обе команды позволяют мне получить доступ к веб-приложению.

Между тем, обратно на хост - порт 8000 не открыт на контейнере, поэтому lynx http://172.18.0.28:8000 завершается с ошибкой

1 Ответ

0 голосов
/ 14 апреля 2020

Порт не публикуется с помощью инструкции EXPOSE, необходимо использовать -p.

См. https://docs.docker.com/engine/reference/builder/#expose

EXPOSE инструкция на самом деле не публикует sh порт. Он функционирует как тип документации между человеком, который создает образ, и человеком, который запускает контейнер, о том, какие порты предназначены для публикации. Чтобы фактически опубликовать sh порт при запуске контейнера, используйте флаг -p на docker run, чтобы опубликовать sh и отобразить один или несколько портов, или флаг -P, чтобы опубликовать sh все открытые порты и карту их в порты высокого порядка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...