从docker mysql容器切换到主机的mysql,而无需使用network-mode =“ host”

时间:2019-03-31 13:26:17

标签: mysql docker-compose

我的公司有一个基于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/

1 个答案:

答案 0 :(得分:1)

首先,声明:

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>"

我希望这对您有帮助