记录我的一些生活写照、无聊的牢骚、内心世界的活动 注册 | 登陆

在Alpine容器中安装配置ssh服务端

在Alpine容器中安装配置ssh服务端

Alpine是一个极其轻量级的Linux,通常用作制作Docker镜像,今天就来分享一下如何在Alpine容器中安装配置ssh并远程连接。
XML/HTML代码
  1. #创建macvlan网络(支持Ipv6)
  2. 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
  3. #使用宿主机的网络映射端口
  4. docker run -d --name alpine --hostname alpine -p 1122:22 -it --privileged=true --restart=always alpine
  5. #使用macvlan网络给容器独立IP,无需映射端口
  6. 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代码
  1. docker exec -it alpine /bin/sh
  2. sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
或者使用中科大源
XML/HTML代码
  1. https://mirrors.ustc.edu.cn/alpine/latest-stable/main
  2. https://mirrors.ustc.edu.cn/alpine/latest-stable/community
然后安装ssh服务端:
XML/HTML代码
  1. apk add --no-cache openssh-server
安装完成后,进入/etc/ssh目录生成密钥:
XML/HTML代码
  1. cd /etc/ssh
  2. ssh-keygen -A
到此,就安装完成了!
配置root用户可以远程连接
XML/HTML代码
  1. sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
启动sshd服务
通过下列命令启动:
XML/HTML代码
  1. /usr/sbin/sshd
没有任何输出说明启动成功,这个时候就可以在容器外通过ssh访问了!
需要注意的是,由于容器中使用open-rc服务管理器有很多限制,因此这里是使用的手动启动的方式,这意味着每次重启容器sshd不会启动,因此进入容器需要手动执行上述命令启动服务。
如果是要自己制作镜像并集成ssh,那么可以将上述启动命令写在Dockerfile中的CMD字段作为容器启动命令。
XML/HTML代码
  1. CMD ["/usr/sbin/sshd", "-D"]
配置文件
修改完成配置文件后,通过下列命令重启sshd即可:
XML/HTML代码
  1. kill -9 $(pidof sshd)
  2. /usr/sbin/sshd
通过以上方法可以给任意没有ssh服务的系统,比如Debian,centos之类系统安装ssh服务,只需要命令改成各自系统的就可以。缺点就是需要手动启动ssh服务,不方便使用,最好编写Dockerfile文件,直接生产自己需要的成品镜像。
编写Dockerfile
在任意目录创建并编辑Dockerfile文件,写入如下内容
XML/HTML代码
  1. FROM alpine:latest
  2.  
  3. #替换中科大源并更新源、安装openssh等基础软件并修改配置文件和生成key并且同步时间
  4. RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \
  5.     && apk update \
  6.     && apk add --no-cache openssh tzdata bash\
  7.     && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
  8.     && sed -i "s/#PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_config \
  9.     && ssh-keygen -t dsa -P "" -f /etc/ssh/ssh_host_dsa_key \
  10.     && ssh-keygen -t rsa -P "" -f /etc/ssh/ssh_host_rsa_key \
  11.     && ssh-keygen -t ecdsa -P "" -f /etc/ssh/ssh_host_ecdsa_key \
  12.     && ssh-keygen -t ed25519 -P "" -f /etc/ssh/ssh_host_ed25519_key \
  13.     && echo "root:123456" | chpasswd \
  14.     && rm -rf /var/lib/apt/lists/* \
  15.     && rm /var/cache/apk/*
  16.  
  17. #开放22端口
  18. EXPOSE 22
  19.   
  20. #执行ssh启动命令
  21. CMD ["/usr/sbin/sshd", "-D"]
然后生成制定名称的镜像(alpine:sshd)名称可以任意修改
XML/HTML代码
  1. docker build -t alpine:sshd .
如需安装其他自己需要的软件,可以参考下面的参数,进行修改。
XML/HTML代码
  1. # Install
  2. RUN apk update \
  3.     && apk add --no-cache --upgrade openssh-server \
  4. # Utils
  5.     && apk add --no-cache --upgrade mc htop iotop ncdu tar zip nano vim bash sudo sed \
  6. # Net utils
  7.     && apk add --no-cache --upgrade iputils paris-traceroute perl-net-telnet bind-tools iperf nmap \
  8. #Cleaning
  9.     && rm -rf /var/lib/{apt,dpkg,cache,log}/ \
  10.     && rm -rf /var/lib/apt/lists/*.lz4 \
  11.     && rm -rf /var/log/* \
  12.     && rm -rf /tmp/* \
  13.     && rm -rf /var/tmp/* \
  14.     && rm -rf /usr/share/doc/ \
  15.     && rm -rf /usr/share/man/ \
  16.     && rm -rf /var/cache/apk/* \
  17.     && rm -rf $HOME/.cache \
以下是centos6的Dockerfile的参考文件
XML/HTML代码
  1. # 选择一个已有的os镜像作为基础
  2. from Centos:centos6
  3.  
  4. # 镜像的作者
  5. maintainer fanbin kong "kongxx@hotmail.com"
  6.  
  7. # 安装openssh-server和sudo软件包,并且将sshd的usepam参数设置成no
  8. run yum install -y openssh-server sudo
  9. run sed -i 's/usepam yes/usepam no/g' /etc/ssh/sshd_config
  10.  
  11. # 添加测试用户admin,密码admin,并且将此用户添加到sudoers里
  12. run useradd admin
  13. run echo "admin:admin" | chpasswd
  14. run echo "admin  all=(all)    all" >> /etc/sudoers
  15.  
  16. # 下面这两句比较特殊,在centos6上必须要有,否则创建出来的容器sshd不能登录
  17. run ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
  18. run ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
  19.  
  20. # 启动sshd服务并且暴露22端口
  21. run mkdir /var/run/sshd
  22. expose 22
  23. cmd ["/usr/sbin/sshd", "-d"]
最后可以用macvlan直接创建一个Alpine,然后远程ssh登录,默认root密码123456,看看是不是成功
XML/HTML代码
  1. #macvlan独立IP使用默认22端口
  2. docker run  -d --name alpine --hostname alpine --net=macnet --ip 192.168.0.211 -i -t --privileged=true --restart=always  alpine:sshd
  3. #使用宿主机IP映射22端口
  4. docker run  -d --name alpine --hostname alpine -p 2222:22 -i -t --privileged=true --restart=always  alpine:sshd
当然最简单的还是用人家做好的成镜像
XML/HTML代码
  1. #macvlan独立IP使用默认22端口
  2. docker run  -d --name alpine --hostname alpine --net=macnet --ip 192.168.0.211 -i -t --privileged=true --restart=always  bimg/alpine-ssh
  3. #使用宿主机IP映射22端口
  4. 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

« 上一篇 | 下一篇 »

发表评论

评论内容 (必填):