在docker-compose的extra_hosts选项中解析容器名称

Edw*_*ard 6 dns docker docker-compose

我需要从另一个容器中卷曲我的API。容器1称为nginx容器2称为fpm

我需要能够扑向FPM容器并卷曲nginx容器。

配置:

services:

  nginx:
    build:
      context: .
      dockerfile: ./docker/nginx/Dockerfile
    volumes:
      - ./docker/nginx/conf/dev/api.conf:/etc/nginx/conf.d/default.conf
    ports:
      - 8080:80
    links:
      - fpm


  fpm:
    build:
      context: .
      dockerfile: ./docker/fpm/Dockerfile
    volumes:
      - .:/var/www/html
      - ./docker/fpm/conf/dev/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini
      - ./docker/fpm/conf/dev/api.ini:/usr/local/etc/php/conf.d/api.ini
    env_file:
      - ./docker/mysql/mysql.env
      - ./docker/fpm/conf/dev/fpm.env
    links:
      - mysql
    shm_size: 256M
    extra_hosts:
      - myapi.docker:nginx
Run Code Online (Sandbox Code Playgroud)

我最初的想法是将其拍打在以下extra_hosts选项中:

extra_hosts:
  - myapi.docker:nginx
Run Code Online (Sandbox Code Playgroud)

但是docker-compose up失败了:

错误:对于apiwip_fpm_1无法为服务fpm创建容器:添加主机中的IP地址无效:“ nginx”

我已经看到了一些使用docker网络配置的人的例子,但是仅仅解析地址似乎是最重要的。

我如何解析/评估容器的IP地址,而不是直接通过容器传递它?

wil*_*aks 14

Add network aliases in the default network.

version: "3.7"
services:

  nginx:
    # ...
    networks:
      default:
        aliases:
          - example.local

  browser-sync:
    # ...
    depends_on:
      - nginx
    command: "browser-sync start --proxy http://example.local"
Run Code Online (Sandbox Code Playgroud)


小智 7

services:
        
  nginx:
    build:
      context: .
      dockerfile: ./docker/nginx/Dockerfile
    volumes:
      - ./docker/nginx/conf/dev/api.conf:/etc/nginx/conf.d/default.conf
    ports:
      - 8080:80
    networks:
      my_network:
        aliases:
          - myapi.docker
          - docker_my_network
      
          fpm:
            build:
              context: .
              dockerfile: ./docker/fpm/Dockerfile
            volumes:
              - .:/var/www/html
              - ./docker/fpm/conf/dev/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini
              - ./docker/fpm/conf/dev/api.ini:/usr/local/etc/php/conf.d/api.ini
            env_file:
              - ./docker/mysql/mysql.env
              - ./docker/fpm/conf/dev/fpm.env
            links:
              - mysql
            shm_size: 256M
            networks:
              - my_network
        
          networks:
            my_network:
              driver: bridge
Run Code Online (Sandbox Code Playgroud)
  • 添加自定义网络并将容器添加到该网络
  • 默认情况下,如果您从 fpm 卷曲 nginx 容器,您将卷曲 localhost,因此我们需要添加别名以与 nginx 配置中的服务器名称相同
  • 使用此解决方案,您可以从 fpm 容器 curl myapi.docker

@edward 让我知道此解决方案是否适合您

编辑:Jack_Hu 是对的,我删除了 extra_hosts。网络别名就足够了。

  • 似乎不起作用。仍然收到原始错误:`错误:对于 apiwip_fpm_1 无法为服务 fpm 创建容器:add-host 中的 IP 地址无效:“nginx”` (2认同)
  • 解决了......解决方案是从上面完全删除 `extra_hosts:` `- myapi.docker:nginx` 位。网络别名有效地取代了它,而不是在“/etc/hosts”文件中解析 DNS,而是在虚拟网络适配器本身上解析......基本上,因为服务已在对于给定的网络,该网络上的所有其他服务都能够将给定的别名解析为其所附加的服务。 (2认同)

Ben*_*nyi 7

我通过使用links而不是extra_hosts.

在这种情况下,只需设置link alias即可。

服务 fpm 设置
links
  - nginx:myapi.docker
Run Code Online (Sandbox Code Playgroud)

请参阅docker-compose links 文档,别名可以是您代码中出现的域。

  • `link` 已经被弃用很长一段时间了。应改用网络别名。有关详细信息,请参阅 Denis Kovacevic 的回答以及我对其的评论。 (3认同)