启动sshd服务
当我们使用CentOS 7 版本的基础镜像开启一个容器,安装sshd服务后,却无法启动它。这时因为CentOS 7 版本的基础镜像中时没有"/etc/init.d/sshd"启动脚本的,从而也就无法初始化sshd服务,所以需要我们手动初始化sshd服务。
1、启动一个docker容器
[root@client ~] # docker container run -it --name=centos_v2 f4e8037197c8
#f4e8037197c8 :是我pull下来的centos 7.5版本的基础镜像ID
这样就会新建一个docker容器,并且进入容器的bash中
2、安装sshd
[root@63c24a4a5e98 /]# yum -y install openssh-server -y
3、启动sshd服务
[root@63c24a4a5e98 /]# /usr/sbin/sshd -D
报错:
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key
此时吗,依次执行下列命令:
[root@63c24a4a5e98 /]# ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ""
[root@63c24a4a5e98 /]# ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ""
[root@63c24a4a5e98 /]# ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
4、手工生成密钥对
[root@63c24a4a5e98 /]# ssh-keygen -t rsa -P '' -f /root/.ssh/id_rsa //因为前面已经使用"rsa"算法生成过密钥对,这里使用-P参数,将前面的密钥对直接应用于"/root/.ssh"路径下即可
[root@63c24a4a5e98 .ssh]# cat id_rsa.pub >> authorized_keys //手动生成密钥验证文件
[root@63c24a4a5e98 .ssh]# chmod 0600 authorized_keys
5、修改sshd配置文件
[root@63c24a4a5e98 /]# vi /etc/ssh/sshd_config
UseDNS no
6、修改PAM验证
[root@63c24a4a5e98 /]# cd /etc/pam.d
[root@63c24a4a5e98 pam.d]# sed -i '/pam_loginuid.so/d' /etc/pam.d/sshd //删除pam_loginuid.so模块验证
#pam_loginuid.so模块: session类型 用来设置已通过认证的进程的uid.以使程序通过正常的审核(audit).
#PAM是一种验证机制,大家有兴趣可自行百度
7、修改root用户密码,ssh远程登录时要用
[root@63c24a4a5e98 /]# echo 'root:123456' | chpasswd
8、提交成新的镜像
[root@63c24a4a5e98 /]# exit //退出容器
[root@client ~] # docker commit 63c24a4a5e98 cxs_sshd:v1
#63c24a4a5e98:容器名称
#cxs_sshd:v1:新的镜像名称和版本号
9、测试
[root@client ~] # docker run -it --name=centos_sshd e1b50411ef32 //以新的镜像启动容器
Ctrl+Q+P 让新起的容器后台运行
[root@client ~] # docker container inspect xxxxxxxx //查看容器对应的IP
[root@client ~] # ssh 172.17.0.2
#172.17.0.2 是容器的IP
若是此时依旧不成功,可能就是之前已经使用ssh连接过容器,在known_hosts文件中已将保存了相应的密钥,把此文件删除,重新连接即可。
关于"Failed to get D-Bus connection: Operation not permitted"问题
针对上面启动sshd服务的问题,有些有Linux基础的朋友会在使用centos 7版本的镜像创建容器后,想在容器里使用 systemd 来管理启动服务,虽然centos 7版本中的基础镜像存在 systemd,但是使用 systemctl 启动服务时就会报如下的错误:
Failed to get D-Bus connection: Operation not permitted
#操作不被允许!!!
这是因为 Docker 的设计理念是在容器里面不运行后台服务,容器本身就是宿主机上的一个独立的主进程,也可以间接的理解为就是容器李运行服务的应用进程。一个容器的生命周期是围绕这个主进程存在的,所以正确的使用容器的方法是将里面的服务运行在前台。
再说 systemd,这个套件已经成为主流Linux发行版默认的服务管理,取代了传统的 SystemV 风格服务管理。systemd维护系统服务程序,它需要特权才能够去访问Linux内核。而容器并不是一个完整的操作系统,只有一个文件系统,而默认启动只是普通用户这样的权限访问Linux内核,也就是没有特权,所以自然就用不了!
因此,请遵守容器设计原则,一个容器里运行一个前台服务!
说了这么多,如何解决上面的报错呢?
#以特权的模式运行容器
创建容器:
docker run -d -name centos7 --privileged=true centos:7 /usr/sbin/init
进入容器:
docker exec -it centos7 /bin/bash #表示登录进容器后,自己又新开一个shell(/bin/bash),所以使用子进程的当时登录容器退出后,不会影响其它shell
这样可以使用systemctl启动服务了。
参考文章:https://blog.csdn.net/zhenliang8/article/details/78330658