【问题标题】:Unable to link two Docker containers on a custom bridge network on Windows无法在 Windows 上的自定义桥接网络上链接两个 Docker 容器
【发布时间】:2020-08-22 09:43:54
【问题描述】:

我希望两个 Docker 容器能够在运行 Docker Toolbox 的 Windows 机器上相互通信。我可以使用--link 选项链接容器;但是,如果我尝试在我创建的自定义桥接网络上运行容器,则容器无法相互通信:

这是我遵循的步骤:

docker network create web-application-mysql-network

docker run --detach --env MYSQL_ROOT_PASSWORD=somepassword--env MYSQL_USER=some-user --env MYSQL_PASSWORD=pass --env MYSQL_DATABASE=mydb --name mysql --publish 3306:3306 --network=web-application-mysql-network mysql:5.7

docker run -p 8080:8080 -d --network=web-application-mysql-network myrepo/mywebapp:0.0.1-SNAPSHOT

上面最后一个命令中的镜像包含作为基础镜像的 Tomcat Web 服务器 Docker 镜像和将托管在 Tomcat 中的“WAR”(Web 存档文件)。当我检查最后一个命令启动的容器的日志时,我可以看到以下错误:

Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

如果我使用--link 选项而不是在我的自定义桥接网络上运行它们,我可以毫无问题地链接这两个容器。

附加信息:我在我的 Web 应用程序代码中使用 localhost 作为 MySQL URL。使用--link时这似乎工作正常@

为了完成这项工作,我缺少哪些配置/命令参数?

【问题讨论】:

  • 要支持否决票,请告诉我如何改进这个问题。也许这可能是一个基本问题,也许我在这里遗漏了一些东西。也就是说,我确实提供了所有必需的信息,以便可以回答这个问题。想知道我可以如何改进吗?

标签: java mysql docker tomcat war


【解决方案1】:

当您使用网络时,您应该在 URL 中使用要连接的容器名称。换句话说,您必须在 mywebapp 中使用mysql 才能访问数据库。

我建议你检查一下 docker-compose,因为它可以让你避免手动创建网络。

这是一个例子:

version: "3"

services:
  mysql:
    image: mysql:5.7
    env_file:
      - db.env
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_USER: ${MYSQL_USER:-user}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_DATABASE: "mydb"
    volumes:
      - dbdata:/var/lib/mysql
  mywebapp:
    image: myrepo/mywebapp:${TAG_VERSION:-0.0.1-SNAPSHOT}
    build:
      context: ./mywebapp_location
      dockerfile: Dockerfile
    ports: 
      - "8080:8080"

volumes:
  dbdata:

db.env:

MYSQL_ROOT_PASSWORD=mysql_root_password
MYSQL_USER=the_user
MYSQL_PASSWORD=the_user_password

要构建,您可以简单地执行:

docker-compose build

简单地开始:

docker-compose up

其余的你可以使用普通的 docker 命令。

【讨论】:

  • 所以我应该使用 'mysql' 作为我的 Web 应用程序的 DB URL 中的主机名,而不是 localhost?
  • 是的...此外,您实际上并不需要发布 3306 端口(如果您没有从主机连接到 mysql)。您必须使用容器 ID 或容器名称(不是图像名称)。
  • 嗯。试图了解创建自己的网络并将两个容器与之关联的真正优势是什么?如果我仍然需要更改应用程序代码?我的理解是将这两个容器放在自定义桥接网络上以便它们可以使用 localhost 相互通信的全部意义?不是这样吗?容器在同一个桥接网络上运行,所以对于它们来说,它应该是 localhost?
  • 我想你可能会发现 docker 上的网络文档很有用:docs.docker.com/network/bridge
  • 无论如何考虑一个有大量 docker 容器使用相同端口的网络。弄清楚什么连接到哪里将是一个噩梦。桥接网络意味着 docker 容器没有严格的隔离
猜你喜欢
  • 2021-03-07
  • 1970-01-01
  • 2018-06-04
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多