У моей компании есть веб-сайт на основе 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/