可视化工具

  • portainer
  • rancher

    portainer

  • 定义:

    • docker 图形化管理工具, 提供一个后台面板供我们操作
  • 安装命令: ```shell

    —restart: 一个方式

    -v: 挂载用

    —privileged: 授权用

    docker run -d -p 8088:9000 —restart=always -v /var/run/docker.sock:/var/run/docker.sock —privileged=true portainer/portainer

访问测试:

服务器IP:8088 (如下图所示)

  1. - 访问portainer:
  2. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/2516625/1643543487624-3a0112f4-5188-442a-b970-c4bac0a30a77.png#clientId=u120e5a6d-be24-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=893&id=ub43bef88&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1563&originWidth=2928&originalType=binary&ratio=1&rotation=0&showTitle=false&size=94298&status=done&style=none&taskId=u4ff76342-7d33-4a8a-b751-8d806ba48ea&title=&width=1673.142857142857)
  3. <a name="N4XrQ"></a>
  4. # 镜像
  5. - 定义:
  6. - 一种轻量级, 可执行的独立软件包, 用来打包软件运行环境和基于环境开发的软件, 它包含运行某个软件所需的所有内容, 包括代码, runtime, 库, 环境变量和配置文件
  7. - 注:
  8. - 所有的应用, 直接打包docker 镜像, 就可以直接跑起来
  9. - 如何得到镜像?
  10. - 从远程仓库下载
  11. - 朋友拷贝给你
  12. - 自己制作一个镜像Docker File
  13. <a name="sZYFv"></a>
  14. ## 镜像加载原理
  15. <a name="U8FTk"></a>
  16. ### UnionFS (联合文件系统)
  17. - 定义:
  18. - Union 文件系统 (UnionFS) 是一种分层, 轻量级并且高性能的文件系统, 它支持文件系统的修改作为一次提交来一层层的叠加, 同时可以将不同目录挂载到同一个虚拟文件系统下 (unite serveral directories into a single virtual file system). Union 文件系统是Docker 镜像的基础. 镜像可以通过分层来继承, 基于基础镜像 (没有父镜像), 可以制作各种具体的应用镜像.
  19. <a name="DyJA3"></a>
  20. ### Docker 镜像加载原理
  21. - Docker 的镜像实际上由一层一层的文件系统组成, 这种层级的文件系统是UnionFS (联合文件系统)
  22. - BootFS (boot file system) 主要包含bootloader kernel, bootloader 主要是引导加载kernel, Linux 刚启动时会加载BootFS 文件系统, Docker 镜像的最底层是BootFS. 这一层与我们典型的Linux/Unix 系统是一样的, 包含bootloader kernel. bootloader 加载完成之后整个内核就都在内存中了, 此时内存的使用权已由BootFS 转交给内核, 此时系统也会卸载BootFS.
  23. - RootFS (root file system), BootFS 之上. 包含的就是典型Linux 系统中的/dev, /proc, /bin, /etc 等标准目录和文件. RootFS 就是各种不同的操作系统发行版, 比如Ubuntu, CentOS 等等.
  24. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/2516625/1643550876404-4afeb4a4-4ccf-479d-b781-f333196736be.png#clientId=u120e5a6d-be24-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=375&id=u4174577a&margin=%5Bobject%20Object%5D&name=image.png&originHeight=657&originWidth=1795&originalType=binary&ratio=1&rotation=0&showTitle=false&size=511767&status=done&style=none&taskId=ucb8551f0-2b0f-4125-b892-90b03a648bd&title=&width=1025.7142857142858)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/2516625/1643698819588-580d6c37-5fc1-4248-81b3-ce66d439683b.png#clientId=uc0708fd6-e55d-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=421&id=u1d835fab&margin=%5Bobject%20Object%5D&name=image.png&originHeight=736&originWidth=1037&originalType=binary&ratio=1&rotation=0&showTitle=false&size=303304&status=done&style=none&taskId=u51d58183-4214-4042-a4fa-a48e9109118&title=&width=592.5714285714286)
  25. - 简单的理解:
  26. - BootFS 是所有Linux 系统 (Ubuntu, CentOS 等) 都通用的且不会变 (加载器和内核, 系统的组成部分, 加载器负责将内核加载到内存, 全部加载完毕后系统就启动了)
  27. - RootFS 就是负责调用BootFS 的指令, 相当于一个包装器, 不同的包装器 + BootFS 就形成了不同的Linux 系统版本
  28. - **对于在pull 时看到的layer, 可以理解为不同的RootFS, 将指令和所需文件变成了不同的层级以便于复用, 共享同一个BootFS**
  29. - 问题:
  30. - 平时我们安装进虚拟机的CentOS 都是好几个G, 为什么Docker CentOS 镜像才200M?
  31. - 因为对于一个精简的OS, RootFS 可以很小, 只需要包含最基本的命令, 工具和程序库就可以了, **因为底层直接用Host Kernel, 自己只需要提供RootFS 就可以了, 这就是为什么虚拟机笨重且启动慢, 而容器可以秒级启动, 因为容器是依赖宿主机的, 宿主机的内核已经在内存里面了, 无需加载!** 由此可见对于不同的Linux 发行版, **BootFS 基本是一致的, RootFS 会有差别, 因此不同的发行版可以公用BootFS.**
  32. <a name="BNfzF"></a>
  33. ## 分层理解
  34. - 当使用Docker 去下载一个镜像时, 可以看到镜像的内容是分层下载的:
  35. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/2516625/1643552261568-e2489f14-414b-46bf-9762-954fb0b0a130.png#clientId=u120e5a6d-be24-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=271&id=u5e4bd1d0&margin=%5Bobject%20Object%5D&name=image.png&originHeight=475&originWidth=1620&originalType=binary&ratio=1&rotation=0&showTitle=false&size=55448&status=done&style=none&taskId=u64ac123d-440b-4fb6-a18a-dea89029579&title=&width=925.7142857142857)
  36. - 所有的Docker 镜像都起始于一个基础镜像层, 当进行修改或增加新的内容时, 就会在当前镜像层之上, 创建新的镜像层.
  37. - 举一个简单的例子, 假如基于Ubuntu Linux 16.04 创建一个新的镜像, 这就是新镜像的第一层; 如果在该镜像中添加Python 包, 就会在基础镜像层之上创建第二个镜像层; 如果继续添加一个安全补丁, 就会创建第三个镜像层.
  38. - 该镜像当前包含3 个镜像层, 如下图所示 (这只是一个用于演示的很简单的例子)
  39. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/2516625/1643554289833-3813818e-4c4d-4022-bc50-aba8868edef7.png#clientId=u120e5a6d-be24-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=461&id=u7dd419fa&margin=%5Bobject%20Object%5D&name=image.png&originHeight=807&originWidth=1276&originalType=binary&ratio=1&rotation=0&showTitle=false&size=230626&status=done&style=none&taskId=ud233e77a-cd95-47b4-ab7e-2999dde5fe2&title=&width=729.1428571428571)
  40. - 在添加额外的镜像层的同时, 镜像始终是当前所有镜像的组合, 理解这一点非常重要. 下图中举了一个简单的例子, 每个镜像层包含3 个文件, 而镜像包含了来自两个镜像层的6 个文件.
  41. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/2516625/1643554912629-085036b1-0cc9-4cd4-bae1-f319d7c0d3cf.png#clientId=u120e5a6d-be24-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=390&id=u10d8aa8d&margin=%5Bobject%20Object%5D&name=image.png&originHeight=682&originWidth=1282&originalType=binary&ratio=1&rotation=0&showTitle=false&size=179724&status=done&style=none&taskId=ufd585627-eb59-4f36-b059-947750bba63&title=&width=732.5714285714286)
  42. - 上图中的镜像层跟之前图中的略有区别, 主要目的是便于展示文件.
  43. - 下图中展示了一个稍微复杂的三层镜像, 在外部看来整个镜像只有6 个文件, 这是因为最上层中的文件7 是文件5 的一个更新版本. (文件7 替换文件5)
  44. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/2516625/1643555083321-3e27ba05-69e2-4395-aaa0-e90194486ebf.png#clientId=u120e5a6d-be24-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=522&id=ub49315a8&margin=%5Bobject%20Object%5D&name=image.png&originHeight=914&originWidth=1276&originalType=binary&ratio=1&rotation=0&showTitle=false&size=224186&status=done&style=none&taskId=ucd86e784-7a3a-411b-9aff-c9673ef556f&title=&width=729.1428571428571)
  45. - 这种情况下, 上层镜像层中的文件覆盖了底层镜像层中的文件. 这样就使得文件的更新版本作为一个新镜像层添加到镜像当中.
  46. - Docker 通过存储引擎 (新版本采用快照机制) 的方式来实现镜像层堆栈, 并保证多镜像层对外展示为统一的文件系统
  47. - Linux 上可用的存储引擎有AUFS, Overlay2, Device Mapper, Btrfs 以及ZFS. 顾明思义, 每种存储引擎都基于Linux 中对应的文件系统或者块设备技术, 并且每种存储引擎都有其独有的性能特点.
  48. - Docker Windows 上仅支持windowsfilter 一种存储引擎, 该引擎基于NTFS 文件系统之上实现了分层CoW.
  49. - 下图展示了与系统显示相同的三层镜像. 所有镜像层堆叠并合并, 对外提供统一的试图.
  50. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/2516625/1643555745332-0d0cdda3-6626-4229-9d0a-5147db88a9cc.png#clientId=u120e5a6d-be24-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=265&id=ue864a307&margin=%5Bobject%20Object%5D&name=image.png&originHeight=463&originWidth=1516&originalType=binary&ratio=1&rotation=0&showTitle=false&size=147252&status=done&style=none&taskId=u294c3bf6-a680-455a-ace4-682181e1bfd&title=&width=866.2857142857143)
  51. - 特点:
  52. - **Docker 镜像都是只读的, 当容器启动时, 一个新的可写层被加载到镜像的顶部**
  53. - **这一层就是我们通常说的容器层, 容器层之下都叫镜像层**
  54. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/2516625/1643556003790-becd2494-3965-4d05-8dcf-71541d68f974.png#clientId=u120e5a6d-be24-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=255&id=u8fa3f639&margin=%5Bobject%20Object%5D&name=image.png&originHeight=446&originWidth=2209&originalType=binary&ratio=1&rotation=0&showTitle=false&size=218801&status=done&style=none&taskId=u47c11ee9-7bc9-4c14-9dde-e7b53a93aa9&title=&width=1262.2857142857142)
  55. <a name="z8FWH"></a>
  56. ## 自定义镜像
  57. - 我们日常拉取的镜像是由别人制作再提交到仓库的。
  58. - 我们自己也是可以制作镜像并提交的,使用 docker commit 命令。
  59. <a name="rvx2e"></a>
  60. ### 提交镜像 (docker commit)
  61. - 语法
  62. ```shell
  63. docker commit [参数] 容器 [仓库[:标签]]
  • 参数
    • -a:作者信息。一般为 作者名字<邮箱>
    • -c:将 Dockerfile 指令应用于创建的映像。
    • -m:注释信息。
    • -p:提交期间暂停容器(默认)。
  • 作用:
    • 如果想要保存当前容器的状态, 就可以通过commit 来提交, 获得一个镜像, 就比如VM 的快照
  • 例子
    • 制作自定义镜像, 如下图:

image.png

  • 启动自定义镜像:

    1. docker run -it -p 8081:8080 tomcat-2:1.0
  • 访问测试:

image.png