不使用docker compose版本2的容器之间的链接

不使用docker compose版本2的容器之间的链接,docker,docker-compose,Docker,Docker Compose,版本2 docker compose文件中容器之间的链接不起作用 只有在使用“旧”版本1格式时,我才能在容器的/etc/hosts中看到链接 我有以下基本版本2 docker-compose.yml文件 版本:“2” 服务: 我的应用程序: 图片:tomcat:8.0 容器名称:my-app1 链接: -我的redis 我的redis: 图片:redis 容器名称:my-redis1 当我运行以下命令时: docker-compose up -d docker compose up-d 我看到启

版本2 docker compose文件中容器之间的链接不起作用

只有在使用“旧”版本1格式时,我才能在容器的/etc/hosts中看到链接

我有以下基本版本2 docker-compose.yml文件

版本:“2” 服务: 我的应用程序: 图片:tomcat:8.0 容器名称:my-app1 链接: -我的redis 我的redis: 图片:redis 容器名称:my-redis1 当我运行以下命令时:

docker-compose up -d docker compose up-d 我看到启动了两个容器,但在/etc/hosts文件中没有创建链接:

docker exec -it my-app1 cat /etc/hosts docker exec-it my-app1 cat/etc/hosts 127.0.0.1本地主机 ::1本地主机ip6本地主机ip6环回 fe00::0 ip6 localnet ff00::0 ip6 mcastprefix ff02::1 ip6所有节点 ff02::2 ip6所有路由器 172.18.0.3 2abb84ccada9 从'my-app1'中,我可以使用'my-redis1'的IP地址ping另一个容器,但我不能'ping my-redis1'(基于名称)

这里有什么问题

其他信息:

  • Docker版本1.10.0,内部版本590d5108
  • docker compose版本1.6.0,构建d99cad6
  • Linux内核:4.3.5-300.fc23.x86_64

    • 使用docker版本2,默认情况下,相同网络中的“服务”(容器)在它们之间链接

      使用下面的docker-compose.yml文件

      version: '2'
      
      services:
        my-app:
          image: tomcat:8.0
          container_name: my-app1
          links:
            - my-redis
        my-redis:
          image: redis
          container_name: my-redis1
      
      您只需从
      my redis
      容器执行
      ping my app
      ,从
      my app
      容器执行
      ping my redis
      ,即可检查它们是否链接

      例如:

      $ docker-compose up -d
      $ docker exec -it my-app1 bash
      # ping my-redis
      
      您可以在下面的链接中获得更多信息:
      问题是我的Fedora主机的防火墙

      临时禁用防火墙(“systemctl stop firewall d”,后跟“systemctl restart docker”)后,一切都按照docker文档进行

      与docker一起使用时,firewalld似乎存在一个主要问题,请参阅:

      请注意,RHEL/Centos 7也使用firewalld


      -Arjen

      在我的案例中,问题在于服务名称

      version: "2"
      services:
          my_auth_server:
             build: auth-server
             ports: 
                 - "8082:8082"
      
          my_api:
             build: core-api
             ports: 
                 - "8081:8081"   
             links:
                 - my_auth_server:auth-server # <-- here changed from auth_server to auth-server
      
      版本:“2”
      服务:
      我的身份验证服务器:
      构建:身份验证服务器
      端口:
      - "8082:8082"
      my_api:
      构建:核心api
      端口:
      - "8081:8081"   
      链接:
      
      -my_auth_server:auth server#谢谢你的回答。但是,我无法从“my-app1”ping“my-redis1”,反之亦然。我只能使用IP地址ping。“my-app1”的/etc/hosts中未显示名称“my-redis1”。当我选中“docker network ls”时,我看到docker compose创建了一个新网络。当我使用版本1 docker compose文件时,我确实会在'my-app1'.PS的/etc/hosts文件中看到'my-redis1'。此外,当我从version2 docker compose文件中删除链接时,我无法使用“ping my-redis1”从“my-app1”ping“my-redis1”。我认为您必须对服务名称(
      ping my app
      )进行ping,而不是对容器名称进行ping。你能再检查一下我上面评论的命令是否有效吗?我只能使用IP地址在容器之间ping,不能通过“ping my app”或“ping my-app1”。“我的应用程序”是否应该出现在“我的redis”的/etc/hosts文件中?我已尝试重现该问题,但未能重现。我用我遵循的步骤更新了答案,你能再检查一遍吗?“我的应用”不应该出现在那里。Docker 1.10不再使用
      /etc/hosts
      它使用嵌入式DNS服务器。主机上运行的dns服务器和firewald存在已知问题。这可能是造成问题的原因。您应该能够使用容器名称和服务名称ping。谢谢,问题是主机上的防火墙(Fedora)。Docker容器应该提供与主机的隔离,但是新的网络似乎对主机配置非常挑剔:-(。。。
      $ docker-compose up -d
      $ docker exec -it my-app1 bash
      # ping my-redis
      
      version: "2"
      services:
          my_auth_server:
             build: auth-server
             ports: 
                 - "8082:8082"
      
          my_api:
             build: core-api
             ports: 
                 - "8081:8081"   
             links:
                 - my_auth_server:auth-server # <-- here changed from auth_server to auth-server