Docker ---创建支持SSH服务的镜像

  一般情况下,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 [email protected] -p 1022
    [email protected]'s password: 
    Last login: Sat Jul  7 02:29:47 2018 from 192.168.3.196
    [root@7c0e709dd731 ~]# 
    --------------------------------------------------------------------
    

你可能感兴趣的:(Docker ---创建支持SSH服务的镜像)