Docker中配置CentOS容器启动sshd服务卡死问题求助
CentOS 7.9容器启动SSH服务卡死问题排查与解决
我通过Dockerfile配置CentOS 7.9.2009容器,期望用CMD ["/usr/sbin/sshd", "-D"]实现容器启动时自动开启SSH服务,但执行docker run后容器出现卡死情况。移除该CMD指令后,进入容器手动执行/usr/sbin/sshd -d却能正常运行。
原Dockerfile内容
FROM centos:7.9.2009 # 安装openssh-server和sudo软件包,并且将sshd的UsePAM参数设置成no RUN yum install -y openssh-server sudo RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config #安装openssh-clients RUN yum install -y openssh-clients #安装epel-release RUN yum install -y epel-release #安装net-tools RUN yum install -y net-tools #安装vim RUN yum install -y vim # 添加测试用户root,设置密码,并且将此用户添加到sudoers里 RUN echo "root:310013" | chpasswd RUN echo "root ALL=(ALL) ALL" >> /etc/sudoers RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key RUN ssh-keygen -t ecdsa -b 256 -f /etc/ssh/ssh_host_ecdsa_key RUN ssh-keygen -t ed25519 -b 256 -f /etc/ssh/ssh_host_ed25519_key # 启动sshd服务并且暴露22端口 RUN mkdir /var/run/sshd EXPOSE 22 # 每次开机自启动sshd都会卡死,为什么? CMD ["/usr/sbin/sshd", "-D"] ADD jdk-8u401-linux-x64.tar.gz /usr/local/ RUN mv /usr/local/jdk1.8.0_401 /usr/local/jdk1.8 ENV JAVA_HOME /usr/local/jdk1.8 ENV PATH $JAVA_HOME/bin:$PATH ADD hadoop-3.3.6-src.tar.gz /usr/local RUN mv /usr/local/hadoop-3.3.6-src /usr/local/hadoop ENV HADOOP_HOME /usr/local/hadoop ENV PATH $HADOOP_HOME/bin:$PATH
问题原因与解决方案
1. 核心问题分析
容器看似“卡死”主要有两个可能:一是sshd -D前台运行时无日志输出,导致前台启动的容器视觉上停滞;二是Dockerfile指令顺序不符合最佳实践,引发潜在的环境或配置冲突。
2. 排查与修复步骤
(1)确认容器真实状态
先以后台模式启动容器,避免无输出导致的视觉误解:
docker run -d -p 2222:22 <你的镜像标签>
查看容器是否正常运行:
docker ps
若容器在运行,查看sshd日志定位具体问题:
docker logs <容器ID>
(2)调整CMD指令位置
将CMD移至所有构建指令的最后,这是Dockerfile编写的最佳实践,确保镜像构建完成后再定义启动命令:
# ... 所有ADD、RUN、ENV指令之后 ... EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"]
(3)修复sshd配置与权限
- 确保允许root密码登录,修改sshd配置:
sed -i 's/#PermitRootLogin yes/PermitRootLogin yes/g' /etc/ssh/sshd_config - 确认ssh密钥与运行目录的权限符合要求:
chmod 755 /var/run/sshd chmod 600 /etc/ssh/ssh_host_*_key chmod 644 /etc/ssh/ssh_host_*.pub
(4)优化Dockerfile减少镜像层数
合并冗余的RUN指令,清理yum缓存,减少镜像体积并提升构建效率:
RUN yum install -y openssh-server sudo openssh-clients epel-release net-tools vim && \ yum clean all && rm -rf /var/cache/yum
修正后的完整Dockerfile
FROM centos:7.9.2009 # 安装基础工具并清理缓存 RUN yum install -y openssh-server sudo openssh-clients epel-release net-tools vim && \ yum clean all && rm -rf /var/cache/yum # 修改sshd核心配置 RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config && \ sed -i 's/#PermitRootLogin yes/PermitRootLogin yes/g' /etc/ssh/sshd_config # 配置root用户与ssh密钥(无交互生成) RUN echo "root:310013" | chpasswd && \ echo "root ALL=(ALL) ALL" >> /etc/sudoers && \ ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N "" && \ ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" && \ ssh-keygen -t ecdsa -b 256 -f /etc/ssh/ssh_host_ecdsa_key -N "" && \ ssh-keygen -t ed25519 -b 256 -f /etc/ssh/ssh_host_ed25519_key -N "" # 创建sshd运行目录并设置权限 RUN mkdir /var/run/sshd && chmod 755 /var/run/sshd # 安装JDK并配置环境变量 ADD jdk-8u401-linux-x64.tar.gz /usr/local/ RUN mv /usr/local/jdk1.8.0_401 /usr/local/jdk1.8 ENV JAVA_HOME /usr/local/jdk1.8 ENV PATH $JAVA_HOME/bin:$PATH # 安装Hadoop并配置环境变量 ADD hadoop-3.3.6-src.tar.gz /usr/local RUN mv /usr/local/hadoop-3.3.6-src /usr/local/hadoop ENV HADOOP_HOME /usr/local/hadoop ENV PATH $HADOOP_HOME/bin:$PATH # 暴露端口与定义启动命令 EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"]
内容的提问来源于stack exchange,提问作者刘茂林
相关产品推荐
相关产品推荐

