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

最新文章

  1. 用Broadcast广播在activity之间、fragment之间、activity和fragment之间相互传数据
  2. 在AWS中创建NAT节点
  3. show一下自己的文档编写功底
  4. (转) 一步一步学习ASP.NET 5 (四)- ASP.NET MVC 6四大特性
  5. Android 基础
  6. Android Phonebook编写联系人UI加载及联系人保存流程(五)
  7. FreeMarker语法知识
  8. GRIDVIEW传值的两种方法
  9. HDU 5289 Assignment
  10. Tcp服务端判断客户端是否断开连接
  11. C51汇编语言完整源码
  12. 五、Hive
  13. [BZOJ1385] [Baltic2000] Division expression (数学)
  14. Insertion Sort(Java)
  15. c# js 删除table原行数据
  16. RabbitMQ与消息总线
  17. linux manjaro 配置 pytorch gpu 环境
  18. 连接池commons-pool2
  19. APP网络优化篇
  20. 如何将同一云服务下的虚拟机从经典部署模型迁移到 Azure Resource Manager

热门文章

  1. JavaScript location对象、Navigator对象、Screen对象简介
  2. Configurate root account
  3. 深入浅出ReentrantLock源码解析
  4. 使用 JS 开发 Github Actions 实现自动部署前后台项目到自己服务器
  5. SSM框架前后端信息交互
  6. window下远程连接redis服务
  7. Go的100天之旅-07条件和循环
  8. vue : 检测用户上传的图片的宽高
  9. corosync+pacemaker高可用集群
  10. [redis] -- 持久化机制篇