有时候用docker调试程序,想通过telnet或者ssh连接容器,但即便敲了“docker run -d”,若容器很“干净”,即没有“持续性”工作在进行,依然会“秒退”,很烦人。
于是,就从网上查了查资料,结合自己的一点点小理解,总结出来一个办法,都在下面的dockerfile里。
该dockerfile创建了一个默认同时运行telnet和ssh服务的镜像。
FROM ubuntu:latest
MAINTAINER Traphix
RUN apt-get update; apt-get upgrade -y
RUN apt-get install -y openssh-server openbsd-inetd telnetd
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN echo "telnet stream tcp nowait telnetd /usr/sbin/tcpd /usr/sbin/in.telnetd" >> /etc/inetd.conf
RUN echo "root:root" | chpasswd
RUN useradd admin
RUN echo "admin:admin" | chpasswd
RUN echo "admin ALL=(ALL) ALL" >> /etc/sudoers
RUN mkdir /home/admin
RUN mkdir /var/run/sshd
EXPOSE 22 23
ENTRYPOINT service openbsd-inetd start && /usr/sbin/sshd -D
关键最后一行命令,先启动telnet server服务,再启动/usr/sbin/sshd并添加 -D 参数确保后台运行,这样基于此镜像建立的容器就不会“秒退”了!
当然,也可以吧telnet相关指令去掉,只运行ssh服务,如下:
FROM ubuntu:latest
MAINTAINER Traphix
RUN apt-get update; apt-get upgrade -y
RUN apt-get install -y openssh-server
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN echo "root:root" | chpasswd
RUN useradd admin
RUN echo "admin:admin" | chpasswd
RUN echo "admin ALL=(ALL) ALL" >> /etc/sudoers
RUN mkdir /home/admin
RUN mkdir /var/run/sshd
EXPOSE 22
ENTRYPOINT /usr/sbin/sshd -D
P.S. 连接指令很简单
ssh admin@IP_address