我们利用的基础镜像是:centos7,所以在配置sshd的时候会遇见很多的大坑,很不幸,我已经全部踩到了。下面就来分享一下我的操作过程:
大致的流程分为三步:
1. 安装sshd-server并配置/etc/ssh/sshd.config文件
2. 配置/root/.ssh/config文件以跳过验证IP的过程
3. 启动sshd
由于我们操作的是docker container,其实我们可以将这些的配置过程写在Dockerfile中,在创建镜像的时候直接配置,我们也可以采用docker commit的方式来更新image。
安装sshd-server并配置/etc/ssh/sshd.config文件
安装openssh-server:利用yum指令来安装
yum install -y openssh-server
配置/etc/ssh/sshd.config文件:其中需要打开端口、监听地址、允许用户名密码登录,根据需要,我这里打开了允许root用户登录和免密码登录的配置。
sed -i "s/#Port 22/Port 22/g"/etc/ssh/sshd_config
sed -i "s/#ListenAddress0.0.0.0/ListenAddress 0.0.0.0/g" /etc/ssh/sshd_config
sed -i "s/#ListenAddress::/ListenAddress ::/g" /etc/ssh/sshd_config
sed -i "s/#PermitRootLoginyes/PermitRootLogin yes/g" /etc/ssh/sshd_config
sed -i "s/#PasswordAuthenticationyes/PasswordAuthentication yes/g" /etc/ssh/sshd_config
sed -i "s/#PermitEmptyPasswordsno/PermitEmptyPasswords yes/g" /etc/ssh/sshd_config
sshd启动以及遇到问题的解决方案
下面我们启动一下contianer中的sshd,如果您用serversshd start启动的时候,你就会踩到第一个坑,出现-bash: service: command not found错误,就算切换到root用户下面也不行,因为在/etc/sbin/下面就没有server,如果您用systemctlstart sshd来启动sshd,那么就会遇到Failed to get D-Bus connection: Operation not permitted的问题,在这个时候我们可以采用的方法是在启动docker的时候利用如下的指令:
docker run -d -e "container=docker" --privileged=true -v /sys/fs/cgroup:/sys/fs/cgroup 221bb83b0bbe /usr/sbin/init
但是很明显,他需要挂载主机上的卷,并且启动init的命令,这很有可能会影响我们Dockerfile中的CMD的命令,所以,在这里我建议使用 /usr/sbin/sshd的启动方式,但是,很快我们就会遇见第二个坑,也就是会出现
error: Could not load host key: /etc/ssh/ssh_host_rsa_key
这样的错误,也就是sshd的守护进程不能加载主机密钥,这是因为主机密钥没有自动生成,所以我们可以利用/usr/bin/ssh-keygen –A指令来生成主机密钥,然后再利用/usr/sbin/sshd来启动sshd。
目前为止,我们可以在container中启动sshd并且外面的client端可以利用ssh登录上来,但是,很快我们又会遇见另一个问题,当我们把container rm掉的时候,再次启动,我们从相同的client端登录就会出现无法登陆的情况,也就是会出现这样的错误:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
50:e6:cb:58:bc:b7:a3:f6:e8:8f:46:a7:c1:5f:c2:df.
Please contact your system administrator.
Add correct host key in /root /.ssh/known_hosts to get rid of this message.
Offending key in /root/.ssh/known_hosts:7
RSA host key for 192.168.0.4 has changed and you have requested strict checking.
Host key verification failed.
这是因为主机在检查IP密钥的时候发生冲突了,我们可以手动的到/root /.ssh/known_hosts的目录下面进行手动删除,但是这很不符合调度的自动户的策略,所以,我们需要配置/root/.ssh/config文件以跳过验证IP的过程。
配置/root/.ssh/config文件以跳过验证IP的过程
mkdir -p /root/.ssh
touch /root/.ssh/config
echo "StrictHostKeyChecking no" > /root/.ssh/config
sed -i "a UserKnownHostsFile /dev/null" /root/.ssh/config
简单的说,在/root/.ssh/condfig中添加两句配置语句即可,然后我们再次按照上面的方法启动sshd,我们就可以跳过IP检查并且无密码登录了。
注:一般情况下,我们会写一个死循环让docker container一直保持运行不退出。然后在启动的时候,利用指令:
docker run -d -p 222:22 a:v1
令docker container在后台运行着,并且我们将22端口映射到主机的222端口,也就是说,我们在登录的时候就可以采用:ssh –p 222 XXX(主机IP)的方式来登录。
以上过程均来自个人亲身体验,如有问题,欢迎大神们提出指导。