为Docker镜像添加SSH服务

一些进入容器的办法,比如attachexec等命令,都无法解决远程管理容器的问题。因此,当我们需要远程登录到容器内进行一些操作的时候,就需要SSH的支持了。

有两种创建带有SSH服务的镜像:基于Docker commit命令创建和基于Dockerfile创建。

基于commit命令创建

Docker提供了docker commit命令,支持用户提交自己对制定容器的修改,并生产新的镜像。
命令格式:docker commit CONTAINER[REPOSITORY:[:TAG]]

1、准备工作

首先,使用ubuntu:14.04镜像来创建容器:
docker run -it ubuntu:14.04 /bin/bash
更新apt缓存,并安装openssh-server
apt-get update;apt-get install -y openssh-server

2、安装和配置SSH服务

如果需要正常启动SSH服务,则目录/var/run/sshd必须存在,手动创建它,并启动SSH服务。

1
2
mkdir -p /var/run/sshd
/usr/sbin/sshd -D &

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

1
2
3
netstat -tlnp
//修改SSH服务的安全登录配置,取消pam登录限制
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。并添加可执行权限:

1
2
vi /run.sh
chmod +x run.sh

其中,run.sh脚本内容如下:

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

最后,退出容器执行,exit命令。

3、保存镜像

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

4、使用镜像

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

1
2
3
4
//启动容器
docker run -p 10022:22 -d sshd:ubuntu /run.sh
//查看运行进程
docker ps

在宿主主机(192.168.1.200)或其他主机上,可以通过SSH访问10022端口来登录容器:

1
ssh 192.168.1.200 -p 10022

使用Dockerfile创建

1、创建工作目录

创建一个ssh_ubuntu目录,mkdir ssh_ubuntu,并在其中创建Dockerfilerun.sh

1
touch Dockerfile run.sh

2、编写run.sh脚本和authorized_keys文件

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

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

1
2
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub > authorized_keys

3、编写Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#设置基础镜像
FROM ubuntu:14.04
#提供作者信息
LABEL author="xym" author_email="xym@126.com"
#更新命令
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"]

4、创建镜像xd

在ssh_ubuntu目录下,使用docker build命令来创建镜像,这里注意还有一个”.”,表示使用当前目录中的Dockerfile

1
2
cd ssh_ubuntu
docker build -t sshd:Dockerfile .

5、测试镜像,运行容器

1
2
3
4
//启动镜像,映射容器22端口到本地的10122端口
docker run -d -p 10122:22 sshd:Dockerfile
//在宿主主机新打开一个终端,连接到新建的容器
ssh 192.168.1.200 -p 10122
文章目录
  1. 1. 基于commit命令创建
    1. 1.1. 1、准备工作
    2. 1.2. 2、安装和配置SSH服务
    3. 1.3. 3、保存镜像
    4. 1.4. 4、使用镜像
  2. 2. 使用Dockerfile创建
    1. 2.1. 1、创建工作目录
    2. 2.2. 2、编写run.sh脚本和authorized_keys文件
    3. 2.3. 3、编写Dockerfile
    4. 2.4. 4、创建镜像xd
    5. 2.5. 5、测试镜像,运行容器
|