我正在编写两个容器,其中一个使用Web服务,另一个使用数据库。
这里是我撰写的文件:无法与群集内的Docker容器和主机连接
version: '3.3'
services:
web:
image: microsoft/aspnetcore:1.1
container_name: web
ports:
- 5555:80
links:
- db
db:
image: microsoft/mssql-server-linux:rc1
container_name: db
ports:
- 1533:1433
environment:
- "ACCEPT_EULA=Y"
- "MSSQL_SA_PASSWORD=MyAdminPwd2017"
- "MSSQL_PID=Developer"
所以,从我的asp.net应用程序的核心在web
服务运行,我可以在db
只是用db
作为主机访问数据库。但db
是不可见的从主机(我有一个默认桥网络)。如果我检查运行的db容器并找到它的ip地址,我可以从主机访问我的数据库,然后我可以连接到<ip>,1533
。
问题是,web
容器和主机都使用存储访问数据库凭据的文件。所以我需要一种方法来命名db
,所以我可以从两个世界访问(在群体内外,从我的主机)
有没有办法实现这一点?我尝试在我的docker-compose
文件中定义一个主机网络,并使两个服务都使用该网络,但我收到一条消息,说只有一个主机网络可以定义。
编辑:试图改善问题的标题,但我还是不相信,改进欢迎
从您的主机,您可以使用Access数据库“本地主机:<暴露端口>”。您可以在主机中创建一个别名,从“localhost:”到“db”。这会帮助你吗?通过建立主机网络,您不会受益于容器网络隔离。 –
Sreeni
谢谢,通过在我的主机(Windows)中创建别名,您的意思是在'C:\ Windows \ System32 \ drivers \ etc \ hosts'中创建一个条目,对吧?我真的不喜欢这样做。如果我不关心容器网络隔离并且希望容器和主机位于同一网络中,该怎么办?我可以做到吗? – sebagomez
在Docker内部,dns解析发生在Docker引擎的容器中,并为未解析的名称使用外部dns服务器。主机不知道Docker引擎的DNS数据库。在你的情况下,你希望容器和主机具有相同的数据库的DNS数据库。最简单的方法是主机别名,这似乎不适合你。我能想到的一种方式是使用外部DNS服务器(如consul)并将容器中的服务发布到外部服务器,并使容器和主机都使用该DNS服务器。 – Sreeni