【问题标题】:Connect application to database when they are in separate docker containers当应用程序位于单独的 docker 容器中时将它们连接到数据库
【发布时间】:2019-10-02 00:49:24
【问题描述】:

好吧,设置很简单,应该有两个容器:一个用于 mysql 数据库,另一个用于 Web 应用程序。

我如何运行容器, 第一个用于数据库,第二个用于应用程序:

docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=db -p 3306:3306 -d mysql

docker run -p 8081:8081 myrepo/myapp

应用程序尝试使用 localhost:3306 连接到数据库,但我发现问题是每个容器都有自己的 localhost。

我找到的一个解决方案是使用--net 为容器添加相同的网络,而 docker 命令恰好如下所示:

docker network create my-network

docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=db -p 3306:3306 -d --net my-network mysql

docker run --net my-network -p 8081:8081 myrepo/myapp

尽管如此,Web 应用程序仍然无法连接到数据库。 我做错了什么?当它们都在容器中时,将应用程序连接到数据库的正确流程是什么?

【问题讨论】:

  • 你需要告诉app容器连接到my-network中DB容器的IP。 localhost 将不起作用。
  • @rdas 使用docker inspect <container id> | grep "IPAddress" 获取 IP,并将 localhost 替换为我在应用程序中获取的 IP,但应用程序仍然无法连接到数据库。

标签: docker devops


【解决方案1】:

您可以使用容器的名称(即mysql-container)连接到 mysql。示例:

运行mysql容器:

docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=db -p 3306:3306 -d --net my-network mysql

使用mysql 客户端从另一个容器连接:

docker run --net my-network -it mysql mysql -u root -p db -h mysql-container

在您的应用程序中,您应该将数据库 URL 中的任何 IP 替换为 mysql-container

【讨论】:

  • 好吧,我用docker inspect <container id> | grep "IPAddress" 获取了mysql-container 的IP,并将该IP 添加到应用程序而不是本地主机中。虽然,应用程序仍然无法连接到数据库
  • 为什么不直接用名字呢,可以通过app container来解决,让一切更灵活。
  • 如果您建议直接在数据库 URL jdbc:mysql://mysql-container:3306/db 中将 IP 替换为容器的名称,那么一旦应用程序启动,就会抛出以下异常:Caused by: java.net.UnknownHostException: mysql-container
  • 你能成功运行我的回答@THE Waterfall 中的第二个命令吗?
  • 是的,我绝对可以
【解决方案2】:

嗯,经过进一步研究,我成功连接到数据库。

我使用的方法如下: 在我的主机上,我获取了 docker 本身的 IP 地址,但没有获取特定容器: sudo ip addr show | grep docker0

docker0 的 IP 地址我添加到我的应用程序内的数据库连接 URL 中,因此应用程序设法连接到数据库 (注意:在这个流程中,我不添加 --net 关键字时启动容器)

绝对奇怪的是,即使为两个容器添加像 --net=my-nework 这样的共享网络也不起作用。此外,我确实尝试使用--net=host 与容器共享主机网络,但仍然不成功。如果有任何人可以解释为什么它不能工作,请 - 分享你的知识。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 2019-07-19
    • 2016-09-22
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 2020-05-30
    相关资源
    最近更新 更多