Java 从Docker run更改为Docker compose;关于集装箱间网络通信的不可预测行为

Java 从Docker run更改为Docker compose;关于集装箱间网络通信的不可预测行为,java,docker,network-programming,docker-compose,docker-machine,Java,Docker,Network Programming,Docker Compose,Docker Machine,经过两天的努力,我决定向公众提出我的问题 我们使用Docker来设置测试环境。我们正在测试一个Java客户机-服务器应用程序。在过去,应用程序只是在“单站点”配置中运行(1台服务器和x台客户端)。现在,我们正在将应用程序升级为“多站点”配置(x台服务器和y台客户端) 因此,我们从Docker run改为Docker compose,以轻松构建“复杂”网络 使用Docker run,我们没有遇到任何问题 使用Docker compose,我们可以按照自己的意愿建立网络(例如,4台服务器,每个服务器

经过两天的努力,我决定向公众提出我的问题

我们使用Docker来设置测试环境。我们正在测试一个Java客户机-服务器应用程序。在过去,应用程序只是在“单站点”配置中运行(1台服务器和x台客户端)。现在,我们正在将应用程序升级为“多站点”配置(x台服务器和y台客户端)

因此,我们从Docker run改为Docker compose,以轻松构建“复杂”网络

使用Docker run,我们没有遇到任何问题

使用Docker compose,我们可以按照自己的意愿建立网络(例如,4台服务器,每个服务器最多2台客户端)。我们还能够通过SSH和VNC访问每个容器,并且能够在它们自己的网络中的每个容器之间进行ping

问题: 我们的Java客户端无法连接到这些服务器。即使他们在同一个网络中

现在是真正令人沮丧的部分:
可能五分之一的客户机能够连接到他的服务器。到目前为止,我称之为完全随机行为。它并不总是第五个容器可以工作,也不总是相同的网络配置。此外,1服务器1客户端网络并不总是有效。最后一次可能是在第五次尝试之后

首先,我认为我也必须公开RMI端口,但这不起作用。后来,我打开了所有端口,只是为了确定,但这也不起作用。关于Docker文档,也没有必要这样做。此外,它也不能解释它有时起作用的行为。我的问题还在于我没有设置最初的Docker运行配置,可能我错过了一些重要的部分

也许你们中的某个人能给我指出正确的方向

问候,, 凯

自动创建的yaml文件的代码:

version: '2.1'
services: 
    foo_server_1: 
        image: foo_server:latest
        mem_limit: 1g
        memswap_limit: 2g
        container_name: foo_server_1
        ports: 
            - "22"
            - "4567"
        networks: 
            - foo_server_network
            - client_net_1
    foo_client_1_1: 
        image: foo_client:latest
        mem_limit: 1g
        memswap_limit: 2g
        links: 
            - foo_server_1:server
        container_name: foo_client_1_1
        ports: 
            - "22"
            - "5900"
            - "4567"
        networks: 
            - client_net_1
    foo_client_1_2: 
        image: foo_client:latest
        mem_limit: 1g
        memswap_limit: 2g
        links: 
            - foo_server_1:server
        container_name: foo_client_1_2
        ports: 
            - "22"
            - "5900"
            - "4567"
        networks: 
            - client_net_1
    foo_server_2: 
        image: foo_server:latest
        mem_limit: 1g
        memswap_limit: 2g
        container_name: foo_server_2
        ports: 
            - "22"
            - "4567"
        networks: 
            - foo_server_network
            - client_net_2
    foo_client_2_1: 
        image: foo_client:latest
        mem_limit: 1g
        memswap_limit: 2g
        links: 
            - foo_server_2:server
        container_name: foo_client_2_1
        ports: 
            - "22"
            - "5900"
            - "4567"
        networks: 
            - client_net_2
    foo_client_2_2: 
        image: foo_client:latest
        mem_limit: 1g
        memswap_limit: 2g
        links: 
            - foo_server_2:server
        container_name: foo_client_2_2
        ports: 
            - "22"
            - "5900"
            - "4567"
        networks: 
            - client_net_2
networks: 
    foo_server_network: 
    client_net_1: 
    client_net_2: 
docker ps-a的Powershell输出:

D:\dockerTemp> docker ps -a
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS
PORTS                                                                                                    NAMES
e29f75524e11        foo_client:latest           "/scripts/start.sh"      6 minutes ago       Up 6 minutes
5901/tcp, 6901/tcp, 12345/tcp, 0.0.0.0:33498->22/tcp, 0.0.0.0:33497->4567/tcp, 0.0.0.0:33496->5900/tcp   foo_client_1_1
fb1b4169fff4        foo_client:latest           "/scripts/start.sh"      6 minutes ago       Up 6 minutes
5901/tcp, 6901/tcp, 12345/tcp, 0.0.0.0:33501->22/tcp, 0.0.0.0:33500->4567/tcp, 0.0.0.0:33499->5900/tcp   foo_client_1_2
cb6af51a0ffb        foo_client:latest           "/scripts/start.sh"      6 minutes ago       Up 6 minutes
5901/tcp, 6901/tcp, 12345/tcp, 0.0.0.0:33495->22/tcp, 0.0.0.0:33494->4567/tcp, 0.0.0.0:33493->5900/tcp   foo_client_2_1
6f436f5b3d7c        foo_client:latest           "/scripts/start.sh"      6 minutes ago       Up 6 minutes
5901/tcp, 6901/tcp, 12345/tcp, 0.0.0.0:33492->22/tcp, 0.0.0.0:33491->4567/tcp, 0.0.0.0:33490->5900/tcp   foo_client_2_2
3844553d31a4        foo_server:latest           "/scripts/foo_server"   6 minutes ago       Up 6 minutes
0/tcp, 5901/tcp, 6901/tcp, 12345/tcp, 0.0.0.0:33489->22/tcp, 0.0.0.0:33487->4567/tcp                     foo_server_2
92bcd4273e34        foo_server:latest           "/scripts/foo_server"   6 minutes ago       Up 6 minutes
0/tcp, 5901/tcp, 6901/tcp, 12345/tcp, 0.0.0.0:33488->22/tcp, 0.0.0.0:33486->4567/tcp                     foo_server_1

尽量让端口不被随机分配,比如
“4567:xxxx”
,我已经尝试过了。不工作:错误:对于foo_客户端,foo_2_1无法启动服务foo_客户端:{“消息”:“驱动程序未能在端点foo_客户端上编程外部连接(029da8b834cab75bee1725bea27193889597440beee9c04a00260cb6e0d05209):绑定0.0.0.0:1089失败:端口已分配”}我假设您收到此消息是因为您在某个地方映射了两次相同的端口,并且只能分配一次