介绍
docker 中安装 sshd,这样就可以 ssh 进入docker内远程开发了
安装
安装 openssh-server,会同时安装 openssh
|
|
修改root密码
|
|
配置host密钥
|
|
前台启动sshd
|
|
问题
-
执行sshd,失败
1 2
[root@linux0 /]# sshd sshd re-exec requires execution with an absolute path
解决:需要使用sshd全路径
1
[root@linux0 /]# /usr/sbin/sshd
-
Could not load host key
1 2 3 4 5
[root@linux0 /]# /usr/sbin/sshd 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 sshd: no hostkeys available -- exiting.
解决:
1 2 3
ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N '' ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' ssh-keygen -q -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''
-
Failed to get D-Bus connection: Operation not permitted
在容器里使用 systemd 来管理启动服务,虽然centos 7版本中的基础镜像存在 systemd,但是使用 systemctl 启动服务时就会报如下的错误:
1
Failed to get D-Bus connection: Operation not permitted
这是因为 Docker 的设计理念是在容器里面不运行后台服务,容器本身就是宿主机上的一个独立的主进程,也可以间接的理解为就是容器李运行服务的应用进程。一个容器的生命周期是围绕这个主进程存在的,所以正确的使用容器的方法是将里面的服务运行在前台。
再说 systemd,这个套件已经成为主流Linux发行版默认的服务管理,取代了传统的 SystemV 风格服务管理。systemd维护系统服务程序,它需要特权才能够去访问Linux内核。而容器并不是一个完整的操作系统,只有一个文件系统,而默认启动只是普通用户这样的权限访问Linux内核,也就是没有特权,所以自然就用不了!
因此,请遵守容器设计原则,一个容器里运行一个前台服务!
说了这么多,如何解决上面的报错呢?
1. 以特权的模式运行容器 创建容器: ```bash docker run -d -name centos7 --privileged=true centos:7 /usr/sbin/init ``` 进入容器: ```bash docker exec -it centos7 /bin/bash #表示登录进容器后,自己又新开一个shell(/bin/bash),所以使用子进程的当时登录容器退出后,不会影响其它shell ``` 这样可以使用systemctl启动服务了。
-
/etc/ssh/sshd_config中的参数
usePam参数:https://unix.stackexchange.com/questions/673153/sshd-what-are-the-practical-effects-of-setting-usepam-no
PermitRootLogin 默认为yes,作用:https://blog.csdn.net/huigher/article/details/52972013
PubkeyAuthentication 默认为yes
参考:
https://blog.csdn.net/cxs_123/article/details/116276838
https://unix.stackexchange.com/questions/109380/why-does-sshd-requires-an-absolute-path