我的公司有一个基于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以根用户身份运行测试查询即可。
我已经阅读了诸如How to connect locally hosted MySQL database with the docker container之类的问答。
我已成功桥接到主机的IP (在EthernetV上;在Hyper-V中运行的Docker)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:“主机” 的解决方案-以这种方式解决会避免我需要了解的细节。[链接的问答显示,主机模式是最简单的解决方案,但这太简单了-掩盖了一些重要的考虑因素。]
主机的端口3306上具有MySQL。上面显示的mysql
容器:它是否使用自己的MySQL副本?还是已经尝试连接到主机的MySQL?为何它具有端口映射3305:3306
? (我无法将其更改为3306:3306
;如果这样做,它就无法分配端口号。我认为这是因为主机的MySQL已经使用3306,并且该端口行正在暴露mysql容器的MySQL?)
如果我想按原样使用mysql容器,则应该将数据移到data:...
上?这可能是我现在要做的-这可能使这个有争议的问题-但我仍然想知道如何来完成我要问的事情。
我假设它是自己的数据库,因为它具有自己的版本号(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/
答案 0 :(得分:1)
首先,声明:
links:
- mysql
不需要mywebiste服务中的,它实际上会妨碍您解决问题。您应该将其删除。
这样做之后,您可以尝试2种方法(它们对我都有用):
mywebsite:
...
extra_hosts:
- "mysql:<your ip>"
我希望这对您有帮助