<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/ DTD/wml_1.1.xml">

<wml>
<head>
<meta http-equiv="cache-control" content="max-age=180,private" />
</head>
<card title="在Alpine容器中安装配置ssh服务端">
<p>
作者:<a href="index.php?action=showuser&amp;userid=1&amp;hash=">admin</a><br />时间:2023-07-13 09:44<br />分类:<a href="index.php?action=list&amp;cid=3&amp;hash=">电脑技术</a><br />内容:
在Alpine容器中安装配置ssh服务端




Alpine是一个极其轻量级的Linux，通常用作制作Docker镜像，今天就来分享一下如何在Alpine容器中安装配置ssh并远程连接。






XML/HTML代码


    #创建macvlan网络（支持Ipv6）

    docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 --ipv6 --subnet=2408:8220:723:45a1::/64 --gateway=2408:8220:723:45a1::1 -o parent=eth0 macnet

    #使用宿主机的网络映射端口

    docker run -d --name alpine --hostname alpine -p 1122:22 -it --privileged=true --restart=always alpine

    #使用macvlan网络给容器独立IP，无需映射端口

    docker run -d --name alpine --hostname alpine --net=macnet --ip 192.168.0.211 -it --privileged=true --restart=always alpine




通过以上命令可以快速创建一个Alpine的官方的镜像，不过就是最精简，只有最基本系统，缺少很多常用软件。


安装ssh服务端




创建容器后，就可以通过命令进行安装配置了，记得先把容器的22端口映射出来（macvlan无需映射）！


首先是修改镜像源为国内镜像源（清华大学镜像站），不然下载安装很慢，进入容器后执行：






XML/HTML代码


    docker exec -it alpine /bin/sh

    sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories




或者使用中科大源




XML/HTML代码


    https://mirrors.ustc.edu.cn/alpine/latest-stable/main

    https://mirrors.ustc.edu.cn/alpine/latest-stable/community




然后安装ssh服务端：




XML/HTML代码


    apk add --no-cache openssh-server





安装完成后，进入/etc/ssh目录生成密钥：




XML/HTML代码


    cd /etc/ssh

    ssh-keygen -A







到此，就安装完成了！


配置root用户可以远程连接




XML/HTML代码


    sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config




启动sshd服务






通过下列命令启动：




XML/HTML代码


    /usr/sbin/sshd




没有任何输出说明启动成功，这个时候就可以在容器外通过ssh访问了！


需要注意的是，由于容器中使用open-rc服务管理器有很多限制，因此这里是使用的手动启动的方式，这意味着每次重启容器sshd不会启动，因此进入容器需要手动执行上述命令启动服务。


如果是要自己制作镜像并集成ssh，那么可以将上述启动命令写在Dockerfile中的CMD字段作为容器启动命令。






XML/HTML代码


    CMD [&quot;/usr/sbin/sshd&quot;, &quot;-D&quot;]





配置文件


修改完成配置文件后，通过下列命令重启sshd即可：






XML/HTML代码


    kill -9 $(pidof sshd)

    /usr/sbin/sshd




通过以上方法可以给任意没有ssh服务的系统，比如Debian，centos之类系统安装ssh服务，只需要命令改成各自系统的就可以。缺点就是需要手动启动ssh服务，不方便使用，最好编写Dockerfile文件，直接生产自己需要的成品镜像。


编写Dockerfile


在任意目录创建并编辑Dockerfile文件，写入如下内容




XML/HTML代码


    FROM alpine:latest

     

    #替换中科大源并更新源、安装openssh等基础软件并修改配置文件和生成key并且同步时间

    RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \

        &amp;&amp; apk update \

        &amp;&amp; apk add --no-cache openssh tzdata bash\

        &amp;&amp; cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \

        &amp;&amp; sed -i &quot;s/#PermitRootLogin.*/PermitRootLogin yes/g&quot; /etc/ssh/sshd_config \

        &amp;&amp; ssh-keygen -t dsa -P &quot;&quot; -f /etc/ssh/ssh_host_dsa_key \

        &amp;&amp; ssh-keygen -t rsa -P &quot;&quot; -f /etc/ssh/ssh_host_rsa_key \

        &amp;&amp; ssh-keygen -t ecdsa -P &quot;&quot; -f /etc/ssh/ssh_host_ecdsa_key \

        &amp;&amp; ssh-keygen -t ed25519 -P &quot;&quot; -f /etc/ssh/ssh_host_ed25519_key \

        &amp;&amp; echo &quot;root:123456&quot; | chpasswd \

        &amp;&amp; rm -rf /var/lib/apt/lists/* \

        &amp;&amp; rm /var/cache/apk/*

     

    #开放22端口

    EXPOSE 22

      

    #执行ssh启动命令

    CMD [&quot;/usr/sbin/sshd&quot;, &quot;-D&quot;]




然后生成制定名称的镜像（alpine:sshd）名称可以任意修改




XML/HTML代码


    docker build -t alpine:sshd .




如需安装其他自己需要的软件，可以参考下面的参数，进行修改。




XML/HTML代码


    # Install

    RUN apk update \

        &amp;&amp; apk add --no-cache --upgrade openssh-server \

    # Utils

        &amp;&amp; apk add --no-cache --upgrade mc htop iotop ncdu tar zip nano vim bash sudo sed \

    # Net utils

        &amp;&amp; apk add --no-cache --upgrade iputils paris-traceroute perl-net-telnet bind-tools iperf nmap \

    #Cleaning

        &amp;&amp; rm -rf /var/lib/{apt,dpkg,cache,log}/ \

        &amp;&amp; rm -rf /var/lib/apt/lists/*.lz4 \

        &amp;&amp; rm -rf /var/log/* \

        &amp;&amp; rm -rf /tmp/* \

        &amp;&amp; rm -rf /var/tmp/* \

        &amp;&amp; rm -rf /usr/share/doc/ \

        &amp;&amp; rm -rf /usr/share/man/ \

        &amp;&amp; rm -rf /var/cache/apk/* \

        &amp;&amp; rm -rf $HOME/.cache \




以下是centos6的Dockerfile的参考文件




XML/HTML代码


    # 选择一个已有的os镜像作为基础

    from Centos:centos6

     

    # 镜像的作者

    maintainer fanbin kong &quot;kongxx@hotmail.com&quot;

     

    # 安装openssh-server和sudo软件包，并且将sshd的usepam参数设置成no

    run yum install -y openssh-server sudo

    run sed -i 's/usepam yes/usepam no/g' /etc/ssh/sshd_config

     

    # 添加测试用户admin，密码admin，并且将此用户添加到sudoers里

    run useradd admin

    run echo &quot;admin:admin&quot; | chpasswd

    run echo &quot;admin  all=(all)    all&quot; &gt;&gt; /etc/sudoers

     

    # 下面这两句比较特殊，在centos6上必须要有，否则创建出来的容器sshd不能登录

    run ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key

    run ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

     

    # 启动sshd服务并且暴露22端口

    run mkdir /var/run/sshd

    expose 22

    cmd [&quot;/usr/sbin/sshd&quot;, &quot;-d&quot;]





最后可以用macvlan直接创建一个Alpine，然后远程ssh登录，默认root密码123456，看看是不是成功




XML/HTML代码


    #macvlan独立IP使用默认22端口

    docker run  -d --name alpine --hostname alpine --net=macnet --ip 192.168.0.211 -i -t --privileged=true --restart=always  alpine:sshd

    #使用宿主机IP映射22端口

    docker run  -d --name alpine --hostname alpine -p 2222:22 -i -t --privileged=true --restart=always  alpine:sshd






当然最简单的还是用人家做好的成镜像




XML/HTML代码


    #macvlan独立IP使用默认22端口

    docker run  -d --name alpine --hostname alpine --net=macnet --ip 192.168.0.211 -i -t --privileged=true --restart=always  bimg/alpine-ssh

    #使用宿主机IP映射22端口

    docker run  -d --name alpine --hostname alpine -p 2222:22 -i -t --privileged=true --restart=always  bimg/alpine-ssh




注意以上镜像是使用alpine:3.15.8版本做的，默认账号密码 root:123456。


参考网站：https://github.com/basicimage/alpine-ssh


Dockerhub：https://hub.docker.com/r/bimg/alpine-ssh


debian-ssh镜像：tlze/debian-sshd:latest
</p><p>
<a href="index.php?action=login&amp;hash=">立即登陆发表评论</a><br />
</p>
<p><a href="index.php?action=list&amp;hash=">返回日志列表</a><br /><a href="index.php?action=index&amp;hash=">返回主页</a></p>
</card>
</wml>
