当前位置:   article > 正文

[docker] docker 安全知识 - docker 系统性简介

[docker] docker 安全知识 - docker 系统性简介

[docker] docker 安全知识 - docker 系统性简介

今年的 security training 选的 topic 就是 docker 了,为了过这个 training 于是先把 docker 过了一遍(笑死

之前干啃的时候确实觉得不太能看下去,不过走了一遍实践之后发现就比较好理解

运作流程

docker 本身的作用还是可以更快地部署项目,不管是传统的全体打包、使用 VM,或者是使用 docker,开发流程依然是:

开发
打包
传送
部署

但是三者对比起来还是比较明显的,这张图可以比较好的说明三者的区别:

在这里插入图片描述

传统模式下,所有的项目都会打包在一台服务器上——大多数情况下公司会拥有这台服务器

虚拟化模式下,每一个项目会单独在一台虚拟机上,随后服务器上会安装不同的虚拟机,最终实现部署。VM 本身就有一个完整的操作系统,服务器上需要安装 hypervisor 进行 VM 的管理,所以这个实现相对而言也是比较吃资源的实现

docker 容器化实现则是使用容器取代了 VM,docker engine 取代了 hypervisor,最主要的是,docker 会使用服务器的 kernel 去运行容器,因此并不需要像 VM 一样重新安装虚拟机

当然,这是理论上的实现,实际上更为复杂一些:

  • Linux

    Linux 情况下 docker 会使用服务器的 kernel

  • MacOS

    docker 还是会使用一个 Linux 的 VM 去运行 docker

  • Windows

    docker 会使用 WSL 或者 Hyper-V。前者是 windows 自己支持的 linux kernel,后者则还是要开一个 VM,然后在 VM 上运行 docker

表格的对比如下:

优点缺点
传统完全控制
有些情况下性能更好,尤其是小型公司,项目更新的不是很勤快的情况下
扩展很困难也很麻烦
维护困难
依赖管理困难
虚拟化环境一致性
高孤立性
有可移植性
资源过载
配置较慢
docker环境一致性
相对孤立性
高移植性
资源有效利用
启动快
管理方便
学习曲线陡峭
安全性
数据持久化管理复杂

关于 kernel 的补充如下:

在这里插入图片描述

OS 是一个 software,所以 kernel 介于 OS 和硬件之间

镜像容器管理

镜像是一个 轻量 的,独立 的,包含一切需要运行一个应用的 软件可执行环境配置,它可以被视为是容器的 蓝图

容器是镜像的实例,因此它自然也包含了所有镜像有的特征

docker hub

docker hub 是 docker images 的一个公共 registry,目前主流的工具都会在 docker hub 上提供官方的镜像,包括 mysql,node,java,tomcat 等。注意下载镜像的时候一定要看,docker hub 有没有认证对应的镜像,如:

在这里插入图片描述

说到 docker registry,其实也可以用私有的……或者说大型公司都会用私有 registry

另外还有一个比较有趣的 term,叫 golden image,一般商用的都是 golden image,这种镜像一般指的是遵从最佳时间,只运行所需的功能的镜像

docker engine

docker engine 是整个 docker 的核心组件,它负责管理、创建、运行 docker 容器,其主要组成部件为:

  • Docker Daemon (dockerd)

    这是整个 docker 最核心也是最底层的组件,他会根据从 Docker API 发来的请求进行对应的操作

    具体这部分不会有太多的涉及,只需要知道有这个组件即可

  • Docker API

    这个直接使用的场景很少,但是通过 CLI 使用的情况很多,不过本质上还是通过 restful api 的方式实现的,比如说我可以 curl 一下 docker 的 socket,查询一下 docker 所有使用的 socket:

    在这里插入图片描述

    这里输出的结果就是没有 pretty print 的 json 文件

  • Docker CLI (docker)

    这里也就是跑 docker start, docker pull, docker build 等指令的地方

    注意 CLI 和 Daemon 是通过 restful 请求实现的,可以理解成每一个指令都向 Docker Daemon 发出了一个 request,随后 Docker Daemon 完成了对应的指令后,会发出 response

    这也是为什么运行 docker inspect 运行的结果是 JSON 的原因

在这里插入图片描述

⚠️:其实这里细想能够发现一个问题,那就是 docker engine 是可以创建 unix socket,并且与 host machine 进行交流。同样,通过 restful 的请求可以获取所有的信息,这是因为 Docker Daemon 在默认情况下是以 root 权限去运行的,而这可能会带来一系列的风险

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/501218
推荐阅读
相关标签