Bandicoot
@Bandicoot
Вась-программист

Как соединиться с локальным проектом на хост-машине из докер-контейнера?

Итак, работаю локально. Один проект поднимается через docker-compose, другой настроен по-старинке на хост-машине. Первый проект (который работает через докер) не имеет своей БД и забирает данные по API из второго (который работает на локалхосте), у которого своя БД есть.

В первом проекте уже давно есть конфиг docker-compose.yml, т.к. на проде работа идет через докер. До недавнего времени я поднимал первый проект также на локалхосте, но руководство поставило мне задачу разобраться с докером и расширить конфиг. Пока все шло через локалхост, никаких проблем не было, т.к. настроить виртуальные хосты на nginx'e дело не хитрое. Но как только начал работать с докером - возникла проблема, которую озвучил в вопросе. Не могу установить соединение по API, при том что в первом проекте все контейнеры поднялись нормально и работают.

Мой текущий конфиг docker-compose.yml первого проекта:
version: '3'

services:
    fpm:
        restart: always
        command: php-fpm
        image: pk1z/php74-fpm-memcached-phalcon4-redis-sockets-blackfire-xdebug-gd:1
        volumes:
          - ./:/var/www/html
          - ./phpSettings.conf:/usr/local/etc/php-fpm.d/zzz-phpSettings.conf
        env_file:
          - .env
        environment:
          - PHP_IDE_CONFIG=serverName=${BASE_HOST}
          - XDEBUG_CONFIG=remote_enable=true remote_host=dockerhost remote_port=9000 idekey=SK_IDE_KEY remote_autostart=true
        networks:
          - default
          - dockernet

    dockerhost:
        image: qoomon/docker-host
        cap_add: [ 'NET_ADMIN', 'NET_RAW' ]
        restart: on-failure

    nginx:
        restart: always
        image: nginx:latest
        depends_on:
          - fpm
        links:
          - fpm:fpm
        volumes:
          - ./nginx/conf.d:/etc/nginx/conf.d
          - .:/var/www/html
        ports:
          - 8098:80

    db:
        image: mysql:5.7
        ports:
          - ${MYSQL_PORT}:3306
        env_file:
          - .env
        environment:
            MYSQL_ROOT_PASSWORD: "${DB_PASSWORD}"
            MYSQL_DATABASE: "${DB_NAME}"
            MYSQL_USER: "${DB_USER}"
            MYSQL_PASSWORD: "${DB_PASSWORD}"
        volumes:
          - mirrors_db_data:/var/lib/mysql
volumes:
    mirrors_db_data:
        external: true

networks:
  dockernet:
    external: true


Когда захожу на localhost:8098, то вижу эту ошибку:

601fd1a050554257360514.png

Как можно догадаться, второй проект висит на виртуальном хосте skapi.test, настроенном на локальной машине. Подключение к API идет через Symfony HTTP Client. Я пробовал делать точно такой же запрос через Постман - данные отдаются без проблем.

Как я понимаю, нужно расширить конфиг сервиса fpm, чтобы он коннектился к виртуальном хосту хост-машины. Подскажите пожалуйста, как это сделать.
  • Вопрос задан
  • 833 просмотра
Решения вопроса 1
@q2digger
никого не трогаю, починяю примус
Это называется extra-hosts, работает как файл hosts для контейнера. Ниже пример использования:
version: '3.1'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - ./:/var/www
    extra_hosts:
      - "site.local:192.168.88.1"

volumes:
  wordpress:
  db:

в контейнере wordpress добавлено в hosts : site.local - 192.168.88.1
dmitryg@MacBook-Pro:~/tmp|⇒  docker-compose exec wordpress /bin/bash
root@707dcf9d2f3f:/var/www/html# cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
192.168.88.1	site.local
172.18.0.2	707dcf9d2f3f


добавите свой внешний сервис в хосты контейнера и он будет к ним обращаться - айпишник только укажете верный, конечно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
part_os
@part_os
Сложное в простом
скорей всего ваш докер не понимает где находится skapi.test, ведь вы наверное его прописали в hosts
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы