繁体   English   中英

从docker mysql容器切换到主机的mysql,而无需使用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件事(两者对我都有用):

  1. 更改MYSQL_HOST以指向您计算机的IP(不是“ localhost”,不是“ 127.0.0.1”,而是您的本地IP地址),然后仅启动mywebsite服务。
  2. 在docker-compose文件的3.0版或更高版本中,您可以添加额外的主机:
mywebsite:
...
  extra_hosts:
    - "mysql:<your ip>"

我希望这有帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM