mysql - 从docker mysql容器切换到主机的mysql而不使用网络模式="host"

标签 mysql docker-compose

我的公司有一个基于 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 服务是不需要的,并且实际上会妨碍您解决问题。您应该将其删除。

完成此操作后,您可以尝试两件事(它们都对我有用):

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

希望这有帮助

关于mysql - 从docker mysql容器切换到主机的mysql而不使用网络模式="host",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55441383/

相关文章:

docker - Docker-compose 中的 Payara 服务器

php - PDO 捕获结果

mysql - Visual Studio 2019 中的 Entity Framework 集成

docker - 在构建时使用 docker-compose 将环境变量传递给 docker 镜像

java - Docker 未捕获环境变量

elasticsearch - Docker-compose '' NoneType'不可迭代'

macos - docker-compose up 对 sh 文件的权限被拒绝

php - 我的脚本下载页面的源代码而不是实际文件

mysql - 选择 Laravel 中列的总和等于另一个表中另一列的值的所有行

mysql - 统计MySQL中 "latest"连续计数