![](/img/trans.png)
[英]Can connect to mysql running on localhost from docker container running with network_mode: 'host'
[英]Switch from docker mysql container to host's mysql without using network-mode=“host”
我公司有一个基于docker-container的网站(Ubuntu容器),通过GitHub => CircleCI => AWS进行部署。 (这是由我们目前不与之合作的顾问设立的。我试图自己理解所有事情。)
我已将源文件复制到Windows 10开发PC。
网站在本地运行成功,直到尝试访问MySQL数据为止。
我已经在本地安装了MySQL(8),具有默认设置( port 3306
)和位置( C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Data
),并导入了数据库。 我已经创建了root用户。 从MySQL Workbench作为root运行测试查询是可行的。
我已经阅读了问答,例如如何将本地托管的MySQL数据库与docker容器连接 。
我已经成功地桥接至主机的IP(上EthernetV;码头工人在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“的解决方案-以这种方式解决会避免我需要了解的细节。[链接的问与答表明,主机模式是最简单的解决方案,但“简单”-遮盖了一些重要的注意事项。]
主机的端口3306上有MySQL。上面显示的mysql
容器:它是否使用自己的MySQL副本? 还是已经尝试连接到主机的MySQL? 为什么它具有端口映射3305:3306
? (我无法将其更改为3306:3306
;如果这样做,它将无法分配端口号。我认为这是因为主机的MySQL已经使用3306,并且该端口行正在暴露mysql容器的MySQL?)
卷映射data:...
,如果我想按原样使用mysql容器,应该将数据移至其中? 那可能就是我现在要做的事情-可能使这个SO问题变得毫无意义-但我仍然想知道如何去做我要问的事情。
我假设它是自己的数据库,因为它有自己的版本号(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
进行哪些更改?
我还需要在mywebsite的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服务,它实际上会妨碍您解决问题。 您应该删除它。
完成此操作后,您可以尝试2件事(两者对我都有用):
mywebsite:
...
extra_hosts:
- "mysql:<your ip>"
我希望这有帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.