创建支持SSH远程登录的Docker镜像

2019-02-13  本文已影响0人  天剑飞心

在项目当中想要在一台计算节点上面创建多个Docker 容器,每一个容器都供用户使用,希望用户可以直接远程登录到容器上
所以考虑在镜像当中部署openssh服务

在镜像当中部署openssh服务有两种方式可以实现

Docker官方文档推荐使用dockerfile的方式构建自定义的镜像
因为在Dockerfile里面可以声明一个镜像完整的构建过程,方便修改,而通过第一种方式生成镜像的话,别人要在此镜像基础之上做修改就显得不是那么的方便了

下面开始创建Dockerfile,首先创建一个目录,这里就以dockerfile来命名这个目录然后在目录里面创建一个名为dockerfile的文件
文件的内容如下:

mkdir dockerfile
cd dockerfile
cat dockerfile
# 从华为镜像仓库里面拉取ubuntu:16.04作为基础镜像
FROM docker-hub.alpha.tools.huawei.com/ubuntu:16.04
# 声明维护者名称
MAINTAINER "Kristian"
# 安装openssh服务,在安装之前先apt-get update一下
# 在这里的ubuntu镜像里面是已经配置好了apt-get source-list的,如果没配置好的话,需要在这里设置source-list
RUN apt-get update
RUN apt-get install -y openssh-server

# 创建ssh服务所需要的privilege dir
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
# 设置一个默认的ssh登录名/密码,同时开启远程ssh登录的权限
RUN echo "root:admin123" | chpasswd
RUN sed -ri s/^PermitRootLogins+.*/PermitRootLogin yes/ /etc/ssh/sshd_config
RUN sed -ri s/UsePAM yes/#UsePAM yes/g /etc/ssh/sshd_config
# 从本地目录拷贝一个run.sh脚本文件到镜像的根目录下面去,同时为此文件添加可执行权限
ADD run.sh /run.sh
RUN chmod 755 /run.sh
# 配置镜像对外暴露22端口,因为ssh协议是通过tcp 22端口来建立连接的
EXPOSE 22
# 配置容器启动的时候,运行run.sh脚本
CMD ["/bin/bash","/run.sh"]

run.sh的内容如下,其实只是让容器在后台一直跑ssh服务

cat run.sh
#!/bin/bash
/usr/sbin/sshd -D

然后在我们创建的dockerfile目录内执行docker build 命令:

/usr/local/docker/dockerfile# docker build -t ubuntu/ssh .
Sending build context to Docker daemon  3.584kB
Step 1/13 : FROM docker-hub.alpha.tools.huawei.com/tools/ubuntu:16.04
16.04: Pulling from tools/ubuntu
23a6960fe4a9: Pull complete
e9e104b0e69d: Pull complete
cd33d2ea7970: Pull complete
534ff7b7d120: Pull complete
7d352ac0c7f5: Pull complete
62ca8a77dbee: Pull complete
eb6f00670afc: Pull complete
Digest: sha256:2e370fef0ce5b941224eb2188b39354ada456703a6b9f8817b19752db8d84b4d
Status: Downloaded newer image for docker-hub.alpha.tools.huawei.com/tools/ubuntu:16.04
 ---> 82727fe22147
Step 2/13 : MAINTAINER "Kristian"
 ---> Running in 389840aec673
 ---> 090526175c68
Removing intermediate container 389840aec673
Step 3/13 : RUN apt-get update
 ---> Running in 3d126f21b7a4
...
Reading package lists...
 ---> 1ce34ba6c32f
Removing intermediate container 3d126f21b7a4
Step 4/13 : RUN apt-get install -y openssh-server
 ---> Running in b939a78afa4e
Reading package lists...
Building dependency tree...
Reading state information...
Updating certificates in /etc/ssl/certs... 148 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....done.
Processing triggers for systemd (229-4ubuntu17) ...
 ---> 3a15d35f0955
Removing intermediate container b939a78afa4e
Step 5/13 : RUN mkdir -p /var/run/sshd
 ---> Running in 85ecfab9f639
 ---> 7e17edf700be
Removing intermediate container 85ecfab9f639
Step 6/13 : RUN mkdir -p /root/.ssh
 ---> Running in 0f9f3a94fb0a
 ---> 375e728483b5
Removing intermediate container 0f9f3a94fb0a
Step 7/13 : RUN echo "root:admin123" | chpasswd
 ---> Running in 4870fa43a6b9
 ---> 14ad03368ca2
Removing intermediate container 4870fa43a6b9
Step 8/13 : RUN sed -ri 's/^PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_conf
 ---> Running in c6591e0ff2a1
 ---> 6503a6f81fae
Removing intermediate container c6591e0ff2a1
Step 9/13 : RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
 ---> Running in fcb5f6ea4c40
 ---> aa07135d8088
Removing intermediate container fcb5f6ea4c40
Step 10/13 : ADD run.sh /run.sh
 ---> 5f87dafb7467
Removing intermediate container 789216f4ff17
Step 11/13 : RUN chmod 755 /run.sh
 ---> Running in 647c1980089c
 ---> 7b4dd23bee7a
Removing intermediate container 647c1980089c
Step 12/13 : EXPOSE 22
 ---> Running in 5fdfb7020a68
 ---> c99250b79e0a
Removing intermediate container 5fdfb7020a68
Step 13/13 : CMD /bin/bash /run.sh
 ---> Running in be086ae204b2
 ---> b1805617182a
Removing intermediate container be086ae204b2
Successfully built b1805617182a
Successfully tagged ubuntu/ssh:latest

从命令的执行结果可以看到,Docker首先会从镜像仓库拉取我们指定的基础镜像 Ubuntu:16.04,然后安装openssh服务,然后执行我们定义的几条RUN命令
,最后拷贝run.sh脚本文件,以及添加容器创建时候默认执行的CMD命令
此时还不会有容器执行,因为我们只是创建了一个支持ssh服务的Ubuntu镜像而已

下面需要使用docker run命令来创建我们的容器(在创建容器的时候使用-p参数来指定系统随机分配一个端口映射到容器的22端口上)

/usr/local/docker/dockerfile# docker run -d -p 22 ubuntu/ssh
431cf43f48dd91214259756943123b51e049b2160d18cb013153d64b25618c12
/usr/local/docker/dockerfile# docker ps -a
CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS                   NAMES
431cf43f48dd        ubuntu/ssh          "/bin/bash /run.sh"   5 seconds ago       Up 4 seconds        0.0.0.0:32775->22/tcp   nervous_heyrovsk

可以看到系统分配了32775端口映射到了容器的22端口,这样我们可以以ssh连接服务器32775端口的方式来登录到我们创建的容器上面去

上一篇下一篇

猜你喜欢

热点阅读