Docker-compose 在 IPv6 上公开端口
Docker-compose expose Port on IPv6
我正在尝试 运行 一个 docker 容器,其中包含 IPv6 上的多个公开端口。我不希望容器拥有自己的 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 地址也可以访问此主机(正如预期的那样)。
我怎样才能为第一个容器实现这一目标?
简而言之
您必须在 docker-compose.yml
文件中手动 select 一些支持 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
(支持)之间。
说明
When you start Docker, a default bridge network (also called bridge) is created automatically, and newly-started containers connect to it unless otherwise specified. src
但是当您使用 docker-compose 时,如果您没有指定网络,它会为您创建一个网络。在日志中看起来像这样:
Creating network "traefik_default" with the default driver
并且此默认网络未启用 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 容器,其中包含 IPv6 上的多个公开端口。我不希望容器拥有自己的 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 地址也可以访问此主机(正如预期的那样)。 我怎样才能为第一个容器实现这一目标?
简而言之
您必须在 docker-compose.yml
文件中手动 select 一些支持 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
(支持)之间。
说明
When you start Docker, a default bridge network (also called bridge) is created automatically, and newly-started containers connect to it unless otherwise specified. src
但是当您使用 docker-compose 时,如果您没有指定网络,它会为您创建一个网络。在日志中看起来像这样:
Creating network "traefik_default" with the default driver
并且此默认网络未启用 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