PHP приложение не может подключиться к docker mysql контейнеру на 127.0.0.1 - PullRequest
3 голосов
/ 15 февраля 2020

Mysql находится в своем собственном docker -compose.yml, так как я хочу, чтобы сервер mysql был запущен и работал, к которому может подключиться любое другое приложение php. Поэтому у меня нет php и mysql в одном docker -compose.yml. Из приложения php я могу подключиться к mysql, если я использую IP-адрес шлюза контейнера mysql, просмотрев его и затем жестко запрограммировав его в приложение php. docker inspect mysql-db. Но docker будет изменять этот 172 ... IP-адрес каждый раз, когда mysql перезапускается, так что это не идеально для разработки.

Я могу подключиться к mysql через mysql -h 127.0.0.1 без проблем, но из php приложение, если я пытаюсь использовать 127.0.0.1, я получаю отказано в соединении. Я могу подключиться, только если я использую IP-адрес шлюза 172 ...

Как получить контейнер mysql, прослушивающий соединения с хоста на 127.0.0.1?

docker -compose.yml для mysql

version: "3"

services:
  mysql:
    container_name: mysql-db
    image: mysql
    build:
      dockerfile: Dockerfile
      context: ./server/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=admin
    volumes:
      - ./data/mysql:/var/lib/mysql
    ports:
      - 3306:3306

docker -compose.yml для php

version: "3"

services:
  nginx:
    container_name: nginx_myapp
    image: nginx
    build:
      dockerfile: Dockerfile
      context: ./server/nginx
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./app:/var/www/html
    networks:
      - myapp
  php:
    container_name: php_myapp
    image: php:7.3-fpm
    build:
      dockerfile: Dockerfile
      context: ./server/php-fpm
    environment:
      CI_ENV: development
    volumes:
      - ./app:/var/www/html
    networks:
      - myapp

networks:
  myapp:

Ответы [ 2 ]

3 голосов
/ 15 февраля 2020

127.0.0.1 - адрес обратной связи. Это указывает на localhost. В контексте docker localhost - это сам контейнер. В вашем контейнере php не запущена база данных, поэтому соединение никогда не будет успешным.

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

Важное примечание : чтобы ниже работало, вы необходимо использовать файл compose version> = 3.5

---
version: '3.7'
#...
networks:
  default:
    name: shared_mysql

Теперь вы можете использовать эту shared_mysql сеть как external из любого другого проекта compose.

version: '3.7'

services:
  nginx:
    #...
    networks:
      - myapp
  php:
    #...
    networks:
      - myapp
      - database

networks:
  myapp:
  database:
    external: true
    name: shared_mysql

Затем вы можете подключиться к mysql из вашего php контейнера, используя имя службы mysql (например, mysql -h mysql -u user -p)

Ссылка: https://docs.docker.com/compose/networking/

0 голосов
/ 15 февраля 2020

Несколько решений для вас

1) вы можете дублировать раздел mysql в каждом файле, используя один и тот же путь тома, в этом случае при запуске проекта у вас будут одинаковые базы данных

project1
version: "3.2"
services:
  mysql:
    volumes:
      - /var/mysql:/var/lib/mysql
  php:
    build:
      context: './php/'

project2
version: "3.2"
services:
  mysql:
    volumes:
      - /var/mysql:/var/lib/mysql
  php:
    build:
      context: './php/'

2) вы можете подключиться с помощью хоста. docker .internal или macos (docker .for.ma c .localhost) напрямую к вашему хосту. Более подробную информацию можно получить здесь Изнутри контейнера Docker, как мне подключиться к локальному хосту машины?

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