Docker 网络 - 从主机移动到网桥
Docker Network - moving from host to bridge
我有许多现有的 docker 容器 运行 使用 network=host 参数(配置在“docker 运行 -D ”)。我需要切换到另一种网络类型。我宁愿使过渡尽可能简单。此外,由于这些容器上的大多数服务 运行ning 都在特定端口上侦听,并且由于调用这些服务的用户已经创建了调用这些端点的客户端,因此我需要选择一个 docker 网络不需要用户更改他们当前调用端点的方式的解决方案。
例如,如果用户当前正在拨打这样的电话:
curl -X POST "ourCurrentHost:8099/rest/endpointA?user=jsmith
,我希望尽可能保持不变。我认为这可以通过定义我自己的 docker 桥接网络来实现。我看到了创建这样一个网络的非常基本的例子,比如:
$ docker network create --driver bridge my_isolated_bridge_network
,然后您可以 运行 通过在 运行 时间配置您想要在该网络上的容器,例如:
$ docker run --net=my_isolated_bridge_network --name=my_psql_db postgres
然而,对我来说不太明显的是如何将该网络桥接到容器所在的主机服务器的底层网络 运行(我假设这是需要的,以便客户端调用可以保持不变)。
另一个考虑因素是我的一些容器调用主机服务器网络上的其他容器 运行ning(即我的容器在我不得不切换之前 运行ning 所在的网络)网络=主机)。
此外,到目前为止,我也没有使用 docker compose,只是使用 CLI。我现在也宁愿继续这样做。
我不确定应该如何进行。我将不胜感激 ideas/suggestions。谢谢。
假设您的容器不需要与主机系统上的任何东西进行通信,那么转换非常轻松。
如果你的容器之前监听过 8099 端口并使用主机网络,即
docker run --network host myimage
您所要做的就是发布该端口,而不是使用主机网络。
docker run --publish 8099:8099 myimage
任何能够到达您的服务器端口 8099 的请求都将到达已发布端口上的该容器。与之前使用主机网络时完全一样。
您可能需要配置防火墙或 iptables 以允许此类流量。根据您的设置,它可能会被禁止。您需要允许来自和流向名为 docker0
的网络接口的流量。您可以在此处找到一些相关文档,https://docs.docker.com/network/iptables/.
Docker 网络用于容器之间的通信,在 docker swarm 的情况下,还用于处理入口流量。您没有使用 swarm,所以最后一点是没有问题的。应该能够通信的容器必须加入共享桥接网络,并且应该使用容器名称作为主机名进行通信。
docker network create intercom
docker run --network intercom --name myapp --detach traefik/whoami
docker run --network intercom curimages/curl http://myapp
如果您需要与主机系统上非容器的其他服务进行通信,则必须在启动容器时添加一个标志,
docker run --add-host host.docker.internal:host-gateway myimage
然后您可以使用host.docker.internal
与主机系统通信。
也就是说,通常我们希望通过 DNS 或 URL 向客户端公开一个统一的接口,而不是发布太多端口。在长 运行 中,研究容器的反向代理是个好主意。该代理可以在标准端口 80 和 443 上访问。它可以查看主机和/或路径 header 以确定应将请求代理到哪个容器。
我有许多现有的 docker 容器 运行 使用 network=host 参数(配置在“docker 运行 -D
例如,如果用户当前正在拨打这样的电话:
curl -X POST "ourCurrentHost:8099/rest/endpointA?user=jsmith
,我希望尽可能保持不变。我认为这可以通过定义我自己的 docker 桥接网络来实现。我看到了创建这样一个网络的非常基本的例子,比如:
$ docker network create --driver bridge my_isolated_bridge_network
,然后您可以 运行 通过在 运行 时间配置您想要在该网络上的容器,例如:
$ docker run --net=my_isolated_bridge_network --name=my_psql_db postgres
然而,对我来说不太明显的是如何将该网络桥接到容器所在的主机服务器的底层网络 运行(我假设这是需要的,以便客户端调用可以保持不变)。
另一个考虑因素是我的一些容器调用主机服务器网络上的其他容器 运行ning(即我的容器在我不得不切换之前 运行ning 所在的网络)网络=主机)。
此外,到目前为止,我也没有使用 docker compose,只是使用 CLI。我现在也宁愿继续这样做。
我不确定应该如何进行。我将不胜感激 ideas/suggestions。谢谢。
假设您的容器不需要与主机系统上的任何东西进行通信,那么转换非常轻松。
如果你的容器之前监听过 8099 端口并使用主机网络,即
docker run --network host myimage
您所要做的就是发布该端口,而不是使用主机网络。
docker run --publish 8099:8099 myimage
任何能够到达您的服务器端口 8099 的请求都将到达已发布端口上的该容器。与之前使用主机网络时完全一样。
您可能需要配置防火墙或 iptables 以允许此类流量。根据您的设置,它可能会被禁止。您需要允许来自和流向名为 docker0
的网络接口的流量。您可以在此处找到一些相关文档,https://docs.docker.com/network/iptables/.
Docker 网络用于容器之间的通信,在 docker swarm 的情况下,还用于处理入口流量。您没有使用 swarm,所以最后一点是没有问题的。应该能够通信的容器必须加入共享桥接网络,并且应该使用容器名称作为主机名进行通信。
docker network create intercom
docker run --network intercom --name myapp --detach traefik/whoami
docker run --network intercom curimages/curl http://myapp
如果您需要与主机系统上非容器的其他服务进行通信,则必须在启动容器时添加一个标志,
docker run --add-host host.docker.internal:host-gateway myimage
然后您可以使用host.docker.internal
与主机系统通信。
也就是说,通常我们希望通过 DNS 或 URL 向客户端公开一个统一的接口,而不是发布太多端口。在长 运行 中,研究容器的反向代理是个好主意。该代理可以在标准端口 80 和 443 上访问。它可以查看主机和/或路径 header 以确定应将请求代理到哪个容器。