前言

当我们运行容器后,第一件会想到的事情,就是如何连接容器。一般来说,连接容器的方式大概有四种。分别是attach、exec、ssh 和 nsenter.

attach 和 exec 都是 docker 自带的命令,不需要做任何配置。

这篇文章,主要尝试配置一个实现 sshd 服务的镜像。并用这个镜像生成容器,然后验证 ssh 登录的功能。

操作过程

环境说明

宿主机 : ubunt:16.04

用 Dockerfile 文件建立一个镜像

hell@hell:~/mysshd_ubuntu$ cat Dockerfile 
FROM ubuntu:16.04

MAINTAINER hellochenpro  hellochenpro@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

COPY  id_rsa.pub  /home/hell/.ssh/authorized_keys

RUN   chmod 700 /home/hell/.ssh/ && \
           chmod 600 /home/hell/.ssh/authorized_keys && \
                     chown  -R  hell: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  -b  2048   # 一路回车确认,然后将公钥 id_rsa.pub 放到 Dockerfile 目录(上下文)环境
开始创建镜像
 docker  build   --rm  -t   my_sshd    .
 # 创建成功 my_sshd 镜像
启动镜像
docker  run  -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》