Docker-compose在IPv6上公开端口

yrefmtwq  于 2022-12-11  发布在  Docker
关注(0)|答案(2)|浏览(271)

我正在尝试运行一个在IPv6上有许多公开端口的Docker Container。我不希望容器有自己的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地址也可以访问这个容器(如预期)。如何为第一个容器实现这一点?

nhaq1z21

nhaq1z211#

"简而言之"
您必须在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
hjzp0vay

hjzp0vay2#

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

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

相关问题