docker run -p не открывает порт, если я включу —net= и —ip=

#docker #containers #arm64

Вопрос:

На моем rpi4 я запускаю контейнер docker с помощью простого приложения FastAPI и запускаю его с помощью uvicorn, я настроил сеть docker для отображения контейнерного трафика только на порт Ethernet с помощью macvlan. Теперь, когда я запускаю свой контейнер, используя команду ниже, я не вижу, чтобы порт был открыт, хотя я вижу, что контейнер работает нормально (используя docker logs -f lt;containergt; .

Это мой док-файл

 FROM scratch ADD ubuntu-focal-oci-arm64-root.tar.gz /  ENV TZ=America/Toronto RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime amp;amp; echo $TZ gt; /etc/timezone  WORKDIR /app  COPY . .  RUN mkdir shared_volume  RUN apt-get update amp;amp; apt-get install python3 python3-dev python3-pip firefox firefox-geckodriver -y --no-install-recommends RUN python3 -m pip install -r requirements.txt  EXPOSE 8000  CMD ["uvicorn","updater:app", "--workers", "4", "--reload"]  

и я обычно строю его с:

 sudo docker build -t me/app:1.0 .  

затем я запускаю его:

 sudo docker run  -p 18000:8000  -itd  -e CONTAINER_NAME='app_1'  --net=docker_macvlan_1  --ip=192.168.3.111  --mount source=shared_volume,target=/app/shared_volume  --name app_1 lt;image_idgt;  

Если я назову это так выше, я не увижу портов, доступных моему хосту. Если я удалю —net и —ip, я увижу открытый порт.

Почему?

Ответ №1:

Когда вы используете macvlan сеть, все порты контейнера отображаются на IP-адресе, который вы предоставляете контейнеру. Другими словами, при использовании macvlan это то же самое, что перенаправлять все подключения к этому IP-адресу в контейнер, где, как и при использовании переадресации портов, это похоже на перенаправление всех подключений к этому порту хоста в этот порт контейнера.

Таким образом, просто попробуйте подключиться к IP-адресу, который вы указали контейнеру, и порту, который прослушивает ваше приложение. Вам не нужна переадресация портов macvlan , переадресация портов предназначена для bridge сетевого драйвера (по умолчанию и он же NAT), который используется, когда вы не указываете --net=docker_macvlan_1 в docker run команде.

Комментарии:

1. Спасибо за ответ, может показаться, что это сработало, однако, когда я пытаюсь свернуть его на терминале моего хоста, теперь он выдает Connection refused ошибку. правка: удалена команда, но в основном это просто завиток

2. @Ritsard ну, если соединение отказало, то, по крайней мере, так оно и есть. Прослушивает ли приложение какой-либо IP (0.0.0.0)? Работает ли тот же завиток изнутри контейнера? Какой порт вы использовали для получения ошибки? 8000?

3. да, хост uvicorn установлен на 0.0.0.0, мне еще предстоит попробовать curl в контейнере, но, судя по журналам, сервер uvicorn отображается правильно. да, порт по умолчанию-8000. Как вы думаете, на данный момент это как-то связано с брандмауэром?