连接到暴露的docker集装箱

我试图向外界展示一个docker集装箱,而不仅仅是主机。 当我从一个基本的CentOS镜像创build镜像时,它看起来像这样:

# 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查看容器时,我看到Ports:

 0.0.0.0:49154->22tcp 

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

编辑:

我已经尝试检查容器的IP地址,我看到IPAddress:172.17.0.28,但我不能ping或者…

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

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

我试图通过ssh -l root -p 49154 10.211.55.1 ssh进入,我得到了

 Read from socket failed: Connection reset by peer. 

UPDATE

你的Dockerfile是错误的。 你的sshdconfiguration不正确,启动不正确,这就是容器没有正确响应端口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地址(可从networking访问),并且需要通过此IP地址连接到您的容器。 从/到docker0网桥的stream量应该默认转发到您的eth接口。

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

 cat /proc/sys/net/ipv4/ip_forward 

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

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

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

如果启用了IP转发function,则将从eth0接口接收的数据包转发到虚拟docker0接口。 发生魔法,并在正确的容器接收数据包。 请参阅Docker高级networking了解更多详细信息:

但是docker0并不是普通的接口。 它是一个虚拟的以太网网桥,可以在连接到它的任何其他networking接口之间自动转发数据包。 这使得容器可以与主机进行通信,也可以与其他主机进行通信。 每次Docker创build一个容器时,它都会创build一对“对等”接口,就像一个pipe道的两端 – 一个发送的数据包将被接收。 它给容器的其中一个对等体成为它的eth0接口,并在主机的命名空间中保留另一个具有唯一名称vethAQI2QT的对等体。 通过将每个veth *接口绑定到docker0桥,Docker创build一个在主机和每个Docker容器之间共享的虚拟子网。

您不能从主机外部ping 172.17.42.1,因为它是一个私有IP,所以只能在私有networking中访问,因为它是由运行docker容器的主机创build的,虚拟交换机docker0和docker集装箱,附有一个虚拟的接口桥到docker0 …

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

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