Docker中使用ssh远程管理容器

要创建一个带有SSH服务的镜像,有两种创建容器的方法:

1.基于docker commit命令创建

{

原理:开通容器的ssh,把容器的22端口映射到宿主机的特定端口,

docker commit :从容器创建一个新的镜像。

语法:

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS说明:

-a :提交的镜像作者;

-c :使用Dockerfile指令来创建镜像;

-m :提交时的说明文字;

-p :在commit时,将容器暂停。

实例:

第一步,扒拉一个ubuntu镜像,并且创建容器

[root@huangxv ~]# docker pull ubuntu:18.04

[root@huangxv ~]# docker run -it ubuntu:18.04 bash

root@561327aa197b:/#

第二步,检查更新软件包缓存

root@561327aa197b:/# apt-get update

有可能要一支烟的功夫,也可能要一包烟.....

第三步,安装ssh服务

root@561327aa197b:/# apt-get install openssh-server

在此会提示......Do you want to continue? 

是否进一步安装***插件,这里只是演示所以就不安装了

若要ssh正常启动,目录 /var/run/sshd必须存在。

root@561327aa197b:/# mkdir -p /var/run/sshd

root@561327aa197b:/# /usr/sbin/sshd -D &

查看容器的ssh端口

root@561327aa197b:/# netstat -tunlp

修改SSH服务的安全登录配置,取消pam登录限制:

root@561327aa197b:/# sed -ri 's/session required pam_loginuid.so/#session

            required pam_loginuid.so/g' /etc/pam.d/sshd

在root用户目录下创建.ssh目录,并复制需要登录的公钥信息(一般为本地主机用户目录下的.ssh/id_rsa.pub文件,可由ssh-keygen -t rsa命令生成)到authorized_keys文件中:

root@561327aa197b:/# mkdir root/.ssh

root@561327aa197b:/# vi /root/.ssh/authorized_keys

创建自动启动SSH服务的可执行文件run.sh,并添加可执行权限:

root@561327aa197b:/# vi /run.sh

root@561327aa197b:/# chmod +x run.sh

run.sh脚本内容如下:

        #! /bin/bash

        /usr/sbin/sshd -D

最后,退出容器:

root@561327aa197b:/# exit

exit

将所退出的容器用docker commit命令保存为一个新的sshd:ubuntu镜像。

$ docker commit fc1 sshd:ubuntu

        7aef2cd95fd0c712f022bcff6a4ddefccf20fd693da2b24b04ee1cd3ed3eb6fc

启动容器,并添加端口映射10022-->22。其中10022是宿主主机的端口,22是容器的SSH服务监听端口:

$ docker run -p 10022:22 -d sshd:ubuntu /run.sh

        3ad7182aa47f9ce670d933f943fdec946ab69742393ab2116bace72db82b4895

}

2.基于Dockerfile创建

{

1.创建工作目录

首先,创建一个sshd_ubuntu工作目录:

        $ mkdir sshd_ubuntu

        $ ls

        sshd_ubuntu

在其中,创建Dockerfile和run.sh文件:

        $ cd sshd_ubuntu/

        $ touch Dockerfile run.sh

        $ ls

        Dockerfile run.sh

2.编写run.sh脚本和authorized_keys文件

脚本文件run.sh的内容与上面一致:

        #! /bin/bash

        /usr/sbin/sshd -D

在宿主主机上生成SSH密钥对,并创建authorized_keys文件:

        $ ssh-keygen -t rsa

        ...

        $ cat ~/.ssh/id_rsa.pub >authorized_keys

3.编写Dockerfile

下面是Dockerfile的内容及部分的注释,可以对比上面利用docker commit命令创建镜像过程,所进行的操作基本一致:

        #设置继承镜像

        FROM ubuntu:18.04

        #安装 ssh 服务

        RUN apt-get install -y openssh-server

        RUN mkdir -p /var/run/sshd

        RUN mkdir -p /root/.ssh

        #取消pam限制

        RUN sed -ri 's/session required pam_loginuid.so/#session required

              pam_loginuid.so/g' /etc/pam.d/sshd

        #复制配置文件到相应位置,并赋予脚本可执行权限

        ADD authorized_keys /root/.ssh/authorized_keys

        ADD run.sh /run.sh

        RUN chmod 755 /run.sh

        #开放端口

        EXPOSE 22

        #设置自启动命令

        CMD ["/run.sh"]

4.创建镜像

在sshd_ubuntu目录下,使用docker build命令来创建镜像。这里注意在最后还有一个“.”,表示使用当前目录中的Dockerfile:

        $ cd sshd_ubuntu

        $ docker build -t sshd:dockerfile .

如果使用Dockerfile创建自定义镜像,那么需要注意的是Docker会自动删除中间临时创建的层,还需要注意每一步的操作和编写的Dockerfile中命令的对应关系。

命令执行完毕后,如果看见“Successfully built ***”字样,则说明镜像创建成功。可以看到,以上命令生成的镜像ID是570c26a9de68。

5.测试镜像,运行容器
下面使用刚才创建的sshd:dockerfile镜像来运行一个容器。
直接启动镜像,映射容器的22端口到本地的10122端口:

$ docker run -d -p 10122:22 sshd:dockerfile
890c04ff8d769b604386ba4475253ae8c21fc92d60083759afa77573bf4e8af1
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
890c04ff8d76 sshd:dockerfile "/run.sh" 4 seconds ago Up 3 seconds
0.0.0.0:10122->22/tcp high_albattani
在宿主主机新打开一个终端,连接到新建的容器:

$ ssh 192.168.1.200-p 10122
The authenticity of host '[192.168.1.200]:10122 ([192.168.1.200]:10122)' can't
be established.
ECDSA key fingerprint is d1:59:f1:09:3b:09:79:6d:19:16:f4:fd:39:1b:be:27.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.1.200]:10122' (ECDSA) to the list of known hosts.

root@890c04ff8d76:~#
效果与上一小节一致,镜像创建成功。

}

猜你喜欢

转载自www.cnblogs.com/hxlinux/p/12725857.html