docker技术入门与实战 第3版学习笔记之第10章

第10章 为镜像添加SSH服务

SSH(安全外壳协议)为 Secure Shell 的缩写,SSH 为建立在应用层基础上的安全协议。

SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。

利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。很多时候用户希望通过远程登录服务器来进行管理,但是Docker的很多镜像是不带SSH服务的,所以,需要我们只能自己给容器加上SSH服务

基于commit​​命令创建

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

  1. 准备工作

    首先获取ubuntu:18.04镜像并创建一个容器

    arduino 复制代码
    dokcer pull ubuntu:18.04
    docker run --name one -it ubuntu:18.04 /bin/bash
  2. 配置软件源

    检查软件源并更新软件源信息apt-get update​​

    默认官方镜像比较慢,可以替换成国内的163​​、sohu​​等,在容器内创建/etc/apt/sources.list.d/163.list​​文件,并添加内容

    参考网址 Ubuntu apt-get 国内镜像源替换(新手必看,超详细!各种镜像源网站都有)_apt-get 镜像-CSDN博客

  3. 安装和配置SSH服务

    更新软件源之后就可以安装SSH服务了,使用主流的openssh-server​​作为服务端

    vbscript 复制代码
    apt-get install openssh-server

    如果需要正常启动SSH服务,需要目录/var/run/sshd​​必须存在,下卖弄手动创建并启动

    typescript 复制代码
    root@c16b58f160b4:/# mkdir -p /var/run/sshd
    root@c16b58f160b4:/# /usr/sbin/sshd -D &
    [1] 4038

    查看容器的22​​端口,查看状态

    ruby 复制代码
    root@c16b58f160b4:/# netstat -tunlp
    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      4038/sshd
    tcp6       0      0 :::22                   :::*                    LISTEN      4038/sshd
    root@c16b58f160b4:/#
    root@c16b58f160b4:/# apt-get install net-tools
    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    net-tools is already the newest version (1.60+git20161116.90da8a0-1ubuntu1).
    0 upgraded, 0 newly installed, 0 to remove and 33 not upgraded.
    root@c16b58f160b4:/# netstat -an | grep 22
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
    tcp6       0      0 :::22                   :::*                    LISTEN
    root@c16b58f160b4:/#

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

    ruby 复制代码
    root@c16b58f160b4:/# sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
    root@c16b58f160b4:/#

    在root用户目录下创建.ssh目录,并复制需要登录的公钥信息(一般为本地主机用户目录下的.ssh/id_rsa.pub​​文件,可由ssh-keygen -t rsa​​命令生成)到authorized_keys​​文件中

    先在宿主主机上生成公钥信息

    vbnet 复制代码
    PS C:\Users\fe> ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (C:\Users\fe/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in C:\Users\fe/.ssh/id_rsa
    Your public key has been saved in C:\Users\fe/.ssh/id_rsa.pub
    The key fingerprint is:
    SHA256:4GxS2mEgSMtwl+ikCqLyQxqfGqSjJfdo1z8TvVHnLXw fe@DESKTOP-P6LDAHL
    The key's randomart image is:
    +---[RSA 3072]----+
    |ooo.o.           |
    |+.+o..           |
    | *    =          |
    |+ .  B o    . .  |
    |=.  o = S. . + . |
    |B .  o  . o   + E|
    |**o. .   . o   o |
    |o**o. . o .      |
    |oo.o.  ..o       |
    +----[SHA256]-----+
    PS C:\Users\fe>

    在镜像中生成SSH公钥,需要注意和宿主主机的密码要一样,清空生成的公钥,将宿主主机的拷贝进去

    swift 复制代码
    root@c16b58f160b4:/# mkdir root/.ssh
    root@c16b58f160b4:/# ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:ULPTasWZNizIrAaEUIfB1oaSGBKBAHhZ+MqvWvo0YSU root@c16b58f160b4
    The key's randomart image is:
    +---[RSA 2048]----+
    |/O+Oo   o        |
    |O.O.oo o * o     |
    | +Eo. = + X      |
    |   +.. . * .     |
    | .o.o   S        |
    | .oo   .         |
    |  +.             |
    | + ..            |
    |ooo.             |
    +----[SHA256]-----+
    root@c16b58f160b4:/# cd root/.ssh
    root@c16b58f160b4:~/.ssh# echo "">authorized_keys
    root@c16b58f160b4:~/.ssh# cat authorized_keys
    
    root@c16b58f160b4:~/.ssh# echo "SHA256:IW9kwdcYgPIvqv5h8VF2L5JvDERWYaEJm0U1pXYQsmE fe@DESKTOP-P6LDAHL"
    SHA256:IW9kwdcYgPIvqv5h8VF2L5JvDERWYaEJm0U1pXYQsmE fe@DESKTOP-P6LDAHL
    root@c16b58f160b4:~/.ssh#

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

    ruby 复制代码
    root@c16b58f160b4:/# echo "#! /bin/bash">/run.sh
    root@c16b58f160b4:/# echo "/usr/sbin/sshd -D">>/run.sh
    root@c16b58f160b4:/# cat run.sh
    #! /bin/bash
    /usr/sbin/sshd -D
    root@c16b58f160b4:/# chmod +x run.sh
    root@c16b58f160b4:/# ll *.sh
    -rwxr-xr-x 1 root root 31 Dec  8 06:25 run.sh*
    root@c16b58f160b4:/#

    最后退出容器

  4. 保存镜像

    将所退出的容器使用docker commit​​保存成一个新的镜像

    sql 复制代码
    # docker commit 容器名称或ID 新容器的名称
    PS C:\Users\fe> docker commit one two
    sha256:38c35577d5a096e041f2818ae0c0eaf225d679f35d01a7c7794e76a038150b64
    PS C:\Users\fe> docker images
    REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
    two          latest    38c35577d5a0   47 seconds ago   225MB
    debian       latest    6f4986d78878   23 months ago    124MB
    fedora       latest    b78af7a83692   2 years ago      153MB
    ubuntu       18.04     5a214d77f5d7   2 years ago      63.1MB
    centos       7         eeb6ee3f44bd   2 years ago      204MB
    PS C:\Users\fe>
  5. 使用镜像

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

    arduino 复制代码
    PS C:\Users\fe> docker run -p 10022:22 -d two /run.sh
    c677135d9856b4efaa0efcd74907481367aea1f71110ca98f7f9296623e5c924
    PS C:\Users\fe> docker ps
    CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS          PORTS                   NAMES
    c677135d9856   two            "/run.sh"     8 seconds ago    Up 3 seconds    0.0.0.0:10022->22/tcp   sad_antonelli
    c16b58f160b4   ubuntu:18.04   "/bin/bash"   48 minutes ago   Up 48 minutes                           one
    PS C:\Users\fe>

    宿主机连接容器

使用Dockerfile创建

  1. 创建工作目录,创建Dockerfile​​和run.sh​​文件

  2. 编写run.sh​​脚本和authorized_key​​文件

    bash 复制代码
    #!/bin/bash
    /usr/sbin/sshd -D

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

    vbnet 复制代码
    PS E:\otherCode\studydocker> ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (C:\Users\fe/.ssh/id_rsa): 123456
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in 123456
    Your public key has been saved in 123456.pub
    The key fingerprint is:
    SHA256:715+8zxeH1bgL5+fiv3+kBw/JYHIWG6cjrXfealJNjQ fe@DESKTOP-P6LDAHL
    The key's randomart image is:
    +---[RSA 3072]----+
    |          .      |
    |         * o .   |
    |        . O . o  |
    |         = . . o |
    |        S o  E+ o|
    |         . ..o.B+|
    |          . o+B==|
    |         . o= BBB|
    |         .o..*=O@|
    +----[SHA256]-----+
    PS E:\otherCode\studydocker> cat ~/.ssh/id_rsa.pub >authorized_keys
    PS E:\otherCode\studydocker> 

    这样会将生成的ssh密钥对复制到项目附录中,复制的文件有123456​​ 123456.pub​​ authorized_keys​​文件

  3. 编写Dockerfile​​文件

    bash 复制代码
    #设置继承镜像
    FROM ubuntu:18.04
    LABEL author="zhonghao"
    #下面开始运行命令,此处更改ubuntu的源为国内163的源
    RUN echo "deb http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse" > /etc/apt/sources.list
    RUN echo "deb http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list
    RUN echo "deb http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list
    RUN echo "deb http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse" >> /etc/apt/sources.list
    RUN echo "deb http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list
    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
    #复制配置文件到相应位置,并赋予脚本可执行权限
    COPY ./authorized_keys  /root/.ssh/authorized_keys
    COPY ./run.sh /run.sh
    RUN chmod 755 ./run.sh
    #开放端口
    EXPOSE 22
    #设置自启动命令
    CMD ["/run.sh"]
  4. 创建镜像

    在项目目录下,使用docker build​​命令创建镜像,需要注意在最后面还有一个.​​,表示使用当前目录中的Dockerfile​​文件

    erlang 复制代码
    docker build -t sshtest .

    如果使用Dockerfile​​创建自定义镜像,那么需要注意的是Docker​​会自动删除中间临时创建的层,还需要注意每一步的操作和编写的Dockerfile​​中的命令对应关系

    命令执行完成之后,看见Successfully build XXX​​表示镜像创建成功,

    在本地查看镜像是否存在

    sql 复制代码
    PS E:\otherCode\studydocker> docker images
    REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
    sshtest      latest    34ea5508604c   24 seconds ago   225MB
    two          latest    281d86e17a1a   10 days ago      225MB
    <none>       <none>    61eaf694493c   10 days ago      225MB
    <none>       <none>    38c35577d5a0   10 days ago      225MB
    debian       latest    6f4986d78878   24 months ago    124MB
    fedora       latest    b78af7a83692   2 years ago      153MB
    ubuntu       18.04     5a214d77f5d7   2 years ago      63.1MB
    centos       7         eeb6ee3f44bd   2 years ago      204MB
  5. 测试镜像,运行容器

    使用刚才创建的镜像运行容器,

    arduino 复制代码
    PS E:\otherCode\studydocker> docker run -d -p 10002:22 sshtest
    ae6c8d1a098fa7370cfd9c5977a57236ffe68e918b2b7be5a13a100efd9775a0
  6. 失败 没有连接成功,原因未知

相关推荐
芥子沫1 分钟前
提示词管理工具推荐prompt-manage,Docker一键部署和使用指南
docker·容器·prompt·提示词
TeamDev6 分钟前
使用 Docker 部署 DotNetBrowser 应用程序
运维·ui·docker·容器·桌面应用·dotnet·dotnetbrowser
ErizJ10 分钟前
面试 | Docker K8S
docker·面试·kubernetes
食指Shaye13 分钟前
docker的学习日记
学习·docker·eureka
℘团子এ14 分钟前
什么是Docker
前端·docker·容器
Rsun0455124 分钟前
Docker部署项目
运维·docker·容器
janthinasnail27 分钟前
使用Docker安装OpenClaw
docker·容器·openclaw
小夏卷编程9 小时前
Ubuntu 20.04.4 宝塔 docker showdoc v3.2 更新到v3.7.3
运维·docker·容器
JEECG低代码平台10 小时前
JeecgBoot低代码平台 Docker 部署 OnlyOffice 文档服务完整指南
低代码·docker·容器
生活爱好者!10 小时前
NAS帮我找回童年的快乐!部署 小游戏
运维·服务器·docker·容器·娱乐