Docker-compose 在 IPv6 上公开端口

Mat*_*fel 4 port ipv6 docker docker-compose

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

\n

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

\n

我试过

\n
ports:\n  # The HTTP port\n  - ":::80:80"\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
CONTAINER ID   IMAGE                    COMMAND                  CREATED        STATUS                  PORTS                                                                                  NAMES\n9774a1a6322c   traefik:latest           "/entrypoint.sh --ap\xe2\x80\xa6"   1 second ago   Up Less than a second   80/tcp                                                                                 traefik\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
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\n
Run Code Online (Sandbox Code Playgroud)\n

也可以使用主机的 IPv6 地址访问此容器(如预期)。\n如何为第一个容器实现此目的?

\n

小智 6

此处快速添加:IPv6 语法使用括号[::]

ports:
  # The HTTP port
  - "[::]:80:80"
Run Code Online (Sandbox Code Playgroud)


Ovs*_*nka 5

简而言之

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

services:
    serviceName:
        networks:
            - traefik

networks:
    traefik:
        enable_ipv6: true
        ipam:
            config:
                - subnet: "fd12:3456:789a:1::/64"
Run Code Online (Sandbox Code Playgroud)

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

解释

当启动 Docker 时,会自动创建一个默认的桥接网络(也称为网桥),除非另有说明,新启动的容器都会连接到该网络。源代码

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

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

并且此默认网络尚未启用 ipv6:

$ docker network inspect traefik_default | grep EnableIPv6
    "EnableIPv6": false,
Run Code Online (Sandbox Code Playgroud)

因此,您应该定义一个启用了 ipv6 的自定义网络。如果我没有记错的话,子网参数是强制性的,您可以使用一些私有 ipv6子网,如上面的示例所示。

请注意,我的示例中网络的实际名称是<projectName>_traefik。您可以使用完全用户定义的名称来创建外部网络(traefik在本例中):

docker network create --ipv6 --subnet=fd12:3456:789a:2::/64 traefik
Run Code Online (Sandbox Code Playgroud)