我在主机上运行2个Docker容器。在我的第一个容器中,我这样开始:
docker run -d --name site-a -p 127.0.0.1:3000:80 nginx
这将端口80映射到主机的端口3000.它还有一个名为site-a
的名称,我想在另一个容器中使用它。
然后在我的另一个容器中,它是一个主反向代理容器,我配置了nginx的配置,让上游指向第一个容器(site-a
):
upstream my-site-a {
server site-a:80;
}
然后我以这种方式运行反向代理容器:
docker run -d --name reverse-proxy -p 80:80 nginx
这样我的反向代理容器将从site-a
容器中提供。
但是,这里有两个问题:
当我使用server site-a:80;
时,我的nginx配置中的上游不起作用。我怎样才能得到
nginx解析别名" site-a"到site-a
容器的IP?
当启动site-a container时,我在here处回答了问题
并将其绑定到主机的端口3000:-p 127.0.0.1:3000:80
这是否必要?
答案 0 :(得分:2)
为了使您的容器可以通过其名称互相访问,您需要将它们添加到同一网络。
首先使用此命令创建网络:
docker network create my-network
然后,在运行容器时,添加--network
标志,如下所示:
docker run -d --name site-a -p 127.0.0.1:3000:80 --network my-network nginx
当然,你需要对两个容器做同样的事情。
根据您的第二个问题,只要您不想直接从主机访问-p
的容器,就无需使用site-a
标记在主机上映射端口。
当然,您仍需要在反向代理容器上使用-p
标志,以使其可以访问。
答案 1 :(得分:0)
如果将多个容器组合到更复杂的基础架构中,则需要转向更复杂的技术。基本上你可以选择docker-compose和docker stack。 Kubernetes也可以选择,但它更复杂。
这些技术为容器发现和内部名称解析提供了解决方案。
我建议使用docker stack。而不是撰写它除了docker之外没有其他要求。