我的公司有一个基于 docker 容器的网站(Ubuntu 容器),通过 GitHub => CircleCI => AWS 部署。 (这是由一位顾问设立的,我们目前没有与他合作。我正在尝试自己理解一切。)
我已将源文件复制到我的 Windows 10 开发电脑。
在本地,网站运行成功,直到它尝试访问 MySQL 数据。
我已在本地安装了 MySQL (8),使用默认设置(端口 3306
)和位置(C:\ProgramData\MySQL\MySQL Server 8.0\Data
) ,并导入数据库。我已经创建了root用户。从 MySQL Workbench 以 root 身份运行测试查询是可行的。
我已阅读问答,例如 How to connect locally hosted MySQL database with the docker container .
我已成功桥接到主机的 IP(在 EthernetV 上;Docker 在 Hyper-V 中运行)172.26.92.81
用于其他目的,特别是在我的网站中使用 XDebug容器与我的 Windows 10 主机上的 phpstorm 对话。 (我可以使用 host.docker.internal
作为 IP;但我会让一切尽可能“具体”,直到一切正常。)
我只是不明白我必须在哪里更改什么,以便将 MySQLi
查询(在 php 中作为创建网页)重定向到(开发电脑)主机。 (假设我对 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”的解决方案——以这种方式解决它可以避免我需要理解的细节。[链接的问答显示主机模式是最简单的解决方案,但这“太简单” - 掩盖了一些重要的考虑因素。]
主机的端口 3306 上有 MySQL。上面显示的 mysql
容器:它是否使用自己的 MySQL 副本?或者是否已经在尝试连接到主机的 MySQL?为什么它有端口映射3305:3306
? (我无法将其更改为 3306:3306
;如果这样做,则无法分配端口号。我认为这是因为主机的 MySQL 已经使用 3306,并且该端口行暴露了mysql 容器的 MySQL?)
卷映射data:...
是我应该将数据移动到的位置,如果我想按原样使用mysql容器?这可能就是我会做的现在做 - 这可能会让这个问题变得毫无意义 - 但我仍然想知道如何去做我要求的事情。
我假设它是自己的数据库,因为它有自己的版本号(5.7)。
从 mywebsite
内的 php:
$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。
同样,数据库列表不包括我在 Workbench 主机 mysql 上看到的一些数据库。
我需要在 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/
最佳答案
首先声明:
links:
- mysql
mywebiste 服务是不需要的,并且实际上会妨碍您解决问题。您应该将其删除。
完成此操作后,您可以尝试两件事(它们都对我有用):
- 将 MYSQL_HOST 更改为指向您计算机的 IP(不是“localhost”,也不是“127.0.0.1”,而是您的本地网络 IP 地址)并仅启动 mywebsite 服务。
- 在 docker-compose 文件 3.0 或更高版本中,您可以添加额外的主机:
mywebsite:
...
extra_hosts:
- "mysql:<your ip>"
希望这有帮助
关于mysql - 从docker mysql容器切换到主机的mysql而不使用网络模式="host",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55441383/