【问题标题】:Containers cannot reach each others in docker-compose容器在 docker-compose 中无法互相访​​问
【发布时间】:2020-05-17 21:44:46
【问题描述】:

我正在使用这个 docker-compose.yml 文件:

version: "3.7"

networks:
  test_net:
    internal: true

services:
  A:
    image: nginx:1.17
    networks:
      - test_net

  B:
    image: node:14-alpine
    command: wget A
    networks:
      - test_net

输出:

Creating network "test_test_net" with the default driver
Creating test_B_1 ... done
Creating test_A_1 ... done
Attaching to test_A_1, test_B_1
B_1  | Connecting to A (172.24.0.2:80)
B_1  | wget: can't connect to remote host (172.24.0.2): Host is unreachable
test_B_1 exited with code 1

容器 B 可以解析容器 A 的名称,但无法到达。

编辑:我一直在环顾四周,似乎它可能是 docker0 接口的系统网络问题。

【问题讨论】:

    标签: docker networking docker-compose dns systemd


    【解决方案1】:

    昨天我遇到了类似的问题,当时我放了这样的东西:

    network: 
     it-network:
       driver: bridge
    

    服务无法相互访问,我认为是因为将网络的创建委托给 docker-compose 文件。

    但是当我先创建网络时:

    docker network create --driver bridge it-network
    

    然后在docker-compose.yml文件中使用

    services: 
     service1: 
      networks:
       - it-networks
    .....
    networks:
     default: 
      external: 
        name: it-network
    

    工作正常。

    我使用的有用命令:

    docker network inspect it-network
    

    我发现的其他解决方案是使用扩展指令,通过它您可以在服务和不同的 docker-compose 文件之间共享配置。

    https://docs.docker.com/compose/extends/

    但我还没有测试它。

    我在 docker-compose 文件中使用的服务

    • postgres(来自 docker hub)
    • Jira Software(来自 Dockerfile 的预编译映像)

    我的 docker compose 文件是这样的:

    
    version: '3'
    
    services:
      postgresql-jira:
        image: postgres:9.5-alpine
        volumes:
          - postgresqldata:/var/lib/postgresql/data
        environment:
          - 'POSTGRES_USER=devops'
          # CHANGE THE PASSWORD!
          - 'POSTGRES_PASSWORD=xxx'
          - 'POSTGRES_DB=jiradb'
          - 'POSTGRES_ENCODING=UNICODE'
          - 'POSTGRES_COLLATE=C'
          - 'POSTGRES_COLLATE_TYPE=C'
        logging:
          # limit logs retained on host to 25MB
          driver: "json-file"
          options:
            max-size: "500k"
            max-file: "50"
      jira-software:
        depends_on:
          - postgresql-jira
        image: XXX/jira-server:8.8.1
        volumes:
          - jiradata:/var/atlassian/jira
        ports:
          - '80:8080'
        environment:
          - 'JIRA_DATABASE_URL=postgresql://devops@postgresql/jiradb'
          - 'JIRA_DB_PASSWORD=xxx'
          - 'SETENV_JVM_MINIMUM_MEMORY=2048m'
          - 'SETENV_JVM_MAXIMUM_MEMORY=4096m'
          - 'JIRA_PROXY_NAME='
          - 'JIRA_PROXY_PORT='
          - 'JIRA_PROXY_SCHEME='
        links: 
          - "postgresql-jira:postgresql-jira-db"
        logging:
          # limit logs retained on host to 25MB
          driver: "json-file"
          options:
            max-size: "500k"
            max-file: "50"
    
    volumes:
      jiradata:
        external: false
      postgresqldata:
        external: false
    
    networks:
      default:
        external:
          name: it-network
    
    
    
    

    【讨论】:

    • 我已经在labs.play-with-docker.com 上尝试了我的 docker-compose.yml 作为一个干净的环境,它似乎可以按预期工作,一定是我的系统网络配置有问题
    【解决方案2】:

    尝试为每个实例添加主机名或链接

    services:
      A:
      image: nginx:1.17
      hostname: A
      networks:
        - test_net
    
    B:
      image: node:14-alpine
      hostname: B
      command: wget A
      networks:
        - test_net
    

    【讨论】:

      【解决方案3】:

      您是否尝试过以下列方式配置您的网络? 注意这里会用到桥接模式。

      networks:
        test_net:
          driver: bridge
          ipam:
            driver: default
            config:
            - subnet: 177.10.10.0/24
      

      我配置了我的,你可以在https://github.com/guerrato/docker_config查看它

      PS:可能有些服务需要更新其 Dockerfile,但您可以信任 docker-compose.yml

      【讨论】:

      • 我试过了,但还是不行,其次,这是一个 hack,docker 应该能够使用内部网络与其他容器通信
      猜你喜欢
      • 2020-10-18
      • 1970-01-01
      • 2021-07-19
      • 2019-08-23
      • 2016-02-20
      • 2023-01-05
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      相关资源
      最近更新 更多