docker 运行 -p 如果我包含 --net=<macvlan> 和 --ip=<ip> 则不公开端口

docker run -p not exposing port if i include --net=<macvlan> and --ip=<ip>

在我的 rpi4 上,我 运行ning docker 带有简单 FastAPI 应用程序的容器,运行 带有 uvicorn 的容器,我设置 docker 网络来映射容器流量仅使用 macvlan 到以太网端口。现在,当我 运行 我的容器使用下面的命令时,我没有看到端口被暴露,尽管我看到容器 运行 正常(使用 docker logs -f <container>.

这是我的docker文件

FROM scratch
ADD ubuntu-focal-oci-arm64-root.tar.gz /

ENV TZ=America/Toronto
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

WORKDIR /app

COPY . .

RUN mkdir shared_volume

RUN apt-get update && 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\
<image_id>

如果我在上面这样称呼它,我看不到向我的主机公开的端口。 如果我删除 --net 和 --ip,我会看到暴露的端口。

为什么?

当您使用 macvlan 网络时,所有容器端口都会暴露在您提供给容器的 IP 上。换句话说,当你使用 macvlan 时,它与 forward all connections to this IP to the container 相同,where as when你使用端口转发就像 将所有到这个主机端口的连接转发到那个容器端口.

因此,只需尝试连接到您为容器提供的 IP 和您的应用程序正在侦听的端口。你不需要 macvlan 端口转发,端口转发用于 bridge(默认和又名 NAT)网络驱动程序,当你没有在 [=15] 中指定 --net=docker_macvlan_1 时使用=]命令。