我有 3 台机器 A、B、C,它们运行通过 TCP/IP 进行通信的进程,这样 A 和 C 都连接到 B。 我正在用将在机器 A 上运行的容器替换机器 B,但我在设置网络时遇到一些困难。
我想对 A 和 C 进行最少的更改。B 的部署脚本配置网络适配器,因此我创建了 2 个网络并将容器附加到它们。现在我的脚本可以像实际机器一样配置网络接口。
问题 1:如何配置网络,以便来自 A->B 的流量现在转到 A->A 上的容器? 我想到了2种方法:
问题#2:如何配置网络以便 C 连接到容器而不是实际的 B 机器?
我认为这只是将流量路由到A(通过路由?),然后只要容器的端口绑定到主机,流量就会进入容器?
有什么想法吗?一种方法比另一种方法更好吗?有更好的办法吗? 谢谢!
当您为服务 B 运行新容器时,在其主机系统上发布其端口。 假设您使用普通的
docker run
命令,则可以使用 docker run -p
选项来实现此目的。 Docker Compose 有一个等效的 ports: [...]
设置。
docker run --name service-b -p 12345:12345 registry.example.com/service-b:20240911
# host port ^^^^^ ^^^^^ container port
第二个
-p
数字必须与容器内的服务正在侦听的端口号匹配。 第一个 -p
数字是主机上任何未使用的数字。 两个端口号不需要匹配。
现在,在外部,容器看起来好像正在监听主机系统的第一个
-p
端口号。 更改其他服务的配置以使用主机的 DNS 名称(或如有必要,其 IP 地址)和该端口号。 其他系统上的其他服务不知道该服务可能在容器中而不是在主机中运行。
./service-c --service-b-url=http://machine-a.example.com:12345/
请勿尝试手动编辑路由表、设置 macvlan 网络或以其他方式尝试直接操作此处的网络设置。 对于这个特定的设置,大多数服务不在容器中运行,您不需要任何 Docker 网络选项,甚至传统的“默认桥接网络”模式(没有
docker run --network
选项)也可以。