【问题标题】:Docker-compose expose Port on IPv6Docker-compose 在 IPv6 上公开端口
【发布时间】:2021-02-07 17:18:06
【问题描述】:

我正在尝试在 IPv6 上运行具有多个公开端口的 docker 容器。我不希望容器拥有自己的 IPv6 地址。我只想让它们在主机的 IPv6 地址下可访问(使用端口转发)。

我在 docker 守护进程 (http://docs.docker.oeynet.com/engine/userguide/networking/default_network/ipv6/) 中启用了 IPv6。

我试过了

ports:
  # The HTTP port
  - ":::80:80"

在容器的 docker-compose.yaml 中,但这似乎完全弄乱了配置:

CONTAINER ID   IMAGE                    COMMAND                  CREATED        STATUS                  PORTS                                                                                  NAMES
9774a1a6322c   traefik:latest           "/entrypoint.sh --ap…"   1 second ago   Up Less than a second   80/tcp                                                                                 traefik

使用另一个容器(不在我的控制之下,我似乎无法知道它是如何启动的),端口被正确转发:

a04b40299a8f   portainer/portainer-ce   "/portainer"             7 days ago     Up 3 minutes            0.0.0.0:8000->8000/tcp, :::8000->8000/tcp, 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp   portainer

也可以使用主机的 IPv6 地址访问此地址(如预期的那样)。 我怎样才能为第一个容器实现这一点?

【问题讨论】:

  • IP,既不是 IPv4 也不是 IPv6,有端口。 一些传输协议使用端口,但IP不知道端口。
  • 您是否已经使用您的 docker 守护进程查看并启用了 IPv6? docs.docker.com/config/daemon/ipv6
  • 是的,和帖子里的链接内容基本一样。
  • 不知何故,在新安装的环境(Docker v20.10.14)中,我可以通过主机的 IPv6 公开端口,而无需执行任何操作。我不确定这是否与我在无根模式下运行 Docker 或 Docker 开发人员修复此问题有关。

标签: docker docker-compose port ipv6


【解决方案1】:

简而言之

您必须在docker-compose.yml 文件中手动选择一些支持 ipv6 的网络,例如:

services:
    serviceName:
        networks:
            - traefik

networks:
    traefik:
        enable_ipv6: true
        ipam:
            config:
                - subnet: "fd12:3456:789a:1::/64"

请注意,一些过时的docker-compose 版本不支持enable_ipv6 选项。它固定在1.26.2(不支持)和1.27.4(支持)之间。

说明

当你启动 Docker 时,会自动创建一个默认的桥接网络(也称为桥接),除非另有说明,否则新启动的容器会连接到它。 src

但是当你使用 docker-compose 时,如果你没有指定它,它会为你创建一个网络。在日志中看起来像这样:

使用默认驱动创建网络“traefik_default”

而且这个默认网络没有启用 ipv6:

$ docker network inspect traefik_default | grep EnableIPv6
    "EnableIPv6": false,

因此,您应该定义一个启用 ipv6 的自定义网络。如果我没记错的话,子网参数是强制性的,你可以使用一些private ipv6 子网,就像我上面的例子一样。

请注意,在我的示例中,网络的实际名称将是 <projectName>_traefik。您可以使用完全用户定义的名称(在这种情况下为traefik)创建一个外部网络:

docker network create --ipv6 --subnet=fd12:3456:789a:2::/64 traefik

【讨论】:

  • docker-compose 似乎不支持 enable_ipv6 标志,但创建网络手册就像一个魅力。谢谢!
  • @MatthiasHolzapfel “似乎不支持 enable_ipv6 标志”是什么意思?你的意思是在 docker-compose.yml “networks” 部分?那么你的 docker-compose.yml 的配置版本是什么?
  • 我做了一些研究,似乎在 1.28.1 之前的某些版本的 docker-compose 中可能是错误的。有 PR 可以修复,我相信 github.com/docker/compose/commit/… 我有 docker-compose 1.28.2 和 enable_ipv6 对我有用,无论 docker-compose.yml 版本如何(我试过 3-3.7)。你的 docker-compose 版本是多少?
  • 目前看来我必须使用 1.21。这就解释了,谢谢。
  • 你刚刚拯救了我的一天,一直在使用 ipv6(ISP 只提供静态 v6 而不是 v4)但无法访问 docker 容器,但是服务器很容易被 ping 通,你的回答拯救了我的一天
猜你喜欢
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
相关资源
最近更新 更多