first-programmer
@first-programmer
Backend software engineer

Как общаться между контейнерами docker?

Всем привет коллеги.

Есть разные сервисы, например возьмем два service-a (php, nginx) и service-b

service-a

version: '3.5'

networks:
  main:
    driver: bridge
    name: main
    ipam:
      driver: default
      config:
        - subnet: 172.26.13.0/24

services:
  php-service-a:
    build:
      context: .
      dockerfile: docker/php-extended/Dockerfile
      args:
        ssh_prv_key: ""
    volumes:
      - ./:/app
      - "phpsocket:/var/run"
      - ~/.ssh:/root/.ssh
    networks:
      - main

  nginx-service-a:
    build:
      context: .
      dockerfile: docker/nginx/Dockerfile
    ports:
      - "${NGINX_PORT}:80"
    volumes:
      - ./:/app
      - "phpsocket:/var/run"
    depends_on:
      - php-service-a
    networks:
      - main

volumes:
  phpsocket:


service-b

version: '3.5'

networks:
  main:
    external:
      name: main

services:
  service-b:
    build:
      context: .
      dockerfile: docker/golang/local.Dockerfile
    working_dir: /go/app
    volumes:
      - ./:/go/app
    ports:
      - "${GO_PORT}:8080"
    environment:
      - DB_USERNAME
      - DB_PASSWORD
      - DB_HOST
      - DB_EXTERNAL_PORT
      - DB_DB
    networks:
      - main
    tty: true


Тут GO_PORT = 8027.

В первом сервисе мы создаем сеть main, во втором сервисе используем ее как внешнюю.

Запускаем все контейнеры. Заходим в контейнер сервиса А. Там выполняем запрос курлом на адрес service-b:8027 - пишет что хост не верный, тоже с запросом на localhost. Работает только запрос на host.docker.internal:8027. Объясните пожалуйста почему? Вроде по имени сервиса внутри контейнера должен работать запрос.

Снаружи все понятно, там только работает по localhost:8027, так как не прописан по умолчанию хост service-b. А вот почему ни по имени хоста, ни по localhost внутри контейнера не доступен сервис это странно. 127.0.0.1:8027 тоже пробовал внутри контейнера.
  • Вопрос задан
  • 1233 просмотра
Пригласить эксперта
Ответы на вопрос 2
vabka
@vabka
Токсичный шарпист

Работает только запрос на host.docker.internal:8027. Объясните пожалуйста почему? Вроде по имени сервиса внутри контейнера должен работать запрос.

Имена работают только в пределах одного compose, как и сети.
Запихните оба сервиса в один compose, раз они друг от друга зависят.

Контейнеры определяет докерфайл, по тому и не работает localhost, тк это всё разные контейнеры
Ответ написан
@quiex
Не нужно ничего запихивать в один docker-compose.yml, все должно работать и так.
Docker-compose это всего лишь обертка над стандартным docker api, так что это равнозначно тому, что вы запустите контейнеры просто через docker run.

Почему, конкретно у вас не работает, точно сказать не могу.

Для начала посмотрите docker network ls: не создает ли compose сеть с префиксами/суффиксами.
Попробуйте создать сеть извне, а в обоих файла прописать external.
Ну и еще, возможно, это зависит от ОС, на которой вы все это делаете.(на маке, к примеру все работает)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы