Docker 从零到壹

一个新手对Docker的初探

背景

最近一直在学习ESXi虚拟机,从ESXi的安装到网络管理,再到虚拟机的应用,整个一个流程下来,对虚拟机还是产生了一些厌弃的情况。一方面,ESXi对硬件的兼容性太差,导致很多硬件无法直接在ESXi中使用,这样我就不得不将其直通给某个虚拟机。另一方面,虚拟机之间的隔离性太强了,直通给某个虚拟机就无法方便的共享给另一个虚拟机。这样一来,服务器上资源的分配与使用就成了一个让我头疼的问题。

就在这时,我看到了Docker,觉得其可能是一个很好解决方案。

什么是Docker

“Docker 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松!” – Docker - 从入门到实践

“Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。” – 什么是 Docker

Docker vs 虚拟机

  • 虚拟机
    • Host OS + Virtual Machine + Guest OS + App
    • 优点:隔离性更强
    • 缺点:笨重、额外开销
  • Docker
    • Host OS + Docker + App
    • 优点:轻便、高效
    • 缺点:隔离性比虚拟机差

==> Docker ≠ 虚拟机

Docker替代品

有一种说法,一个工具的好坏在于它是否做好了一件事情。如果一个工具试图把所有事情都做好,往往会适得其反。而Docker就是一个整体解决方案,这在方便用户的同时,也会带来一些问题。当然这个仁者见仁,智者见智,这里就不多说,我们单独了解一下其他容器解决方案。

这里先了解一个规范,开放容器计划(OpenContainer Initiative/OCI),OCI定义了容器运行时、容器分发、容器镜像等规范。因为有了OCI,不同的容器引擎可以和其他工具很好的配合。

Podman

Podman(Pod Manager)是一个由小红帽(RedHat)出品的开源容器方案。这里所说的开源可不是指什么社区版本,而是真正的开源。小红帽在开源社区的影响力很大,Podman的影响力可想而知。

Podman提供的命令与Docker完全兼容,可通过简单的方式完成迁移。

1
alias docker=podman

其它的还没了解,日后再补充。

LXD

LXD是一个专门为Linux容器(LXC)设计的开源容器引擎。官方宣称是下一代容器和虚拟机管理程序。对比Docker,LXD更像一个轻量化的虚拟机解决方案。

ESXi容器方案

VMware Project Pacific:Project Pacific 在 vSphere 平台上原生集成了 Kubernetes,使得 vSphere 平台具有了原生支持容器运行的能力。vSphere 原来也支持容器运行 ,通过 vSphere Integrated Container 或是 VMware Enterprise PKS 来实现,这两种方案都是在虚机环境里运行容器。Project Pacific 使得 vSphere 具有了在 ESXi hypervisor 操作系统中直接运行容器 Pod 的能力。

“Project Pacific 在 vSphere 环境中增加了一种 ESXi 原生的容器运行时环境 CRX (Container Runtime for ESXi ),CRX 是一种轻量级的虚机,其中仅包含 Linux 内核和必要的容器运行环境,Pod 就运行在 CRX 虚机中。ESXi hypervisor 针对 CRX 虚机做了专门的优化,在 vSphere 环境中运行容器能够达到跟物理机同样的性能水平,不用担心由于多了一层虚拟化而带来的性能损失,ESXi 启动一个原生 Pod 只需要花 100 毫秒,在单台服服务器上能够支持上千个 Pod。”

==> 我居然没找到Project Pacific的主页,只有一个Blog页面,看来ESXi原生容器方案可能还是等一等,目前我手上的ESXi 7.0只能通过虚拟机实现容器运行环境。日后再慢慢研究一下VMware CRX。

群晖 + Docker

为什么是群晖

之前提到ESXi的问题,刚好我服务器的SATA控制器直通给了群晖,用以提供NAS存储空间,这导致我Host主机上没有多大的存储空间。本来用Ubuntu+Docker的方案可能会更好一些,但目前只能退而求其次了。

小插曲

为了写文章,我打算把已经安装的Docker删除掉,卸载界面真的让我心里咯噔一下。此共享文件夹是不是彼共享文件夹?我已经不是第一次因为错误理解而丢掉数据了。没办法,做个测试吧,结果虚惊一场。没有哪个软件会这么蠢,把用户的数据删除掉!!!

安装Docker

主菜单 - 套件中心 - 搜索“Docker”

好像群晖上安装Docker也没什么需要注意的,点击“安装”后等一会就完成了。再打开主菜单 - Docker,跳出欢迎界面,并提供了帮助链接,点击打开后有“创建容器”、“常规设置”、“网络设置”等。

2023-05-07-16-56-03@2x

设置镜像加速

在创建容器之前,我们需要先从Docker Hub下载对应的镜像。但是由于官方限制原因,下载镜像的时间可能比较长,甚至下载失败。这里推荐使用一些Docker镜像加速服务。本人使用的是阿里云服务器,这里就用阿里云的镜像加速服务。

登陆阿里云容器镜像服务控制台,在左侧导航栏选择镜像工具 - 镜像加速器,在镜像加速器页面即可获取镜像加速地址。

点击 Dockder - 注册表 - 设置,不要使用群晖自带的‘Aliyun Hub’,已经失效。 2023-05-07-17-28-21@2x

点击 Docker Hub - 编辑,将刚才获取镜像加速器URL添加到Docker Hub中。 2023-05-07-17-30-07@2x

创建容器

接下来我们需要下载一个ubuntu镜像 (可打开群晖的资源监控,注意一下下载速度)。

搜索 - ubuntu - 下载 - 选择标签 - 22.04 - 选择,下载完成后,我们就可在左侧-映像标签中看到ubuntu:22.04,等待其下载完成,就可以开始创建容器了。 2023-05-08-01-02-10@2x

Docker - 容器 - 新增, 选择ubuntu:22.04 - 下一步,

由于我们当前是想创建一个编译容器,选择“使用与Docker Host相同的网络” - 下一步,

输入容器名称,可相应的勾选需要的设置和高级设置,下一步,

添加文件夹,共享NAS文件夹给docker容器,下一步

接下来我们在左侧的容器标签栏中就可以看到新建的容器,以及其状态、CPU与内存占用等信息。

使用容器

群晖之上,容器的使用均可通过网页完成,这个还是很方便的。

点击左侧标签栏 “容器 - ubuntu.2204 - 操作”可启动或停止容器,就和操作普通虚拟机一样。

点击“容器 - ubuntu.2204 - 详情 - 终端机”,熟悉的感觉一下子就上来了,这不就和普通ssh登陆一样了吗!

2023-05-08-10-02-50@2x

进阶

日后再研究吧

参考


小酌怡情
Built with Hugo
主题 StackJimmy 设计
访问量 -    访客数 - 人次