创建支持SSH服务的Docker镜像可以通过两种主要方法实现:基于docker commit命令和基于Dockerfile,这两种方法各有优劣,但都能有效地在Docker容器中添加SSH服务,下面将详细介绍这两种方法的具体步骤。
一、基于docker commit命令创建支持SSH服务的Docker镜像
1、获取基础镜像并启动容器:需要选择一个基础镜像(例如Ubuntu或CentOS),然后使用该镜像启动一个容器,可以使用以下命令启动一个Ubuntu的容器:
sudo docker run -it ubuntu:18.04 /bin/bash
2、安装必要的软件包:进入容器后,更新软件包缓存,并安装openssh-server和其它必要工具:
apt-get update apt-get install -y openssh-server net-tools vim
3、配置SSH服务:手动创建/var/run/sshd目录,然后启动SSH服务:
mkdir -p /var/run/sshd /usr/sbin/sshd -D &
检查22端口是否处于监听状态:
netstat -tunlp | grep 22
4、修改PAM配置:取消pam登录限制:
sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
5、创建自动启动脚本:创建一个名为run.sh的脚本文件,内容如下:
#!/bin/bash /usr/sbin/sshd -D
赋予脚本可执行权限:
chmod +x /run.sh
6、提交容器为新镜像:退出容器后,使用commit命令将当前容器提交为一个新的镜像:
sudo docker commit <container_id> sshd:ubuntu
7、运行新的镜像:使用新创建的镜像启动容器,并映射端口:
sudo docker run -p 10022:22 -d sshd:ubuntu /run.sh
二、基于Dockerfile创建支持SSH服务的Docker镜像
1、创建工作目录和文件:创建一个工作目录,并在其中创建Dockerfile和run.sh文件:
mkdir sshd_work cd sshd_work touch Dockerfile run.sh
2、编写run.sh脚本:生成SSH密钥并将公钥复制到authorized_keys文件中:
ssh-keygen -t rsa cat ~/.ssh/id_rsa.pub > authorized_keys
3、编写Dockerfile文件:编辑Dockerfile文件,内容如下:
FROM ubuntu:18.04 MAINTAINER carson carson@email.com RUN apt-get update && apt-get install -y openssh-server RUN mkdir -p /var/run/sshd && mkdir -p /root/.ssh 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_keys ADD run.sh /run.sh RUN chmod 755 /run.sh EXPOSE 22 CMD ["/run.sh"]
4、构建镜像:使用docker build命令构建新的镜像:
sudo docker build -t sshd:dockerfile .
5、测试新镜像:启动容器并映射端口:
sudo docker run -d -p 10422:22 sshd:dockerfile
使用另一个终端通过SSH连接到容器:
ssh -p 10422 root@宿主机IP
三、相关FAQs
1、如何在Docker容器中更改SSH服务的默认端口?:可以在启动SSH服务时指定端口,例如/usr/sbin/sshd -p 2222
,或者在Dockerfile中使用EXPOSE 2222
指令来暴露新端口,在运行容器时也需要映射相应的端口,如docker run -p 10422:2222 ...
。
2、如何解决SSH连接被拒绝的问题?:确认SSH服务已正确启动并监听指定端口,检查防火墙设置,确保允许SSH流量通过,确认使用的SSH客户端配置正确,包括主机名和端口号,如果问题仍然存在,可以查看容器日志以获取更多信息。
四、小编有话说
创建支持SSH服务的Docker镜像是远程管理Docker容器的有效方式之一,通过上述两种方法中的任意一种,都可以轻松地在Docker容器中集成SSH服务,从而实现对容器的远程访问和管理,无论是基于docker commit命令还是基于Dockerfile的方法,都有其独特的优势和适用场景,选择哪种方法取决于具体的需求和偏好。