java - Docker 容器只能使用内部 IP/端口访问在另一个容器中运行的 MSSQL
问题描述
我使用以下 docker run 命令部署了一个非常简单的 MSSQL docker 容器:
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=NotYourBusiness" -p 2433:1433 --name sql1 -d mcr.microsoft.com/mssql/server:2017-latest
我的机器上安装了 SSMS,我可以使用以下 URL 连接到此实例:
MyHostName,2433
我还可以使用以下连接字符串从我的机器上运行我的 spring boot 应用程序:
dataSource.setJdbcUrl("jdbc:sqlserver://localhost:2433;database=SomeDatabase;");
在 docker 容器中只有 MSSQL,我的应用程序可以在我的机器上完美运行。
现在,我也想将我的 Spring Boot 应用程序放入容器中。因此,我构建了以下 docker 文件:
FROM openjdk:11-jre-slim
VOLUME /tmp
EXPOSE 8082
ADD target/tno-1.0.jar tno-1.0.jar
ENTRYPOINT ["java","-jar","tno-1.0.jar"]
这是我用来创建图像的构建命令:
docker build -f Dockerfile -t tno .
这是我用来构建容器的命令:
docker run -t --name tno --link sql1:mssql -p 8082:8082 tno
使用在我的机器上工作的相同连接字符串,spring boot 应用程序无法以连接被拒绝错误启动。我确实看过很多帖子,他们指出“本地主机”一词在从容器运行时不再真正适用,因为它仅指该容器。我能够使其工作的唯一方法是将 localhost:2433 替换为容器 IP 地址:1433。
这是完全可以接受的,但是有没有办法让容器像我的开发机器一样运行,并且能够连接到另一个容器,就好像连接来自外部世界一样?
谢谢
解决方案
如果您可以从运行在其他容器中的应用程序访问数据库,请尝试将您的 jdbc url 从 localhost 配置为 mssql(db 链接的名称)。
jdbc:sqlserver://mssql:2433;database=SomeDatabase
;
让我知道或检查一下如何在 docker 中链接容器?
推荐阅读
- shell - 使用 awk 和 gensub 删除以“字符+数字+S”结尾的字符串中的部分
- node.js - Heroku 上带有 Node.JS 和 Create-React-App BuildPack 的 413(请求实体太大)
- node.js - 调用 Node 8.10 Lambda 时 JSON 无效
- java - spring 如何在编译时加载任何属性文件?
- amazon-web-services - 如何在 AWS CLI S3 中设置权限?
- angular - 如何在Angular 6中使用api响应将mat-checkbox设置为选中和未选中
- git - 与 Perforce 相比,分支之间的 Git 合并编辑
- python - 将散点图分配给特定箱时出错
- python - LSTM模型的随机性
- html - CSS无法设置单选按钮之间的边框