zoukankan      html  css  js  c++  java
  • 构建一个拥有sshd服务的docker镜像

    不直接描述结果,通过一个过程探究如何写一个 Dockerfile

    一、环境

    虚拟机CentOS7.4,Docker1.13.1

    二、尝试步骤

    1.下载基础镜像 docker pull alpine:3.8

    下载镜像的时候习惯带上tag,否则下载的是 latest,后面不知道具体的版本。在 Dockerfile 的编写中也需要注意,指定具体的版本,不然当有了新的版本发布后,这个 Dockerfile 就会有差异了

    2.启动一个容器

    docker run -itd -p 10022:22 -v /home/docker-volume:/home alpine:3.8

    -p将容器的 22 端口暴露出来是方便测试 sshd,挂载卷是为了后面步骤拷贝文件需要

    3.进入容器

    docker exec -it 8f sh

    添加阿里云软件源

    更新软件,安装open-ssh

    apk update

    apk add openssh-server

     直接启动 sshd 会出现如下错误:

    需要安装一个服务管理软件

    但是安装 openrc 后还是会有如下问题。原因是,容器本身是一个进程,已经是属于 init 0 进程的,不能使用/init.d下来启动

     

    所以使用 /usr/sbin/sshd -D 方式启动。但是又出现如下错误,查看是由于没有公钥文件,ls /etc/ssh 下只有sshd_config 配置

    使用下述方式创建公钥

    ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
    ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
    ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key

    创建完成后,/usr/sbin/sshd -D 启动成功

    此处先拷贝 ssh 配置到 /home 目录下,后续步骤使用

    cp /etc/ssh/* /home

    三、编写Dockerfile

    编写 dockerfile 的过程就是将上述手动操作的过程,翻译成 dockerfile 的语法。

    FROM alpine:3.8
    
    # 拷贝软件园文件和公钥文件到容器内 COPY file/ /tmp/
    # 先替换软件源 RUN mv /tmp/repositories /etc/apk/repositories
    # 安装 sshd 软件 && apk update && apk add openssh-server --no-cache
    # 拷贝公钥文件 && mv /tmp/ssh* /etc/ssh/
    # 修改初始密码 && echo "root:admin" | chpasswd
    # 清理环境 && rm -rf /var/cache/apk/* /tmp/* # 暴露22端口 EXPOSE 22 # 启动 sshd 服务 CMD ["/usr/sbin/sshd", "-D"]

    将公钥文件放在目录 file 下,Dockerfile 文件与 file 目录放在同一级目录下。然后执行命令,docker build -t alpine-sshd:v1 . 进行构建。完成后能在 docker images 镜像中看见

    测试:

    docker run -itd -p 10022:22 alpine-sshd:v1 启动一个容器,然后使用命令 ssh root@[ip] 10022 连接到容器

    到此,整个编写 Dockerfile 的流程就结束了。但是上面的 Dockerfile 还能优化一下

    四、进阶

    比如,初始密码不能通过启动参数修改,启动服务没有使用启动脚本,扩展性不好等

    对于以上修改后的文件链接:https://github.com/ucookie/DockerBuild/tree/master/alpine-sshd,可以直接构建

  • 相关阅读:
    适配器模式
    代理模式
    单例模式
    构建者(建造者)模式
    js Math方法
    补零
    js中十进制与二进制、八进制、十六进制的互相转换
    js生成一个范围内随机数Math.random
    js不改变原数组的情况下取数值数组的最大值和最小值
    自己封装方法,功能跟数组的indexof一样
  • 原文地址:https://www.cnblogs.com/newguy/p/9478455.html
Copyright © 2011-2022 走看看