如何配置Docker容器,让主机与其他容器共用数据库连接串?
同一连接串访问Docker容器化数据库的解决方案
需求与场景
- 希望主机和其他Docker容器能使用同一连接串访问运行在Docker容器中的数据库
- 具体场景:
- 有一个Docker化应用,依赖外部数据库
- 数据库通过以下命令运行在Docker容器:
docker run --name postgres --env=POSTGRES_PASSWORD=password postgres - 应用既可能在主机直接运行,也可能通过
docker run --name myapp myapp命令以容器方式运行
- 当前连接串示例:
ConnectionString: "Host=127.0.0.1;Port=5432;Database=postgres;Password=password",
- 问题:能否通过配置容器实现上述需求?连接串中的Host字段应设为多少?
实现方案:使用Docker自定义网络
完全可以实现,具体操作步骤如下:
1. 创建自定义Docker网络
先创建一个用户自定义网络(示例命名为app-network):
docker network create app-network
2. 重启Postgres容器并加入自定义网络
如果原有Postgres容器正在运行,先停止并删除它,再用以下命令启动,将其加入刚创建的网络:
docker run --name postgres --env=POSTGRES_PASSWORD=password --network=app-network --publish=5432:5432 postgres
--network=app-network:让数据库容器加入自定义网络,实现容器间的DNS解析--publish=5432:5432:保留端口映射,确保主机能访问数据库
3. 启动应用容器时加入同一网络
运行应用容器时,同样指定加入这个自定义网络:
docker run --name myapp --network=app-network myapp
4. 统一的连接串配置
此时主机和应用容器可以使用完全相同的连接串,其中Host字段设为数据库容器的名称postgres:
ConnectionString: "Host=postgres;Port=5432;Database=postgres;Password=password",
原理说明
- 在Docker自定义网络中,容器之间支持通过容器名直接解析到对应IP,所以应用容器能通过
postgres直接访问数据库 - 主机端如果无法直接解析
postgres这个主机名,只需在本地hosts文件中添加一行127.0.0.1 postgres,就能让主机通过postgres这个Host名访问到映射的数据库端口
内容的提问来源于stack exchange,提问作者Liero
相关产品推荐
相关产品推荐

