我正在尝试将我的应用程序连接到均已容器化的Sql Server Express数据库。
当我在与数据库不同的VM中运行我的应用程序容器时,它可以连接并且一切都很好。 但是,如果应用程序容器与数据库容器在同一虚拟机上运行,则无法连接。
我尝试将网络模式设置为主机,但仍然没有。
作为学习的一部分,我进行了非常简单的设置。 下面的设置图。
模型A:从Vm到VM-连接正常
模型B:内部VM-无法连接,因此应用失败
我一直在研究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
答案 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/