不直接描述结果,通过一个过程探究如何写一个 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,可以直接构建

构建一个拥有sshd服务的docker镜像的更多相关文章

  1. 从零开始构建一个centos+jdk7+tomcat7的docker镜像文件

    从零开始构建一个centos+jdk7+tomcat7的镜像文件 centos7系统下docker运行环境的搭建 准备centos基础镜像 docker pull centos 或者直接下载我准备好的 ...

  2. 基于CentOS的SSHD服务的Docker镜像

    原文地址 1.Dockerfile文件 FROM registry.aliyuncs.com/acs-sample/centos:6 MAINTAINER xuqh "xqh_163@163 ...

  3. 利用Dockerfile文件创建带有sshd服务的centos镜像

    利用Dockerfile文件创建带有sshd服务的centos镜像 标签:dockerfile 1.安装docker并启动docker,不在赘述 2.创建使用Dockerfile安装sshd服务的目录 ...

  4. CoSky-Mirror 就像一个镜子放在 Nacos、CoSky 中间,构建一个统一的服务发现平台

    CoSky 基于 Redis 的服务治理平台(服务注册/发现 & 配置中心) Consul + Sky = CoSky CoSky 是一个轻量级.低成本的服务注册.服务发现. 配置服务 SDK ...

  5. [译]Spring Boot 构建一个RESTful Web服务

    翻译地址:https://spring.io/guides/gs/rest-service/ 构建一个RESTful Web服务 本指南将指导您完成使用spring创建一个“hello world”R ...

  6. 使用commit方式构建具有sshd服务的centos镜像

    一般我们是通过SSH服务来管理服务器的,但是现在很多Docker镜像不带SSH服务,那我们该如何来管理这些容器呢?现在我们通常使用attach和nsenter工具.但是都无法解决远程管理容器的问题,当 ...

  7. Centos7创建支持ssh服务的docker镜像

    如何在centos7中使用docker创建一个支持ssh连接的容器 1.拉取centos7.4镜像(由于7.4目前是最稳定的版本,所以推荐使用centos7.4) docker pull centos ...

  8. 「六」创建一个带 weblogic 服务的基础镜像

    Weblogic Weblogic 简单介绍以及其在 Docker 环境下的特殊应用 WebLogic是美国Oracle公司出品的一个application server确切的说是一个基于JAVAEE ...

  9. 构建一个java环境的centos系统镜像并上传到阿里云镜像仓库

    编辑dockerfile 文件 FROM centos MAINTAINER zhaoweifeng ENV LANG en_US.UTF-8 RUN /bin/cp /usr/share/zonei ...

随机推荐

  1. 核心知识点:python入门

    目录 一.python入门day1-day24 day01-03 编程语言 day04 变量 day05 垃圾回收机制(GC机制) 1 引用计数 2 标记清除 3 分代回收 day05 程序交互与基本 ...

  2. Windows Socket编程精华《TCP通信服务器》

    1.网络中进程之间如何通信? 首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们解决了这个问 ...

  3. 记一次WPF程序带参数启动

    问题:总共有两个程序.第一个程序使用Process带参数启动第二个程序. 网上一堆人都说什么重写Main入口啊 什么的.然后还一堆人跟着复制发文章.我也是醉了,简直是坑人.为何要舍近求远,直接重写AP ...

  4. python数据处理(四)之数据获取与存储

    1.前烟 几个数据问题 1.1 是否能够联系上作者本人 1.2 数据是否定期检查错误并更新 1.3 数据是否包含数据获取方法的信息,是否包含数据获取过程中使用的样本类型 1.4 有没有其他数据源可以验 ...

  5. Java对象与Json字符串的转换

    Java对象与Json字符串的转换 JSON是一种轻量级的数据交换格式,常用于前后端的数据交流 后端 : 前端 Java对象 > JsonString Java对象 < jsonStrin ...

  6. 一个例子理解c++函数模板的编译

    一.例子 template <typename T> inline void callWithMax(const T& a, const T& b){ f(a > b ...

  7. MySQL 面试题 24 问

    MySQL 是数据库中的主流中的主流,小中性公司基本都以它为主,而作为后端开发和数据库工程师来说,MySQL 是面试必须要过的一关.以下是小编整理网络的 MySQL 面试高频题,希望对大家有所帮助. ...

  8. Java常用API(Math类)

    Java常用API(Math类) Math类的作用 java.lang.Math 类包含用于执行基本数学运算的方法,如初等指数.对数.平方根和三角函数.类似这样的工具 类,其所有方法均为静态方法,并且 ...

  9. Linux下显示运行时链接(运行时加载)

    目录 介绍 如何加载动态库 dlopen() 第一个参数: 被加载动态库的路径 第二个参数: flag表示函数符号的解析方式 dlopen 返回值 dlsym() 参数: 返回值 符号优先级 dler ...

  10. 图解:如何实现最小生成树(Prim算法与Kruskal算法)

    这是图算法的第四篇文章 图解:如何实现最小生成树 文章目录: 1.概念和性质 2.思路探索 3.Kruskal算法 4.Prim算法 5.代码实现 1.概念和性质 今天我们考虑的模型是加权无向图,问题 ...