Docker中CentOS 7版本如何启动sshd服务

启动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

你可能感兴趣的:(Docker中CentOS 7版本如何启动sshd服务)