docker - 容器:在同一 VM 中访问数据库失败
问题描述
我试图让我的应用程序连接到 Sql Server Express DB,它们都是容器化的。
当我在一个单独的虚拟机中运行我的应用程序容器到数据库时,它会连接并且一切都很好。但是,如果应用容器与数据库容器在同一虚拟机上运行,则无法连接。
我尝试将网络模式设置为主机,但仍然没有。
作为学习的一部分,我得到了一个非常简单的设置。设置图如下。
模型 A:Vm 到 VM - 连接工作
模型 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
解决方案
对于我所看到的,只要您使用 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/
推荐阅读
- python - Python中的交互式矩阵输入(类似于R Shiny中的shinyMatrix)
- swift - 同一表格视图中具有不同高度的两个不同单元格RXSwift
- winapi - 如何获得监视器重新激活的通知?再次打开监视器时,我没有收到 WM_SYSCOMMAND 消息
- linux - 约塔数据库。无法访问全局目录
- ffmpeg - 我们如何为 FFMPEG 库编写复杂的命令,以获取视频的确切帧数
- javascript - Sveltekit 客户端导入 TypeError:EasyMDE 不是构造函数并且未定义要求
- azure - Azure 托管标识和 Terraform 在 AzureUSGoverment 中不起作用
- javascript - Redux 减速器功能不起作用。状态仍未定义
- c++ - C++ & .NET,垃圾指针
- flutter - 运行返回很长列表的函数时,Dart 隔离非常慢