docker 容器搭建ssh服务
1. 进入容器,
docker run -it --name mycontainer -p 9022:22 --privileged 34054 /usr/sbin/init
将容器的22端口映射到主机的9022端口
注意:必须加上--privileged /usr/sbin/init,否则当容器使用systemctl启动sshd服务时会报错:Failed to get D-Bus connection: Operation not permitted
原因:
Docker的设计理念是在容器里面不运行后台服务,容器本身就是宿主机上的一个独立的主进程,也可以间接的理解为就是容器里运行服务的应用进程。一个容器的生命周期是围绕这个主进程存在的,所以正确的使用容器方法是将里面的服务运行在前台。
再说到systemd,这个套件已经成为主流Linux发行版(比如CentOS7、Ubuntu14+)默认的服务管理,取代了传统的SystemV风格服务管理。systemd维护系统服务程序,它需要特权去会访问Linux内核。而容器并不是一个完整的操作系统,只有一个文件系统,而且默认启动只是普通用户这样的权限访问Linux内核,也就是没有特权,所以自然就用不了!
转自:https://blog.csdn.net/cheney__chen/article/details/81639203
2. 下载openssh-server 和openssh-clients
2. 这里注释掉多余的行:
注释掉HostKey /etc/ssh/ssh_host_ecdsa_key
注释掉HostKey /etc/ssh/ssh_host_ed25519_key
PermitRootLogin yes #允许root用户ssh登录
将RSAAuthentication(如果没找到,可以不管) 和 PubkeyAuthentication 后面的值都改成yes #允许密钥方式登陆
3.创建公私密钥:
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
-t 指定密钥类型,默认是 rsa ,可以省略。
-C 设置注释文字,比如邮箱。
-f 指定密钥文件存储文件名
注: 这里切忌一路会车,不要输密码,否则当启动服务时可能会报错:
4. 修改容器root密码:
echo "123456" | passwd --stdin "root"
5. 启动ssh服务(用要用绝对路径)
/usr/sbin/sshd -D &
6. 将本地的公钥文件保存到远程服务器的authorized_keys文件中:
ssh root@172.17.0.2 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
7. 这样就可以用密钥登陆了
ssh root@172.17.0.2
注:如果私钥文件在其它位置,可以用 -i 指定
ssh root@172.17.0.2 -p 22 -i ~/you_private_file