首页 > 解决方案 > 容器:在同一 VM 中访问数据库失败

问题描述

我试图让我的应用程序连接到 Sql Server Express DB,它们都是容器化的。

当我在一个单独的虚拟机中运行我的应用程序容器到数据库时,它会连接并且一切都很好。但是,如果应用容器与数据库容器在同一虚拟机上运行,​​则无法连接。

我尝试将网络模式设置为主机,但仍然没有。

作为学习的一部分,我得到了一个非常简单的设置。设置图如下。

模型 A:Vm 到 VM - 连接工作

A 型 - 虚拟机到虚拟机

模型 B:内部虚拟机 - 无法连接,因此应用程序失败

在此处输入图像描述

我一直在阅读 docker (运行简单的 docker setup)来尝试找出问题,但到目前为止还没有运气。

我也使用 docker-compose 来尝试帮助仍然没有运气。

编辑 1: 使用的命令。

SQL Server:根据 docker hub 说明

docker run --restart always -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=RANDOMPASS01!' -e 'MSSQL_PID=Express' -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest-ubuntu 

应用程序A

这本身在模型 A 中运行良好

docker run -p 5000:80 -d appa:0.1

我也试过

docker run -p 5000:80 --network host -d appa:01

标签: dockercontainers

解决方案


对于我所看到的,只要您使用 localhost 连接到数据库,您正在执行的操作(使用 net=host 启动您的应用程序容器)应该可以正常工作。

如果这只是为了在您的本地机器上进行测试,我建议在它们自己的 docker 网络中启动两个容器并通过容器名称访问数据库,您可以手动执行或使用 docker-compose 执行此操作。

docker-compose 示例:

version: '3'
services:
  db:
    image: mcr.microsoft.com/mssql/server:2017-latest-ubuntu
    ports:
      - 1433:1433
    environment:
      - MSSQL_PID=Express
      - SA_PASSWORD=RANDOMPASS01!
      - ACCEPT_EULA=Y
    restart: always
  app:
    # You can use this to tell docker-compose to build the image of you app
    # or use a prebuilt image like the db service is using
    image: appa:0.1
    ports:
      - 5000:80

将它放在一个名为 docker-compose.yml 的文件中,并使用以下命令启动它:

docker-compose up

这将在同一个网络中创建两个容器,这将为您提供每个容器的 DNS 记录以及 docker-compose 文件中提供的服务的名称,因此您可以使用“db”而不是使用 IP 或 localhost或“应用程序”。

docker-compose 的更多信息:https ://docs.docker.com/compose/overview/

手动方式:

docker network create mynetwork

在网络中运行容器:

docker run -p 5000:80 -d --net=mynetwork --name app appa:0.1
docker run --restart always -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=RANDOMPASS01!' -e 'MSSQL_PID=Express' -p 1433:1433 --net=mynetwork --name db -d mcr.microsoft.com/mssql/server:2017-latest-ubuntu

与使用 docker-compose 一样,您可以使用 docker 根据容器名称创建的“db”dns 记录来访问 db。

上述 DNS 记录只能在容器内解析。

有关用户定义网络的更多信息:https ://docs.docker.com/network/bridge/


推荐阅读