Docker Compose и Mysql не работает на localhost - PullRequest
0 голосов
/ 27 мая 2020

Я использую среду Docker Compose Lamp Stack из этого репозитория github . Он работает хорошо, однако я не могу подключиться к mysql через localhost. Во время тестирования соединения с базой данных мне пришлось установить имя моего сервера на «database», чтобы он работал.

Я уверен, что это вызвано чем-то в установленном docker -compose.yml, но несмотря на попытки изменить container_name: 'database' на имя_контейнера: 'localhost', я не смог его изменить.

Хотя это не серьезная проблема, приложение, которое я разрабатываю, не позволяет мне легко изменить его настройки имени сервера, поэтому я не могу использовать «базу данных».

Что вызывает это? Нужно ли мне полностью сбросить docker compose, чтобы изменения в docker -compose.yml вступили в силу? Какие команды для этого есть?

Изменить: Мой текущий docker -compose.yml:

version: "3"

services:
  webserver:
    build:
      context: ./bin/${PHPVERSION}
    container_name: ${PHPVERSION}
    restart: 'always'
    ports:
      - "${HOST_MACHINE_UNSECURE_HOST_PORT}:80"
      - "${HOST_MACHINE_SECURE_HOST_PORT}:443"
    network_mode: host
    volumes:
      - ${DOCUMENT_ROOT-./www}:/var/www/html
      - ${PHP_INI-./config/php/php.ini}:/usr/local/etc/php/php.ini
      - ${VHOSTS_DIR-./config/vhosts}:/etc/apache2/sites-enabled
      - ${LOG_DIR-./logs/apache2}:/var/log/apache2
  database:
    build:
      context: "./bin/${DATABASE}"
    container_name: 'database'
    restart: 'always'
    ports:
      - "127.0.0.1:${HOST_MACHINE_MYSQL_PORT}:3306"
    volumes:
      - ${MYSQL_DATA_DIR-./data/mysql}:/var/lib/mysql
      - ${MYSQL_LOG_DIR-./logs/mysql}:/var/log/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: 'phpmyadmin'
    environment:
      PMA_HOST: database
      PMA_PORT: 3306
      PMA_USER: ${MYSQL_USER}
      PMA_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    ports:
      - '8080:80'
    volumes:
      - /sessions
      - ${PHP_INI-./config/php/php.ini}:/usr/local/etc/php/conf.d/php-phpmyadmin.ini
  redis:
    container_name: 'redis'
    image: redis:latest
    ports:
      - "127.0.0.1:${HOST_MACHINE_REDIS_PORT}:6379"

Однако, если я попытаюсь подключиться через localhost, например:

<?php
$servername = "localhost";
$username = "user";
$password = "pass";

// Create connection
$conn = new mysqli($servername, $username, $password);

// Check connection
if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
?>

Я получаю следующую ошибку: enter image description here

1 Ответ

1 голос
/ 27 мая 2020

Это имя службы в docker-compose.yml, которое равно database. https://github.com/sprintcube/docker-compose-lamp/blob/master/docker-compose.yml#L19

Изменение имени контейнера не повлияет на строку подключения.

Если вы измените service name в этой строке, убедитесь, что вы также изменили раздел --links в docker -compose.

https://github.com/sprintcube/docker-compose-lamp/blob/master/docker-compose.yml#L38

и PMA_HOST.

Ссылка: https://github.com/sprintcube/docker-compose-lamp/blob/master/docker-compose.yml#L40

После того, как все изменения будут внесены, выполните следующую команду.

docker-compose up --build --remove-orphans

In Если вы столкнулись с какой-либо ошибкой, запустите эту команду

docker-compose down

, а затем снова запустите первую команду.

Обновлен Docker -compose.yml как возможность подключения через localhost

version: "3"

services:
  webserver:
    build: 
      context: ./bin/${PHPVERSION}
    container_name: ${PHPVERSION}
    restart: 'always'
    ports:
      - "${HOST_MACHINE_UNSECURE_HOST_PORT}:80"
      - "${HOST_MACHINE_SECURE_HOST_PORT}:443"
    network_mode: host # Changed
    volumes: 
      - ${DOCUMENT_ROOT-./www}:/var/www/html
      - ${PHP_INI-./config/php/php.ini}:/usr/local/etc/php/php.ini
      - ${VHOSTS_DIR-./config/vhosts}:/etc/apache2/sites-enabled
      - ${LOG_DIR-./logs/apache2}:/var/log/apache2
  database:
    build:
      context: "./bin/${DATABASE}"
    container_name: 'database'
    restart: 'always'
    ports:
      - "127.0.0.1:${HOST_MACHINE_MYSQL_PORT}:3306"
    volumes: 
      - ${MYSQL_DATA_DIR-./data/mysql}:/var/lib/mysql
      - ${MYSQL_LOG_DIR-./logs/mysql}:/var/log/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: 'phpmyadmin'
    links:
      - database
    environment:
      PMA_HOST: database
      PMA_PORT: 3306
      PMA_USER: ${MYSQL_USER}
      PMA_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    ports:
      - '8080:80'
    volumes: 
      - /sessions
      - ${PHP_INI-./config/php/php.ini}:/usr/local/etc/php/conf.d/php-phpmyadmin.ini
  redis:
    container_name: 'redis'
    image: redis:latest
    ports:
      - "127.0.0.1:${HOST_MACHINE_REDIS_PORT}:6379"
...