配置远程连接容器内镜像(映射容器内系统的22端口到宿主机上)

Posted philokami

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了配置远程连接容器内镜像(映射容器内系统的22端口到宿主机上)相关的知识,希望对你有一定的参考价值。

本文仅作参考,针对容器的22端口映射问题展开讨论,解决问题为使用ssh连接服务器上的docker内的系统,其他docekr配置、服务器设置等不作赘述

原理简介

远程连接的使用一般是用被链接的主机的ip、端口、账号密码,有了这三样我们才可以连接到对方的主机上。

ip:一般是服务器的ip,这个一般可以得到。

端口:我们使用的连接时ssh协议的,默认端口时22。文件传输协议sftp端口也是22。这样我们只需要把22端口打开,正常的话一般都可以使用ssh和sftp来连接了。(没猜错的话sftp也是ssh的一小部分,ssh中的文件传输协议,待考察)

账号密码:这个是你自己设置的账号密码。(ubuntu正常情况下限制root用户远程登录的,所以最好新建一个远程登陆账户)

docker设置

我们再创建容器的时候,为了简单起见(调用GPU),一般会使用nvidia-docker来创建docker,以前的命令是这样的

nvidia-docker run -it -p 0.0.0.0:8881:[端口号] --name [容器名] --shm-size=8G [镜像] bash 

命令参数解释:

-i 表示 让容器的标准输入保持打开状态
-t 表示 为docker分配一个伪终端并绑定到容器的标准输入上
-d 表示 后台运行
-p 0.0.0.0:8881:[端口号] 表示 设置端口映射 大概是将宿主机的端口号(未写)映射到docker容器中的8881端口上去(这个地方最好不要这么使用,建议使用下边的那条nvidia-docker命令,以前没有问题的,现在不知为什么就出问题了,在下边给出现在使用的端口映射)
--name [容器名] 表示 容器的名字,自己设置的,别忘了容器名包括REPOSITORY和TAG,格式:REPOSITORY:TAG
--shm-size=8G 表示 设置容器的显存使用 限制为8G
[镜像] 表示 从网上拉取的系统镜像文件
bash 暂未知

以上是仅仅使用jupyter的容器配置,但是我们想的是能使用ssh访问容器内的系统,如果尝试使用我上个命令分配的端口的话,根本无法登陆进去,因为那个端口是jupyter的,我们用ssh连接的话根本无法使用。

但是如果是再这个宿主机上使用ssh连接容器内的系统,发现使用容器内系统的ip是可以进行连接的,所以这就需要使用端口映射。将容器内的系统的ssh服务映射到宿主机上,那么只要是我们一访问宿主机的这个端口,那个他就会自动连接到容器内的那个端口上,那么就是使用ssh连接到了容器内的系统上。 上一句话基本都是废话,举个例子吧,我们先假装将容器内的系统叫做内系统,将宿主机系统叫做外系统。22端口是ssh的端口,我理解为服务入口,访问这个端口就相当于使用ssh服务,如果将内系统的22端口映射到了外系统的9001端口上,那么在访问外系统的9001端口的时候,就相当于访问了内系统的22端口,就相当于在访问外系统的9001端口的使用远程连接了内系统。所以这是我们将端口进行映射的目的。

所以要想能远程连接服务器上的容器内的系统,上边的命令就要加上22端口的映射,变成下边这种:

nvidia-docker run -it -p [端口号1]:8888 -p [端口号2]:22 --name [容器名] --shm-size=8G [镜像] bash

这里 -p 参数和上边不一样了,网上查的都是这种写法,冒号前的 [端口号] 是需要映射到的宿主机的端口,冒号后的 8888 是容器内系统的我们需要的服务的端口,在这里将22映射到了“端口号2”所示的端口上。

注意:
1.这个端口可以映射多个,一般都是在创建容器的使用进行映射,这是简单的方法,还有一种是修改docker的文件,我感觉挺麻烦就没有尝试。
2.如果说我现在已经是正在使用着这个容器,没有创建怎么办?
那么就需要将容器先停下来

docker stop [你现在这个容器名]

打包容器现在这个镜像

docker commit [你现在这个容器名] [自己起一个容器镜像名字]

这个打包好的镜像可以查看

docker images

使用自己打包好的这个镜像创建容器(上边那个nvidia-docker命令)

nvidia-docker run -it -p [端口号1]:8888 -p [端口号2]:22 --name [容器名]:latest --shm-size=8G [镜像] bash

建议在使用端口的时候用命令查查看看端口是否被占用

netstat -ap | grep [端口号]

如果没有显示东西因该就是可以使用,端口号不要占用1024以内的,否则可能问题

测试

那么这样创建好了docker之后,便可以直接使用命令将docker启动,启动完之后如果想要远程连接需要打开ssh服务

service ssh start

我从网上查的想开机自启动设置呢,可是docker的启动docker的方式和linux的开机启动方式好像不一样,他不像是linux开机时需要自检很多文件,我猜他是直接保存的缓存文件,否则怎么会当运行

docker start [name]

时,马上就能起来系统?(如有大佬看过docker的原理请告知,小弟现在这谢谢了)因此开机自启动ssh服务就这么搁置了,不过基本上正常情况下应该不会关机吧?如果关机也只能进去宿主机,进入docker,再打开服务了。

撤多了,回到上边打开服务这,当服务打开了,基本就可以连接了,使用宿主机的ip,端口是映射到宿主机的那个端口,那个自己设置的 [端口号2]

ssh 172.123.4.88:9001

(这里假设宿主机ip是172.123.4.88,ssh服务映射端口是9001,就是上边的那个 [端口号2] )

参考:
https://www.cnblogs.com/kingsonfu/p/11578073.html
https://www.linuxidc.com/Linux/2016-01/127345.htm

以上是关于配置远程连接容器内镜像(映射容器内系统的22端口到宿主机上)的主要内容,如果未能解决你的问题,请参考以下文章

Docker网络基础配置

如何查看docker 容器目录

Docker基础 :网络配置详解

Docker-端口映射

vscode 远程连接 docker 容器进行 C++ 代码调试实践

docker 容器修改端口