mmdbcn 发表于 2018-5-26 10:29:11

创建一个支持 sshd 服务的 docker 镜像

前言
  当我们运行容器后,第一件会想到的事情,就是如何连接容器。一般来说,连接容器的方式大概有四种。分别是attach、exec、ssh 和 nsenter.
  attach 和 exec 都是 docker 自带的命令,不需要做任何配置。
  这篇文章,主要尝试配置一个实现 sshd 服务的镜像。并用这个镜像生成容器,然后验证 ssh 登录的功能。

操作过程

环境说明
  宿主机 :   ubunt:16.04

用 Dockerfile 文件建立一个镜像

hell@hell:~/mysshd_ubuntu$ cat Dockerfile
FROM ubuntu:16.04
MAINTAINER hellochenprohellochenpro@hotmail.com
ENV REFRESHED_AT 2018-02-02
RUN apt-get -qqy update && \
apt-get install -qqy openssh-server && \
apt-get autoclean && \
apt-get autoremove && \
rm -rf /var/lib/apt/lists/*
RUN useradd -s/bin/bash hell
RUN echo 'hell:123456' | chpasswd
COPYid_rsa.pub/home/hell/.ssh/authorized_keys
RUN   chmod 700 /home/hell/.ssh/ && \
chmod 600 /home/hell/.ssh/authorized_keys && \
chown-Rhell:hell   /home/hell/.ssh
RUN mkdir -p /var/run/sshd
EXPOSE 22
CMD /usr/sbin/sshd -D

  Dockerfile 说明:
用ubuntu:16.04 的原生系统创建,
先用 apt-get 更新源,并安装了 openssh-server
然后,创建了一个用户 hell
接着,将 Dockerfile 上下文环境的 id_rsa.pub 公钥复制到 镜像中,
并且将 /home/hell/.ssh 和 authorized_keys 目录和文件的权限,所属组、所属主都进行修改,否则实现不了免密码登录
然后,将容器的22端口暴露;
最后,以后台守护进程的方式运行 sshd 服务

创建容器

先准备秘钥对

ssh-keygen   -t   rsa-b2048   # 一路回车确认,然后将公钥 id_rsa.pub 放到 Dockerfile 目录(上下文)环境
开始创建镜像

dockerbuild   --rm-t   my_sshd    .
# 创建成功 my_sshd 镜像
启动镜像

dockerrun-d   -p   10035:22   --name container_sshd   my_sshd
# 启动一个容器 container_sshd
尝试用 ssh 登录容器

ssh   hell@127.0.0.1   -p   10035-f   id_rsa   # 在宿主机通过端口10035 登录容器,使用 id_rsa 密钥文件

  成功!

总结
  其实,一般不推荐使用 ssh 的方式登录容器,因为这样和一个容器只运行一个进程的原则相违背。详细的讨论请移步这篇文章《为什么不需要在 Docker 容器中运行 sshd》。
页: [1]
查看完整版本: 创建一个支持 sshd 服务的 docker 镜像