Можно получить доступ к Docker-контейнеру с хоста, но это не должно быть возможно? - PullRequest
3 голосов
/ 27 октября 2019

Я клонировал этот проект:

https://github.com/andfanilo/vue-hello-world

и создал для него докер-файл:

FROM node:10
RUN apt install curl

# make the 'app' folder the current working directory
RUN mkdir /app
# copy project files and folders to the current working directory (i.e. 'app' folder)
COPY . /app

WORKDIR /app

RUN npm install
CMD [ "npm", "run", "serve" ]

Я создаю и запускаю его с:

FRONTEND_IMAGE='frontend-simple-image'
FRONTEND_CONTAINER_NAME='frontend-simple-container'

docker build -t ${FRONTEND_IMAGE} .
docker rm -f ${FRONTEND_CONTAINER_NAME}
docker run -it --name ${FRONTEND_CONTAINER_NAME} ${FRONTEND_IMAGE}

Он успешно собирается и работает:

enter image description here

И я могу получить к нему доступ в браузере своего хоста:

enter image description here

Это все хорошо, за исключением того, что я бы не ожидал, что я смогу получить доступ из своего хост-браузера в соответствии с:

https://docs.docker.com/config/containers/container-networking/

По умолчанию при создании контейнера он не публикует свои порты во внешнем мире. Чтобы сделать порт доступным для служб вне Docker или для контейнеров Docker, которые не подключены к сети контейнера, используйте флаг --publish или -p. Это создает правило брандмауэра, которое сопоставляет порт контейнера с портом на хосте Docker. Вот несколько примеров.

Так почему же это работает (доступ к веб-приложению из моего браузера) без добавления, например, -p 8080:8080 к docker run ??

1 Ответ

5 голосов
/ 27 октября 2019

Все работает нормально. Для доступа к веб-сайту вы используете 172.17.0.2, который принадлежит исходной сети Docker bridge 172.17.0.0/16. Это базовая сеть, в которой создаются все контейнеры, если вы не укажете другую сеть.

Поскольку bridge - это сеть, созданная на вашем хост-компьютере, вы можете свободно получить к ней доступ, используя прямой IP-адрес. Но если вы попытаетесь получить доступ к приложению Vue через localhost:8080 или 127.0.0.1:8080, вы не сможете подключиться, поскольку вы используете другую сеть. После добавления -p 8080:8080 поведение должно измениться, и приложение будет доступно через localhost.

По сути, «внешний мир» из документации Docker означает сети за пределами сетей, назначенных контейнеру, поэтому в вашем случае «»внешний мир "- это не что иное, как 172.17.0.0/16.

Можете ли вы узнать больше о связи контейнеров здесь :

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