Мне нужен совет с настройкой Laravel docker - PullRequest
0 голосов
/ 14 марта 2020

У меня странная проблема с докеризацией приложения Laravel для локального разработчика. Контейнеру PHP необходим внутренний IP-адрес docker для контейнера mysql, в отличие от 127.0.0.1, в противном случае он прерывается следующим сообщением:

SQLSTATE[HY000] [2002] Connection refused (SQL: select * from `users` where `email` = jr@m3u.com limit 1)

Если Я использую команду inspect: docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

Я вижу 172 диапазона IP-адресов для каждого контейнера, и если я изменю сервер mysql на 172.31.0.2 в файле * .env Laravel, тогда приложение работает нормально.

Вот мой файл docker -compose.yml:

version: '3'

networks:
  laravel:

services:
  nginx:
    image: nginx:stable-alpine
    container_name: nginx
    ports:
      - "8888:80"
    volumes:
      - ../src:/var/www
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
      - mysql
    networks:
      - laravel

  mysql:
    image: mysql:5.7.22
    container_name: mysql
    restart: unless-stopped
    tty: true
    ports:
      - 3310:3306
    environment:
      MYSQL_DATABASE: docker
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      MYSQL_ROOT_PASSWORD: root
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    volumes:
      - ./mysql:/var/lib/mysql
    networks:
      - laravel

  php:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: php
    volumes:
      - ../src:/var/www
    ports:
      - "9000:9000"
    networks:
      - laravel

Любая помощь будет оценена. : -)

1 Ответ

1 голос
/ 14 марта 2020

Это совершенно нормально.

127.0.0.1 будет означать, что контейнер, выполняющий код, может связываться с базой данных в том же контейнере, что здесь не в вашем случае, так как каждый сервис имеет свой собственный контейнер в вашем композите. структура (что замечательно).

Как уже упоминалось в сетевой документации , контейнеры по умолчанию подключаются к одной сети, поэтому они могут связываться друг с другом по имени или IP-адресу. docker внутренняя сеть.

По умолчанию Compose устанавливает единую сеть для вашего приложения. Каждый контейнер для службы присоединяется к сети по умолчанию и доступен другим контейнерам в этой сети и может быть обнаружен ими с именем хоста, идентичным имени контейнера.

Насколько я знаю, у вас есть 3 варианта:

  • Используйте имя контейнера (mysql) в качестве имени хоста
  • Укажите IP-адрес контейнера (я не рекомендую, поскольку IP-адрес может быть изменен). при перезапуске контейнеров. Вам придется вручную изменять IP-адрес хоста при каждом изменении IP-адреса контейнера - более или менее при каждом перезапуске)
  • Другой подход заключается в определении stati c IPS на docker сеть @see раздел ip сетевой документации.

На этом этапе я бы использовал имя контейнера в качестве имени хоста. Это просто и понятно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...