Docker ---创建支持SSH服务的镜像
2019-03-12 本文已影响0人
李凈海
一般情况下,Linux系统管理员通过SSH服务来管理操作系统,但Docker的很多镜像是不带SSH服务的,那么我们怎样才能管理操作系统呢?
在之前的部分中我们介绍了一些进入容器的办法,比如用attach、exec等命令,但是这些命令都无法解决远程管理容器的问题。
因此,当读者需要远程登录到容器内进行一些操作的时候,就需要SSH的支持了。
本章将具体介绍如何自行创建一个带有SSH服务的镜像,并详细介绍两种创建容器的方法:基于docker commit命令创建和基于Dockerfile创建。
基于commit命令创建
Docker提供了【docker commit】命令,支持用户提交自己对容器的修改,并生成新的镜像。命令格式为:
docker commit CONTAINER[REPOSITORY[:TAG]]
首先,使用centos镜像来创建一个容器:
--------------------------------------------------------------------
[docker@localhost ~]$ sudo docker run -ti centos /bin/bash
[root@e6db13724073 /]#
--------------------------------------------------------------------
尝试使用SSHD命令,同学们会发现容器中并没有安装该服务:
--------------------------------------------------------------------
[root@e6db13724073 /]# sshd
bash: sshd: command not found
--------------------------------------------------------------------
同时,大家可以从yum包管理器的软件源信息中找到启动ssh服务所需要的openssh-server
--------------------------------------------------------------------
[root@e6db13724073 /]# yum install openssh-server
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
* base: mirrors.aliyun.com
* extras: mirrors.sohu.com
* updates: mirrors.aliyun.com
base | 3.6 kB 00:00:00
extras | 3.4 kB 00:00:00
updates | 3.4 kB 00:00:00
(1/4): base/7/x86_64/group_gz | 166 kB 00:00:00
(2/4): extras/7/x86_64/primary_db | 150 kB 00:00:01
(3/4): updates/7/x86_64/primary_db | 3.6 MB 00:00:01
(4/4): base/7/x86_64/primary_db | 5.9 MB 00:00:01
Resolving Dependencies
--> Running transaction check
---> Package openssh-server.x86_64 0:7.4p1-16.el7 will be installed
...
Installed:
openssh-server.x86_64 0:7.4p1-16.el7
Dependency Installed:
fipscheck.x86_64 0:1.4.1-6.el7 fipscheck-lib.x86_64 0:1.4.1-6.el7 openssh.x86_64 0:7.4p1-16.el7 tcp_wrappers-libs.x86_64 0:7.6-77.el7
Complete!
--------------------------------------------------------------------
这里已经安装好服务,可以启动服务:
--------------------------------------------------------------------
[root@e6db13724073 /]# /usr/sbin/sshd -D &
[1] 167
[root@e6db13724073 /]# Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key
sshd: no hostkeys available -- exiting.
--------------------------------------------------------------------
这里有报错,服务无法启动,要正常启动ssh服务,还需要执行:
--------------------------------------------------------------------
[root@e6db13724073 /]# /usr/sbin/sshd-keygen -A
--------------------------------------------------------------------
注意:如果在执行【/usr/sbin/sshd-keygen -A】时,报以下错误,可以忽略:
--------------------------------------------------------------------
[root@e6db13724073 /]# /usr/sbin/sshd-keygen -A
/usr/sbin/sshd-keygen: line 10: /etc/rc.d/init.d/functions: No such file or directory
Generating SSH2 RSA host key: /usr/sbin/sshd-keygen: line 63: success: command not found
Generating SSH2 ECDSA host key: /usr/sbin/sshd-keygen: line 105: success: command not found
Generating SSH2 ED25519 host key: /usr/sbin/sshd-keygen: line 126: success: command not found
--------------------------------------------------------------------
在root用户目录下创建.ssh目录,并服务需要登录的公钥信息到authorized_keys文件中。然后启动服务,查看监听端口是否正常。
--------------------------------------------------------------------
[root@e6db13724073 /]# ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
[root@e6db13724073 /]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
[root@e6db13724073 /]# chmod 0600 ~/.ssh/authorized_keys
[root@e6db13724073 /]# /usr/sbin/sshd -D &
[1] 193
[root@e6db13724073 /]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 193/sshd
tcp6 0 0 :::22 :::* LISTEN 193/sshd
--------------------------------------------------------------------
创建自动启动ssh服务的可执行文件sshd.sh并添加权限:
--------------------------------------------------------------------
[root@e6db13724073 /]# vi /sshd.sh
[root@e6db13724073 /]# cat sshd.sh
#!/bin/bash
/usr/sbin/sshd -D
[root@e6db13724073 /]# chmod +x sshd.sh
--------------------------------------------------------------------
最后,我们退出容器【exit】
保存镜像
将所退出的容器用【docker commit】命令保存一个新的sshd:centos镜像,并查看本地生成的新镜像sshd:centos:
--------------------------------------------------------------------
[docker@localhost ~]$ sudo docker commit e6db sshd:centos
sha256:601033083a9e680e2ee0b818817229ab24b3359703e11dbf47ee06b8bca9650c
[docker@localhost ~]$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sshd centos 601033083a9e 17 seconds ago 368 MB
docker.io/centos latest 49f7960eb7e4 4 weeks ago 200 MB
docker.io/busybox latest 8c811b4aec35 6 weeks ago
--------------------------------------------------------------------
使用镜像
启动容器,并添加端口映射1022->22,启动1022是宿主机的端口,22是容器的ssh服务监听端口:
--------------------------------------------------------------------
[docker@localhost ~]$ sudo docker run -p 1022:22 -d sshd:centos /sshd.sh
7c0e709dd7318f7ee1d86d1a3aeab02e6d003e640f95b942aef4cf237c2a2236
[docker@localhost ~]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c0e709dd731 sshd:centos "/sshd.sh" 6 seconds ago Up 4 seconds 0.0.0.0:1022->22/tcp stoic_kowalevski
--------------------------------------------------------------------
在宿主机或其他主机上,可以通过SSH访问1022端口来登录容器:
--------------------------------------------------------------------
[docker@localhost ~]$ ssh root@172.17.0.1 -p 1022
root@172.17.0.1's password:
Last login: Sat Jul 7 02:29:47 2018 from 192.168.3.196
[root@7c0e709dd731 ~]#
--------------------------------------------------------------------