Docker 内安装 SSH 服务
有时候我们想把 Docker 环境提供给别人,但是又不想提供宿主机,那么可以在 Docker 容器内运行 SSH 服务,使容器保持运行并提供给对方使用即可,下面我们以 CentOS 7.6 的 Docker 镜像为例进行配置。
首先开启 Docker 环境,为了方便可以提前映射宿主机的端口:
docker run -it -p 20022:22 centos:7.6.1810 /bin/bash
然后进入后安装相关的环境:
yum install passwd openssl openssh-server -y
# 可选安装必要的网络工具
yum install net-tools iproute
安装后生成相应的 host key:
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ''
然后建议修改 SSH 配置文件中的 UseDNS
为 no
关闭 DNS 来提升性能:
sed -i "s/#UseDNS.*/UseDNS no/g" /etc/ssh/sshd_config
# 或者安装 vim 然后修改也可以
yum install vim
然后可以后台启动 SSH 服务:
/usr/sbin/sshd
启动之后,可以查看端口号以及容器网络的 IP:
netstat -tln | grep 22
ip addr
然后修改 root 用户密码:
passwd root
设置后可以尝试从外部连接容器:
# 宿主机可以直接连接容器的 IP 例如
ssh 172.17.0.2
# 也可以连接映射的端口
ssh localhost -p 20022
# 其他外部机器可以使用宿主机的 IP 来连接
ssh <host-ip> -p 20022
如果刚才运行容器忘记指定 -p
参数,那么可以将修改的镜像保存,然后再运行:
docker commit -m "<commit content>" -a "<auther>" <container-id> centos:7.6.1810-ssh
# 查看镜像
docker images
# 启动镜像
docker run --rm -it -p 20022:22 -d centos:7.6.1810-ssh /usr/sbin/sshd -D
然后就可以使用 SSH 客户端连接了,综合上面这些步骤我们可以直接编写 Dockerfile 创建镜像,例如:
FROM centos:7.6.1810
RUN yum install passwd openssl openssh-server net-tools iproute -y
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' && ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ''
RUN sed -i "s/#UseDNS.*/UseDNS no/g" /etc/ssh/sshd_config
RUN echo "root-123456" | passwd --stdin root
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
然后打包镜像即可:
docker build -t centos:7.6.1810-ssh .
打包后即可从镜像启动容器:
docker run -p 20022:22 -d centos:7.6.1810-ssh
最后就可以通过 SSH 客户端连接了。