是否可以让主机打开Docker容器访问端口?具体来说,我让MongoDB和RabbitMQ在主机上运行,我想在Docker容器中运行一个进程来监听队列并(可选地)写入数据库.

我知道我可以将一个端口从容器转发到主机(通过-p选项),并从Docker容器内连接到外部世界(即互联网),但我不想将RabbitMQ和MongoDB端口从主机expose 到外部世界.

编辑:一些澄清:

Starting Nmap 5.21 ( http://nmap.org ) at 2013-07-22 22:39 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00027s latency).
PORT     STATE SERVICE
6311/tcp open  unknown

joelkuiper@vps20528 ~ % docker run -i -t base /bin/bash
root@f043b4b235a7:/# apt-get install nmap
root@f043b4b235a7:/# nmap 172.16.42.1 -p 6311 # IP found via docker inspect -> gateway

Starting Nmap 6.00 ( http://nmap.org ) at 2013-07-22 20:43 UTC
Nmap scan report for 172.16.42.1
Host is up (0.000060s latency).
PORT     STATE    SERVICE
6311/tcp filtered unknown
MAC Address: E2:69:9C:11:42:65 (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 13.31 seconds

我必须用这个小把戏才能用这个容器连接到互联网:My firewall is blocking network connections from the docker container to outside

EDIT:最终,我使用pipework创建了一个自定义网桥,并让服务在网桥IP上侦听.我采用了这种方法,而不是让MongoDB和RabbitMQ在docker网桥上侦听,因为它提供了更大的灵活性.

推荐答案

docker主机向所有容器公开一个适配器.假设你在最近的ubuntu上,你可以运行

ip addr

这将为您提供一个网络适配器列表,其中一个看起来像

3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 22:23:6b:28:6b:e0 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
inet6 fe80::a402:65ff:fe86:bba6/64 scope link
   valid_lft forever preferred_lft forever

您需要告诉rabbit/mongo绑定到该IP(172.17.42.1).之后,您应该能够从容器中打开到172.17.42.1的连接.

Linux相关问答推荐

Linux和Windows x86程序集调用约定

如何修复 script(1) 实用程序输出的换行符?

将所有列乘以一个常数

如何使用 sed 和 awk 命令提取模式?

如何拆分和计算 Bash 中单词的出现次数?

如何在 DolphinDB 中递归查找目录中的所有文件?

如何在ubuntu中通过.sh文件启动多个服务

如何在守护进程中使用 popen() 和 pclose() 获取通过管道执行的 shell 命令的正确退出代码?

Eclipse 的 C# 插件

Linux 应用程序分析

kdevtmpfsi 使用整个 CPU

使用特定目录作为根目录压缩目录的命令

bash 中的线程?

用于数据库备份的 Linux shell 脚本

如何自动化 HTML 到 PDF 的转换?

如何从 Linux 内核模块的 init_module 代码创建设备 node ?

linux perf:如何解释和查找热点

在 Linux 上更新 PyCharm

CentOS:在 PHP 安装中启用 GD 支持

如何限制堆大小?