容器:访问同一虚拟机中的数据库失败

时间:2019-04-12 03:39:25

标签: docker containers

我正在尝试将我的应用程序连接到均已容器化的Sql Server Express数据库。

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

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

作为学习的一部分,我进行了非常简单的设置。 下面的设置图。

模型A:从Vm到VM-连接正常

Model A - VM to VM

模型B:内部VM-无法连接,因此应用失败

enter image description here

我一直在研究docker(运行简单的docker安装程序)以尝试找出问题所在,但到目前为止还没有运气。

我还使用了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 

AppA

这本身在模型A中可以正常工作

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

我也尝试过

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

1 个答案:

答案 0 :(得分:0)

只要您使用本地主机连接到数据库,就可以看到我正在执行的操作(使用net = host启动应用程序容器)应该没有问题。

如果这仅是为了在您的本地计算机上进行测试,建议您在自己的docker网络中启动两个容器并按容器名称访问db,您可以手动执行操作,也可以使用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文件中提供所提供服务的名称,因此您无需使用IP或本地主机“ db”或“ app”。

有关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记录来访问数据库。

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

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