2014-10-09 91 views
2

我试图向外界揭示码头集装箱,而不仅仅是主机。当我从一个基础的CentOS图像创建的图像,它看起来是这样的:连接到暴露的码头集装箱

# install openssh server and ssh client 
RUN yum install -y openssh-server 
RUN yum install -y openssh-clients 

RUN echo 'root:password' | chpasswd 

RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config 
RUN sed -ri 's/#UsePAM no/UsePAM no/g' /etc/ssh/sshd_config 

EXPOSE 22 
CMD ["/usr/sbin/sshd", "-D"] 

我运行这个形象,像这样:

sudo docker run -d -P crystal/ssh 

当我尝试一下容器sudo docker ps,我看到端口:

0.0.0.0:49154->22tcp 

如果我ifconfig主机(Ubuntu的),我看到docker0 INET地址:172.17.42.1。我可以从我的主机ping这个,但不能从任何其他机器。我在设置容器看外部世界时做错了什么?谢谢。

编辑:

我已经试过检查容器的ip地址,我看到ip地址:172.17.0.28,但我不能平,要么...

如果我尝试NMAP,这似乎返回港口。那么这是否意味着它是开放的,如果我有ssh设置,我应该能够ssh进入它?谢谢。

nmap -p 49154 10.211.55.1显示端口未知服务打开。

我试图通过SSH -l -p根49154 10.211.55.1以SSH方式,我得到

Read from socket failed: Connection reset by peer. 
+0

您是否尝试连接到端口49154上的主机的公共IP地址?我的意思是eth0接口的IP地址? – Jiri 2014-10-09 20:36:58

+0

@Jiri我尝试过'nmap -p 49154 '并且返回:'49155/tcp,open,service unknown' – Crystal 2014-10-09 21:01:10

回答

1

UPDATE

你Dockerfile是错误的。你的sshd配置不正确,启动不正确,这就是容器没有正确响应端口22的原因。请参阅错误:

Could not load host key: /etc/ssh/ssh_host_rsa_key 
Could not load host key: /etc/ssh/ssh_host_dsa_key 

您需要生成主机密钥。这条线路将做魔术:

RUN ssh-keygen -P "" -t dsa -f /etc/ssh/ssh_host_dsa_key 

以前的答案

你可能需要查看eth0接口的IP地址(即从网络访问),你需要通过此连接到您的容器IP地址。来自/去往docker0网桥的流量应该默认转发到您的eth接口。

此外,你最好检查是否启用了IP转发:

cat /proc/sys/net/ipv4/ip_forward 

这个命令应该返回1,否则你应该执行:

sudo echo 1 > /proc/sys/net/ipv4/ip_forward 

问:为什么你可以这种方式连接到容器?

如果启用了IP转发,则从eth0接口接收的数据包将转发到虚拟docker0接口。魔术发生并且包在正确的容器中被接收。请参阅Docker Advanced Networking了解更多详情:

但是docker0不是普通接口。它是一个虚拟以太网桥,它可以在连接到它的任何其他网络接口之间自动转发分组。这允许容器与主机通信并且彼此通信 。每次Docker创建一个容器时,它都会创建一对“对等”接口,如管道的相对两端,即 - 在另一个上发送的数据包将收到 。它使容器中的一个对等体成为它的eth0接口,并将另一个对等体与唯一的名称(如 vethAQI2QT)保持在主机的命名空间中。通过将每个 veth *接口绑定到docker0桥接器,Docker创建一个在主机和每个Docker容器之间共享的虚拟子网 。

+0

我将如何连接到eth0地址的容器的IP地址?假设码头的IP为172.17.42.5,eth0为10.211.55.1,那么我如何从外部连接?顺便说一下,我试图从码头文档中进行扫描。 (http://docs.docker.io.s3-website-us-west-2.amazonaws.com/examples/running_ssh_service/)。 ip_forward确实返回1. – Crystal 2014-10-09 20:56:04

+0

@Crystal您无法从外部连接到“容器IP地址”,但(仅)到eth0的特定主机端口的数据包将被转发到容器特定的端口。我已经更新了我的答案。 – Jiri 2014-10-09 23:19:17

0

您不能ping从主机之外172.17.42.1,因为它是一个专用IP,因此只能在专用网络中访问,因为它是由运行码头集装箱的主机创建的,虚拟交换机docker0和附加虚拟接口的桥接码头0的码头集装箱...

此外,172.17.42.1是网桥docker0的ip,而不是您的docker实例的ip。如果你想知道docker实例的ip,你必须在里面运行ifconfig,或者你可以使用docker inspect

我不是端口映射方面的专家,但在我看来,这意味着要访问Docker容器端口22必须连接到主机的端口49154,并且所有通信都将被转发。

+0

我更新了我的问题,但我试图从'inspect'命令ping ip,然后继续请求超时。 – Crystal 2014-10-09 20:27:14

+0

从外面你总是会得到请求超时的ping,因为它是一个私人地址。如果您运行另一个码头集装箱,则每个码头工都可以ping另一个码头集装箱,但是没有主机可以从外面ping它们。至于'ssh'命令,我认为Jiri的答案可能是解决方案。 – mgaido 2014-10-10 11:57:21