使用Docker创建一个ssh连接的容器
使用Dockerfile创建一个配置好sshd的镜像
-
创建工作目录
$ mkdir sshd_centos
$ cd sshd_centos
$ touch Dockerfile run.sh -
编写run.sh脚本和authorized_keys 文件
run.sh内容 (此处会产生问题,详情见文章最后的文字叙述)
#!/bin/bash
/usr/sbin/sshd -D
再宿主机上生成SSH密钥对,并创建authorized_keys 文件
在root用户目录下创建.ssh目录,并复制需要登录的公钥信息
(一般为本地主机用户目录下的.ssh/id_rsa.pub文件,可由ssh-keygen -t rsa命令生成)
在宿主机执行命令 ssh-keygen -t rsa 生成rsa的公私密钥对,密钥对命名为id_rsa.pub
密码设置为helloworld
$ cat ~/.ssh/id_rsa.pub > authorized_keys
(此时,在sshd_centos工作目录下有三个文件:run.sh、Dockerfile、authorized_keys) -
编写Dockerfile
FROM centos-zdx
MAINTAINER from xxxxxxx@qq.com
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"] -
创建镜像
$ cd sshd_centos
$ sudo docker build –t sshd:dockerfile . -
测试镜像,运行容器
$ docker run –d –p 10122:22 sshd:dockerfile
在宿主机新打开一个终端,连接到新建容器
$ ssh 192.168.136.130 –p 10122
$ yes
$ 输入rsa密码:helloworld
成功连接!
产生问题:
由于run.sh执行脚本中命令是/usr/sbin/sshd –D
会产生attach进入容器后就进入了这个命令的shell状态并且ctrl+c退出就会把容器停掉。所以要优化一下
方法如下:
将run.sh中/usr/sbin/sshd –D 末尾加上&符号 作用是启用sshd服务后退出shell状态,即/usr/sbin/sshd –D & wq保存退出,然后重新用Dockerfile创建镜像。
启动容器:
docker run -dit --name test sshd:dockerfile sh -c “/run.sh && /bin/bash”
XShell外部ssh连接docker容器:需要将~/.ssh/目录下的公钥文件id_rsa和id_rsa.pub 导出,用XShell连接时,输入宿主机ip以及与容器22端口相对应的宿主机大端口,登陆用户名root,然后选择使用公钥连接,并将公钥文件导入,输入rsa密码helloworld然后连接成功!