为Docker镜像添加SSH服务


当需要远程登陆到容器内进行操作时,需要SSH的支持

基于commit命令创建

用于用户提交自己对制定容器的修改,并生成新的镜像

格式:docker commit CONTAINER [REPOSITORY[:TAG]]

准备工作

创建容器

1
docker run -it ubuntu:14.04 /bin/bash

更新apt缓存,并安装openssh-server

1
apt update && apt install openssh-server -y

配置SSH服务

启动sshd服务

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

修改SSH服务的安全登陆配置,取消pam登陆限制

1
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命令生成)到.ssh目录下的authorized_keys

1
2
3
mkdir /root/.ssh
cd /root/.ssh
vi /root/.ssh/authorized_keys

创建自启动的SSH服务可执行文件run.sh,并添加可执行权限

1
2
3
4
cat run.sh
#!/bin/bash
/usr/sbin/sshd -D &
chmod +x run.sh

退出容器

1
exit

保存镜像

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

1
docker commit Container_id sshd:ubuntu

使用镜像

启动容器,并添加端口映射,本地主机的10022端口映射到容器的22端口

1
docker run -d -p 10022:22 sshd:ubuntu /run.sh

在本地主机(10.0.0.31)或其他主机上通过ssh连接本地(10.0.0.31)的10022端口

1
ssh 10.0.0.31 -p 10022


使用Dockerfile创建

使用Dockerfile创建一个支持SSH服务的镜像

创建工作目录

创建一个sshd_ubuntu工作目录

1
mkdir -p sshd_ubuntu

在其中,创建Dockerfile和run.sh文件

1
cd sshd_ubuntu/ && touch Dockerfile run.sh

编写run.sh脚本和authorized_keys文件

本地主机为Linux系统

1
2
3
cat run.sh 
#!/bin/bash
/usr/sbin/sshd -D &

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

1
ssh-keygen -t rsa

1
cat /root/.ssh/id_rsa.pub > ./authorized_keys

编写Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 基础镜像信息
FROM ubuntu:14.04

# 维护者信息
MAINTAINER a a@163.com

# 更新apt缓存、安装ssh服务
RUN apt update && apt install -y openssh-server
RUN mkdir -p /var/run/sshd /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

# 开放22端口
EXPOSE 22

# 设置脚本自启动
CMD ["/run.sh"]

创建镜像

sshd_ubuntu目录下

1
docker build -t sshd:dockerfile .

上面命令最后有一个.,表示使用当前目录中的Dockerfile文件

测试镜像,运行容器

1
docker run -it -p 10122:22 sshd:dockerfile /bin/bash

本地主机(10.0.0.31)连接新建的ssh容器

1
ssh 10.0.0.31 -p 10122

---------------The End---------------
0%