zoukankan      html  css  js  c++  java
  • 配置远程连接容器内镜像(映射容器内系统的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

  • 相关阅读:
    beaglebone black教程1-ssh登录和新建一个账户
    入职南大富士通一周感想
    stm32的内存分配以及text、bss、data段的意思
    初识modbus
    使用github上面别人的pyqt4+pyserial代码的时遇到的问题
    在MDK V5.12.0环境下建立2440的裸机开发环境
    Eclipse 插件
    Using Notepad++ To Quickly Format XML
    批处理检测外部命令是否存在的模块
    springside4
  • 原文地址:https://www.cnblogs.com/philokami/p/12150739.html
Copyright © 2011-2022 走看看