Назад | Перейти на главную страницу

Как разрешить имена, определенные в docker-compose, с хоста?

Если у меня есть docker-compose, который определяет различные контейнеры в одной или нескольких (внутренних) сетях, процессы внутри контейнеров могут разрешать IPv4-адреса других контейнеров, используя имена, определенные в файле docker-compose.yml.

Например, учитывая это:

version: '3'
services:

  db:
    image: postgres:9.6-alpine
    restart: always
    networks:
      - internal_network
    # this does not work because the network is internal
    ports:
      - "127.0.0.1:5432:5432"

  web:
    image: my-application
    restart: always
    env_file: .env.production
    command: bash -c "bundle exec rails s -p 3000 -b '0.0.0.0'"
    networks:
      - internal_network
    # this does not work because the network is internal
    ports:
      - "127.0.0.1:3000:3000"

networks:
  internal_network:
    internal: true

Контейнеры могут преобразовывать имена хостов db, docker_db_1, web и docker_web_1.

Я хочу иметь возможность подключиться к docker_db_1:5432 и docker_web_1:3000 (или эквивалент) от хоста, независимо от того, какие IPv4-адреса им были назначены, и держать их изолированными от внешней сети с помощью internal: true флаг.

В port: привязка подойдет, но для внутренних сетей она, похоже, не работает.

Я бы подумал, что я должен иметь возможность использовать разрешение имен, используемое docker-compose внутри, но, похоже, хост не может этого сделать, и я не могу найти никаких подсказок, как это сделать.

Кто-нибудь знает, почему это так и как это можно обойти?