我试图将docker容器暴露给外部世界,而不仅仅是主机。当我从基础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
查看容器时,我看到Ports:
0.0.0.0:49154->22tcp
如果我在主机(ubuntu)上ifconfig
,我看到docker0 inet addr:172.17.42.1。我可以从我的主机ping这个,但不能从任何其他机器ping。在设置容器以查看外部世界时,我做错了什么?感谢。
编辑:
我已经尝试检查容器的IPAddress,我看到IPAddress:172.17.0.28,但我无法ping通...
如果我尝试使用nmap,那似乎会返回端口。那么这是否意味着它是开放的,如果我有ssh设置,我应该能够进入它?感谢。
nmap -p 49154 10.211.55.1显示端口已打开,并且服务未知。
我试图通过ssh -l root -p 49154 10.211.55.1 ssh in我得到
Read from socket failed: Connection reset by peer.
答案 0 :(得分:2)
<强>更新强>
您的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,在主机的命名空间中。通过绑定每一个 与docker0网桥的接口,Docker创建了一个虚拟子网 在主机和每个Docker容器之间共享。
答案 1 :(得分:0)
您无法从主机外部ping 172.17.42.1,因为它是私有IP,因此只能在专用网络中访问它,因为它是由您运行docker容器的主机创建的,虚拟交换机docker0和docker容器,它与虚拟接口连接到桥接器docker0 ...
此外172.17.42.1是桥接器docker0的ip,而不是docker实例的ip。如果你想知道docker实例的ip,你必须在其中运行ifconfig,或者你可以使用docker inspect
我不是端口映射方面的专家,但对我而言,这意味着要访问端口22上的docker容器,您必须连接到主机的端口49154,并且所有流量都将被转发。