#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. Как вы думаете, на данный момент это как-то связано с брандмауэром?