我能否将Docker端口仅映射给另一个Docker容器(而非主机)?

3

是否有可能将一个Docker容器的端口暴露给另一个(或多个)Docker容器,而不暴露给主机?

2个回答

6

是的,您可以将容器链接在一起,并且仅为这些链接的容器公开端口,而无需将端口导出到主机。

例如,如果您有一个运行postgreSQL数据库的Docker容器:

$ docker run -d --name db training/postgres

你可以链接到另一个正在运行你的Web应用程序的容器:
$ docker run -d --name web --link db training/webapp python app.py

运行您的Web应用程序的容器将有一组环境变量,其中包含数据库容器中暴露的端口,例如:

DB_PORT_5432_TCP_PORT=5432

根据容器名称创建环境变量,在本例中容器名称为db,所以环境变量以DB开头。

您可以在此处找到更多关于docker文档的详细信息:

https://docs.docker.com/v1.8/userguide/dockerlinks/


1
这还会暴露环境变量。有没有办法避免暴露环境变量? - r.v
我认为这是不可能的。根据文档:警告:重要的是要理解,所有来自Docker容器内部的环境变量都会对链接到它的任何容器可用。如果其中存储了敏感数据,这可能会带来严重的安全隐患。 - Alex da Silva
@r.v 我认为你可以通过使用--net而不是容器链接来解决这个问题。 - Thilo
@Thilo 是的,新的 --net 选项允许定义自定义网络。仅适用于 Docker 1.9 及以上版本。 - r.v
只是对我的评论进行澄清:--net选项早就存在了。但是现在可以使用docker network create来创建新的网络。 - r.v

2
我发现了一种替代容器链接的方法:您可以定义自定义“网络”,并使用--net选项告诉容器使用它们。
例如,如果您的容器本来就打算一起部署,您可以让它们共享相同的网络栈(使用--net container:oneOfThem)。这样,您甚至不需要配置主机名来使它们互相发现,它们可以共享相同的127.0.0.1,而且没有任何东西暴露给外部。
当然,这样它们会将所有端口都暴露给彼此,并且您必须小心不要发生冲突(例如,它们不能同时运行8080)。如果这是一个问题,您仍然可以使用--net,只是不要共享同一网络栈,而是设置更复杂的覆盖网络。
最后,--net选项也可用于让容器直接在主机网络上运行。
非常灵活的工具。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接