Переключение из контейнера Docker MySQL в MySQL хоста без использования network-mode = "host" - PullRequest
0 голосов
/ 31 марта 2019

У моей компании есть веб-сайт на основе Docker-контейнеров (контейнеры Ubuntu), развернутый через GitHub => CircleCI => AWS.(Это было установлено консультантом, с которым мы в настоящее время не работаем. Я пытаюсь разобраться во всем самостоятельно.)
Я скопировал исходные файлы на свой компьютер для разработки под Windows 10.
Локально, веб-сайт успешно работает, пока не попытается получить доступ к данным MySQL.

Я установил MySQL (8) локально, с настройками по умолчанию (port 3306) и местоположением (C:\ProgramData\MySQL\MySQL Server 8.0\Data),и импортировал базу данных.Я создал пользователя root.Выполнение тестовых запросов от имени MySQL Workbench с правами root.

Я прочитал вопросы и ответы, такие как Как связать локально размещенную базу данных MySQL с док-контейнером .

Я успешно подключился к IP-адресу хоста (на EthernetV; Docker работает в Hyper-V) 172.26.92.81 для других целей, особенно для того, чтобы XDebug в моем контейнере веб-сайта говорил с phpstorm на моем хосте Windows 10.(Я мог бы использовать host.docker.internal для IP; но я делаю все как можно более "конкретным", пока все не будет работать.)

Я просто не понимаю, что мне нужно изменить, где, для перенаправления MySQLi запросов (в php как создание веб-страниц) к хосту (pc разработки).(Предположим, я не разбираюсь ни в MySQL, ни в Docker, ни в Apache, пока не доказано обратное.)

Соответствующие части (оригинал) docker-compose.yml:

mywebsite:
    build:
    context: ./mywebsite/
    dockerfile: Dockerfile
    ...
    depends_on:
    - mysql
    links:
    - mysql
    environment:
    MYSQL_HOST: mysql
    MYSQL_USER: root
    MYSQL_PASS: xxx
    MYSQL_SCHEMA: xxx
    MYSQL_PORT: 3306
    MYSQL_CHARSET: utf8

mysql:
    image: mysql:5.7
    ports:
    - 3305:3306
    command: mysqld --sql_mode=""
    environment:
    MYSQL_DATABASE: xxx
    MYSQL_ROOT_PASSWORD: xxx
    volumes:
    - data:/var/lib/mysql

ПРИМЕЧАНИЕ.лучшие практики »выше;Мне нужно, чтобы простой подход работал.Безопасность наступит позже.

Я бы предпочел решение, которое не включает "network_mode:" host " - решение этого вопроса позволит избежать деталей, которые мне нужно понять.связанные вопросы и ответы показывают, что хост-режим является самым простым решением, но это «слишком просто» - затеняет некоторые важные соображения.]

Хост имеет MySQL на своем порту 3306. Контейнер mysql, показанный выше: использует ли онего собственная копия MySQL? Или она уже пытается подключиться к хосту MySQL? И почему у него отображение порта 3305:3306? (Я не могу изменить это на 3306:3306; если это так, он не может назначитьномер порта. Я предполагаю, что это потому, что MySQL хоста уже использует 3306, и эта строка порта отображает MySQL контейнера MySQL?)

Отображение тома data:... - это то место, куда я должен переместить данные, если я хочу использовать контейнер MySQL как есть? Это, вероятно, то, что я сейчас сделаю - что может сделать этот вопрос таким спорным - но я все же хотел бы знать как что делатьЯ спрашиваю.

Я предполагаю, что это собственная база данных, потому что она имеет собственный номер версии (5.7).
Из php внутри mywebsite:

$connection = new \mysqli(
            $_ENV["MYSQL_HOST"],
            $_ENV["MYSQL_USER"],
            $_ENV["MYSQL_PASS"],
            'INFORMATION_SCHEMA',
            $_ENV["MYSQL_PORT"]
        );
$result = $connection->query("SELECT VERSION();");
# breakpoint: $result > one row > ['VERSION()'] = 5.7.25

, которая является версиейномер этого образа mysql, а не mysql хоста.

аналогично, список баз данных не включает некоторые базы данных, которые я вижу на хосте mysql из Workbench.

Какие изменения янужно внести в docker-compose.yml?


Нужно ли также вносить изменения в Dockerfile моего сайта?

mywebsite на основе apache2 + php 7.3.Dockerfile:

FROM php:7.3.3-apache-stretch
...
RUN apt-get update && ... docker-php-ext-install ... mysqli \
    && docker-php-ext-enable mysqli ...
...
COPY /php.ini /usr/local/etc/php/
COPY /src/ /var/www/html/

1 Ответ

1 голос
/ 01 апреля 2019

Прежде всего, декларация:

links:
    - mysql

в сервисе mywebiste не требуется и фактически мешает вам решить вашу проблему. Вы должны удалить его.

После этого вы можете попробовать 2 вещи (обе у меня сработали):

  1. измените MYSQL_HOST, указав IP-адрес вашего компьютера (не «localhost», не «127.0.0.1», а IP-адрес вашей локальной сети), и запустите только службу mywebsite.
  2. в версии 3.0 или выше файла docker-compose вы можете добавить дополнительные хосты:
mywebsite:
...
  extra_hosts:
    - "mysql:<your ip>"

Надеюсь, это поможет

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