Docker 添加容器SSH服务

网友投稿 202 2022-10-20

Docker 添加容器SSH服务

很多时候我们需要登陆到容器内部操作,此时我们就需要开启容器的SSH支持了,下面的小例子将具体介绍三种分配IP地址的方法,分别是pipworl分配,commit分配,Docker分配等.

基于commit命令创建

Docker提供了commit命令,支持用户提交自己对定制容器的修改,并生成新的镜像.这里将介绍如何用docker commit命令,添加SSH服务的操作流程,首先默认情况下ssh服务在镜像里是没有被安装的,我们需要手动配置一下,后期生成镜像启动就方便啦.

1.首先我们先来使用Centos镜像,放入后台并进入容器内部.

[root@localhost ~]# docker pull centos:latest[root@localhost ~]# docker run -itd --name my_ssh --net=host centos:latest[root@localhost ~]# docker exec -it my_ssh /bin/bash[root@c59a63bbb /]# yum install -y passwd openssh openssh-server

2.如果需要正常启动SSH服务,则目录​​/var/run/sshd​​必须存在,手动创建它,并启动SSH服务.

[root@c59a63bbb /]# mkdir -p /var/run/sshd[root@c59a63bbb /]# /usr/sbin/sshd -D &

上面的启动命令会报错,这个错误解决方案是,执行下面命令,创建这些文件.

[root@c59a63bbb /]# ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''[root@c59a63bbb /]# ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''[root@c59a63bbb /]# ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''

3.然后,修改​​/etc/ssh/sshd_config​​​配置信息​​UsePAM yes​​​改为​​UsePAM no​​​,​​UsePrivilegeSeparation sandbox​​​改为​​UsePrivilegeSeparation no​​,可以用vim修改,也可以用下面命令.

[root@c59a63bbb /]# sed -i "s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config[root@c59a63bbb /]# sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config 不通过pam验证[root@c59a63bbb /]# sed -ri 's/session required pam_loginuid.so/#sessionrequired pam_loginuid.so/g' /etc/pam.d/sshd

4.修改完后,重新启动sshd服务,并修改一个root密码.

[root@c59a63bbb /]# /usr/sbin/sshd -D[root@c59a63bbb /]# echo "root" | passwd --stdin root[root@c59a63bbb /]# echo "/usr/sbin/sshd -D &" >> /etc/profile

5.创建一个自启动脚本文件,写入一下内容.

[root@c59a63bbb /]# vi /run.sh#!/bin/bash/usr/sbin/sshd -D[root@c59a63bbb /]# chmod +x run.sh[root@c59a63bbb /]# exit

6.保存镜像,将所退出的容器用commit命令保存为一个新的​​my_ssh:centos​​镜像.

[root@localhost ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUSe1fc02dfd24f centos:latest "/bin/bash" 4 minutes ago Up 4 minutes[root@localhost ~]# docker commit e1fc my_ssh:centossha256:48997373aee923ee9b6af833de4aa9842dd090c7fee1f2569aa187e66b96231c[root@localhost ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmyssh centos 48997373aee9 25 seconds ago 280MBcentos latest 1e1148e4cc2c 10 days ago 202MBhello-world latest 4ab4c602aa5e 3 months ago 1.84kB

7.启动容器,并添加端口映射10000-->22.其中10000是宿主主机的端口,22是容器的SSH服务监听端口.

[root@localhost ~]# docker run -itd -p 10000:22 my_ssh:centos[root@localhost ~]# docker run -p 10000:22 -itd my_ssh:centos /run.shb0b073cf4bf933b291f0e0139220d09325e7dead7a1a77cacc243516c09ee931

8.在宿主主机或其他主机上上,可以通过SSH访问10022端口来登录容器.

[root@localhost ~]# ssh root@192.168.1.5 -P 10000

使用Dockerfile创建

上面的方式比较复杂,接下来我们来看一个简单的,使用dockerfile的方式来创建一个Ubuntu镜像.

1.首先,拉取一个基本镜像,并创建一个​​sshd_ubuntu​​工作目录.

[root@localhost ~]# docker pull ubuntu:latest[root@localhost ~]# mkdir ssh_ubuntu[root@localhost ~]# cd ssh_ubuntu/[root@localhost ssh_ubuntu]# touch Dockerfile[root@localhost ssh_ubuntu]# touch run.sh

2.编写run.sh以及,在宿主主机上生成SSH密钥对,并创建​​authorized_keys​​文件.

[root@localhost ssh_ubuntu]# vim run.sh#!/bin/bash/usr/sbin/sshd -D[root@localhost ssh_ubuntu]# ssh-keygen -t rsa[root@localhost ssh_ubuntu]# cat ~/.ssh/id_rsa.pub >authorized_keys[root@localhost ssh_ubuntu]# cp -a authorized_keys /root/.ssh/

3.下面是Dockerfile的内容,这和commit命令创建镜像过程,所进行的操作基本一致.

#设置继承镜像FROM ubuntu:latest#提供一些作者的信息MAINTAINER docker_user (user@docker.com)#下面开始运行更新命令#RUN apt-get update#安装ssh服务RUN apt-get install -y passwd openssh openssh-serverRUN mkdir -p /var/run/sshdRUN mkdir -p /root/.ssh#取消pam限制RUN sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd#复制配置文件到相应位置,并赋予脚本可执行权限ADD authorized_keys /root/.ssh/authorized_keysADD run.sh /run.shRUN chmod 755 /run.sh#开放端口EXPOSE 22#设置初始密码RUN echo "root"|passwd --stdin root#设置自启动命令CMD ["/run.sh"]

4.创建镜像,在sshd_ubuntu目录下,使用build命令来创建镜像.这里需要注意最后还有一个".",表示使用当前目录中的Dockerfile

[root@localhost ~]# cd sshd_ubuntu[root@localhost ssh_ubuntu]# docker build -t sshd:Dockerfile .

5.测试镜像,运行容器,并通过ssh连接一下.

[root@localhost ~]# docker run -d -p 10122:22 sshd:Dockerfile890c04ff8d769b604386ba4475253ae8c21fc92d60083759afa77573bf4e8af1[root@localhost ~]# ssh 192.168.1.200 -p 10122

在Docker社区中,对于是否需要为Docker容器启用SSH服务一直有争论,反对方的观点是:Docker的理念是一个容器只运行一个服务.因此,如果每个容器都运行一个额外的SSH服务,就违背了这个理念.另外认为根本没有从远程主机进入容器进行维护的必要.

使用pipwork分配

1.安装Git工具,并克隆pipwork,放入可执行目录,并给予相应的权限.

[root@localhost ~]# yum install -y git[root@localhost ~]# git clone ~]# cd pipework/[root@localhost pipework]# cp -a pipework /usr/local/bin/[root@localhost pipework]# chmod +x /usr/local/bin/pipework

2.将本机配置成网桥,使之能够互相通信.

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens32[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens32DEVICE=eno16777728TYPE=EthernetBOOTPROTO=staticBRIDGE=br0NM_CONTROLLED=yesONBOOT=yes[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0TYPE=BridgeDEVICE=br0BOOTPROTO=staticIPADDR=192.168.1.13NETMASK=255.255.255.0GATEWAY=192.168.1.1DNS1=8.8.8.8DNS2=114.114.114.114ONBOOT=yes[root@localhost ~]# reboot

3.下载一个Centos镜像,并运行且指定​​--net="none"​​,后期使用pipwork分配IP地址.

[root@localhost ~]# docker pull centos:latest[root@localhost ~]# docker run -d --name my_ssh --restart=always --net="none" centos:latestcf8354804431a7830a6a46999ac20240ad6402d505d3130789fdc4bbb227e4e3

4.通过命令分配IP地址,与子网掩码.

[root@localhost ~]# pipework br0 镜像名称 192.168.1.100/24[root@localhost ~]# docker inspect my_ssh |grep "IPAddress" "SecondaryIPAddresses": null, "IPAddress": "192.168.1.100/24", "IPAddress": "192.168.1.100/24",

docker 给容器分配IP并可以连接SSH (新版)

1.首先创建子网

docker network create --subnet=172.1.0.0/16 mynetworkdocker network ls

2.为容器分配ip

docker run -itd --name lyshark --net mynetwork --ip 172.1.0.2 centos:latest /bin/bashdocker exec -it lyshark /bin/bash

3.安装各种软件

yum -y install net-tools passwd openssh-server openssh-clientspasswd root

4.执行ssh生成

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 -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''

5.接着修改sshd_config文件配置信息

vi /etc/ssh/sshd_config

开启 Port 22 注释

将 PermitRootLogin 的 no 改为 yes

启动ssh服务 /usr/sbin/sshd -D &

6.退出这个镜像,然后打包成新的。

docker commit lyshark mycentos 制作新的镜像

5.直接创建新的容器即可。

docker rm $(docker ps -a -q)docker run -itd --name centos1 --net mynetwork --ip 172.1.0.2 mycentos /usr/sbin/initdocker exec -it lyshark /bin/bash

6.外网链接配置,将外网的5423端口映射到内网主机的 172.1.0.2:22口上,即可外部连接该容器

[root@localhost ~]# firewall-cmd --add-forward-port=port=5423:proto=tcp:toaddr=172.1.0.2:toport=22success[root@localhost ~]# firewall-cmd --add-port=5423/tcpsuccess

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Docker 容器简介与部署
下一篇:SpringBoot+Redis布隆过滤器防恶意流量击穿缓存
相关文章

 发表评论

暂时没有评论,来抢沙发吧~