一般情况下,Linux系统管理员通过SSH服务来管理操作系统,但Docker的很多镜像不带SSH服务的。

基于commit命令创建

准备工作

首先,使用ubuntu镜像来创建一个容器:

这时候是输入sshd是没有效果的,因为系统里面的软件源信息没有更新。

配置软件源

检查软件源,并使用apt-get update来更新软件源信息:

安装和配置SSH服务

更新软件包缓存后,已经可以安装SSH服务了,选择主流的openssh-server作为服务端,可以看到需要下载安装众多的依赖软件包:

要正常启动SSH服务,需要目录/var/run/sshd存在,手动创建它,并启动服务:

此时查看容器的22端口(SSH服务默认监听的端口),已经处于监听状态:

这儿有个问题,在使用netstat的时候会出现问题,这是因为镜像里缺少 net-tools这个包,自己apt-get install net-tools一下就可以了

修改SSH服务的安全登录配置,取消pam登录限制:
$ root@3c6ed6207883:/# sed -ri ‘s/session required pam-loginuid.so/#session required pam-loginuid.so/g’ /etc/pam.d/sshd

在root用户目录下创建.ssh目录,并复制需要登录的公钥信息(一般为本地主机用户目录下的.ssh/id_rsa.pub文件,可由ssh-keygen -t rsa命令生成)到authorized_keys文件中。

创建自动启动SSH服务的可执行文件run.sh

run.sh脚本内容:

#!/bin/bash
/usr/sbin/sshd -D

给run.sh添加可执行权限:

最后退出容器:

保存镜像

将所退出的容器用docker commit命令保存为一个新的sshd:ubuntu镜像:

使用镜像

启动容器,并添加端口映射10022 ————>22。其中10022是宿主主机的端口,22是容器的SSH服务监听端口:

启动成功后,可以在宿主主机上看到容器运行的详细信息:

使用Dockerfile创建

创建工作目录

首先应创建一个sshd_ubuntu工作目录:
$ mkdir sshd_ubuntu

在其中,创建Dockerfile和run.sh文件:
$ cd sshd_ubuntu/
$ touch Dockerfile run.sh

编写run.sh脚本和authorized_keys文件

脚本文件run.sh的内容与上面的一致:

#! /bin/bash
/usr/sbin/sshd -D

在宿主主机上生成SSH密钥对,并创建authorized_keys文件:

编写Dockerfile

下面是Dockerfile的内容及部分的注释

#设置继承镜像
FROM ubuntu
#提供一些作者的信息
MAINTAINER from www.dockerpool.com by waitfish

RUN apt-get update

#安装ssh服务
RUN apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh

#取消pam限制
 RUN sed -ri 's/session required pam-loginuid.so/#session required pam-loginuid.so/g' /etc/pam.d/sshd

#复制配置文件到相应位置,并赋予脚本可执行权限
ADD authorized_keys /root/.ssh/authorized_keys
ADD run.sh /run.sh
RUN chmod 755 /run.sh

#开放端口
EXPOSE 22

#设置自启动命令
CMD ["/run.sh"]

创建镜像

在sshd_ubuntu目录下,使用docker build命令来创建镜像,注意一下,在最后还有一个“.”,表示使用当前目录中的Dockerfile。

测试镜像,运行容器

使用刚才创建的sshd:dockerfile镜像来运行一个容器。直接启动镜像,映射容器的22端口到本地10122端口:

在宿主主机新打开一个终端,连接到新建的容器:

成功就表示镜像创建成功。

10-04 11:05