Docker 中容器无法访问主机 MySQL 数据库的解决方法

阅读时长 6 分钟读完

在使用 Docker 进行开发时,经常会遇到容器无法访问主机上的 MySQL 数据库的问题。这是因为 Docker 容器使用了不同的网络命名空间,并且默认情况下不会自动连接到主机的网络。因此,在使用 Docker 运行应用程序的同时,需要注意一些与主机 MySQL 数据库连接相关的配置。

解决方法

要解决容器无法访问主机 MySQL 数据库的问题,可以采取以下措施:

方案一:使用 --net=host 参数

使用 --net=host 参数可以让 Docker 容器共享主机的网络命名空间,使得容器可以直接访问主机的 MySQL 数据库。

方案二:创建 Docker 网络

创建一个 Docker 网络,将主机和容器连接到同一个网络中,从而使得容器可以访问主机上的 MySQL 数据库。

然后启动容器时要将容器连接到这个网络:

方案三:修改 MySQL 的 bind-address 配置参数

MySQL 默认只监听 127.0.0.1,如果要访问主机上的 MySQL 服务器,需要修改 bind-address 配置参数。可以在 MySQL 配置文件 /etc/mysql/mysql.conf.d/mysqld.cnf 中进行设置。

bind-address 参数的值改为 0.0.0.0,表示监听所有地址。然后重启 MySQL 服务器。

方案四:使用 Docker Compose

如果需要同时创建多个容器,并将它们连接到同一个网络中,可以使用 Docker Compose。

docker-compose.yml 中定义一个网络和 MySQL 服务器:

-- -------------------- ---- -------
-------- ---

---------
  ---
    ------ ---------
    -------- ------
    ------------
      -------------------- -------
    ------
      - -----------
    --------
      - --------------------

  ----
    ------ -
    ------
      - ----
    ---------
      - ------

---------
  -------

--------
  ------

networks 部分定义了一个叫做 webnet 的网络,用于连接 dbapp 两个服务。

db 部分定义了一个 MySQL 服务器,将端口 3306 映射到主机的 3306 端口, 并将数据存储在一个叫做 mysql 的卷中。

app 部分定义了一个支持网络 webnet 的应用程序,将端口 80 映射到主机的 80 端口。

启动应用程序:

示例代码

以下是一个使用 Flask 和 SQLAlchemy 的简单示例,演示了如何在 Docker 中使用 MySQL 数据库。

-- -------------------- ---- -------
---- ----- ------ -----
---- ---------------- ------ ----------

--- - ---------------
------------------------------------- - ------------------------------------------------
-- - ---------------

----- ------------------
    -- - --------------------- -----------------
    ---- - -------------------------

---------------
--- --------
    ------- - ---------------------
    ------ ------------ -- ------- ---- --- -------- -----

-- -------- -- -----------
    ------------------- ---------------

在 Dockerfile 中设置环境变量:

-- -------------------- ---- -------
---- --------

------- ----

---- ---------------- --
--- --- ------- -------------- -- ----------------

---- - -

- --- ----------- -------- --- -----
--- ----------------

--- - -------- ----- -

docker-compose.yml 文件中添加 MySQL 服务器:

-- -------------------- ---- -------
---------
  ---
    ------ ---------
    -------- ------
    ------------
      -------------------- -------
    --------
      - --------------------

  ----
    ------ -
    ------
      - -----------
    -----------
      - --
    ------------
      ------------- ------------------------------------------

--------
  ------

在 Flask 应用程序中使用环境变量:

-- -------------------- ---- -------
------ --

---- ----- ------ -----
---- ---------------- ------ ----------

--- - ---------------
------------------------------------- - --------------------------
-- - ---------------

----- ------------------
    -- - --------------------- -----------------
    ---- - -------------------------

---------------
--- --------
    ------- - ---------------------
    ------ ------------ -- ------- ---- --- -------- -----

总结

本文介绍了四种解决容器无法访问主机 MySQL 数据库的方法,包括使用 --net=host 参数,创建 Docker 网络,修改 MySQL 的 bind-address 配置参数和使用 Docker Compose。同时,本文也提供了一个使用 Flask 和 SQLAlchemy 的简单示例,演示了如何在 Docker 中使用 MySQL 数据库。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64696ed1968c7c53b095be92

纠错
反馈