docker - 如何设置 docker 容器以通过主机名相互引用?
问题描述
我有 2 个 docker 容器(1 个用于数据库,1 个用于应用服务器)。应用程序代码在连接字符串中有数据库的主机。我希望能够在不修改任何代码(包括连接字符串/主机配置)的情况下运行该应用程序。
我的想法是在应用容器上的 /etc/hosts 文件中添加一些内容,以便数据库主机解析到另一个容器,但不确定我可以设置什么 IP 地址。每次我创建容器时,IP 都可能不同,对吗?下面的作品有点,但我需要一些更永久的东西。
172.23.0.2 database.mycompany.com
如果我可以在 /etc/hosts 中指定类似的内容会很酷
db-container-name database.mycompany.com
编辑:很多非常有用的评论,但遗漏的一件事是我在代码库中有一个连接字符串,我不想更改代码:
<New class="oracle.jdbc.pool.OracleDataSource">
<Set name="URL">jdbc:oracle:thin:@db.mycompany.com:1532:SVC</Set>
</New>
如果我想使用容器名称,我必须将上面的配置更改为容器名称。我已经测试过并且它可以工作,但我无法检查它所以我需要一些不会改变代码的东西。下面提到的静态 IP 地址选项可能是我最好的选择,一旦我可以测试它就会确认答案。
解决方案
这是示例 docker-compose.yml。
检查下面的静态 IP 分配:
version: '3.8'
services:
nginx: <- DNS Name
image: nginx
container_name: qs
restart: always
ports:
- 80:80
volumes:
- ~/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- server01
networks:
nginx:
ipv4_address: 10.1.1.10 <- Static IP
networks:
nginx:
driver: bridge
ipam:
config:
- subnet: 10.1.1.0/24 <- Static IP subnet
这样就可以消除动态IP的问题
您可以创建多个网络并根据您的连接要求进行分配。
networks:
nginx:
driver: bridge
ipam:
config:
- subnet: 10.1.1.0/24
db:
driver: bridge
ipam:
config:
- subnet: 10.0.0.0/24
像这里你可以看到有 2 个网络,我如何使用这是我的应用程序容器和 nginx 在 nginx 网络上,我的 db 和应用程序在 db 网络上。所以我的客户只能通过 nginx 访问我的应用程序来访问我的数据库。并且不需要为 db 打开端口到主机,因为容器到容器的连接不需要打开端口。
推荐阅读
- sql - 为什么 SET ANSI_WARNINGS ON 应该与 XML 方法一起使用?
- .net - 为什么 Perfview 不显示提供者名称、事件名称和消息?
- laravel - [Vue 警告]:编译模板时出错:表达式无效:markdown('') 中的标记无效或意外。htmlentities 问题?[标记的.js]
- java - 不会在 SD 卡中创建文本文件
- amp-html - AMP extraUrlParams 在内部发送数据
- java - 无法实例化类型
- mongodb - 如果主节点仍然处于活动状态,副本集中的辅助节点可以从另一个辅助节点复制数据吗?
- python - 在 Python dev_appserver.py 开发服务器未启动
- apache-spark - 如何在 zeppelin 集群上使用 spark master?
- php - 如何从周数创建日期时间