容器技术并不难理解,简单说的话,就是在 Linux 基础上,通过约束与约束,来创造出一个进程边界,让不同容器之间形成一种隔离实例的效果。
以下通过一个小故事来介绍下它的原理:
想象现在有个大平房(宿主机的操作系统),平时工人干活就在这个大平房里,自带工具间,里面有锤子榔头螺丝刀,扳手起子和钳子等工具包。
Docker 通过 Linux 自带的技术 Cgroups 和 Namespace 创造出一个个隔离的环境:
大老板新招一批工人,然后用木板墙把工人们隔离开,让他们都不知道互相的存在,工人以为厂里就只有自己一个人(因为隔离开来,看不见别人),所以他就以为自己排第一,是大老板了(PID=1)。
Namespace 就是用来隔离各类资源用的,例如 PID、时间、网络、配置、挂载的硬盘等等
Cgroups 就是用来分配资源的,例如 cpu、内存、IO 等资源
Namespace 用来充当木板墙隔离用;Cgroups 用来管理资源,避免工人索取无度;
切换进程根目录:
小隔间有了,小老板也有了,怎么干活呢?总不能隔离着然后还共用一套大老板的工具间吧?
此时灵光一闪,Namespace 里有个叫 Mount Namespace 的,可以挂载任何东西
每个容器都把根目录 / 指向自己的一亩三分地,并且给一套完整的发行版文件:
以前工人们拿工具都是指向工具间,现在每个人指向他自己的隔间里,再配上一套工具包,工人就能在自己的小隔间里,拿着自己想要的工具去工作了
这一套就是 Docker 的底层文件系统 rootfs(根文件系统)
bootfs(boot file system)
bootfs 主要包含 bootloader 和 kernel。bootloader 主要是引导加载 kernel,引导完成后整个内核就都在内存中了。此时内存的使用权已由 bootfs 转交给内核,系统卸载 bootfs。bootfs 可以被不同的 Linux 发行版共用。
rootfs(root file system)
rootfs,包含典型 Linux 系统标准目录和文件。相当于各种不同操作系统发行版(Base Image 层)。
因为底层直接用 Host 的 kernel(所有容器共享宿主机操作系统的内核),rootfs 只包含最基本的命令、工具和程序就可以了。
当进行修改或者更新时,会在当前镜像层上新建新的层级(Image 层)。而运行起来的容器内容为可写层(Container 层)。
再来一张图片
# 一个最常见的 rootfs (容器镜像) 包含如下的目录和文件
$ ls /
bin dev etc home lib lib64 mnt opt proc root run sbin sys tmp usr var
这么多工人,总不可能都是干拧螺丝的活吧,有些定制化的东西,就可以打包多一层工具包丢进去隔间就可以了, 例如基础工具包(螺丝刀锤子),再加个瓦工工具包(抹泥刀水平仪),他就可以去干瓦工的活了, 如果是基础工具包+电工工具包(电笔胶布剪刀),他就可以去干电工的活了 我们都有美好的未来 ^_^
这里就是 Docker 的联合文件系统(Union File System)
Docker 的镜像是由多层的文件系统组成
联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像可以制作各种具体的应用镜像。
到这里,你也能很快的理解到其实容器化技术跟虚拟化技术差别还是挺大的吧,
虚拟化技术主要是通过虚拟/半虚拟或者硬件辅助虚拟化技术,将计算机虚拟化为完整的硬件平台,也叫平台虚拟化。
而容器化技术主要是OS层面的隔离,实现多个隔离的用户空间实例。
虚拟机与容器对比
所以,你也可以在虚拟机上跑容器,这并不冲突。
Tips: 在 windows 上跑 Docker Desktop 也是要开启 Hyper_V (硬件虚拟化)的
现在的 Docker 官网的安装文档首页简化了些,首页的安装教程就直接展示各个平台的 Docker Desktop,官网推荐你直接下载安装,过程就跟普通安装软件一样,一直点下一步就完事了。
https://docs.docker.com/get-docker/
注1:Windows 与 Mac 直接用 Docker Desktop 就可以了 注2:Windows 版需要开启 WSL2 或者 Hyper_V 后才能安装,但是目前两者者跟 VM 虚拟机不兼容
如果你不想用上面的 Docker Desktop,其实官方还有详细到教你各个平台如何安装的
https://docs.docker.com/engine/install/
手动安装的话,一般步骤就是:
0. 卸载旧版本(如果有)
1. 设置存储库(个别系统需要手动添加下 GPG key)
2. 跑安装命令
完事...
举个 CentOS 例子:
// 设置存储库
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
// 安装 Docker 引擎
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
// 完事...
你想装的系统不在上面列表中?例如我的树莓派,咋整?
没事,还有二进制安装法和脚本二进制安装法,这里举例脚本安装:
// 下载脚本
$ curl -fsSL https://get.docker.com -o get-docker.sh
// 运行脚本
$ sudo sh get-docker.sh --mirror Aliyun
// 完事...
甚至,如果你的 Linux 发行版有包管理器,那就更简单了,例如 Manjaro 的 pacman 或者 yay
yay -S docker
// 完事... 真的...
以上任意一种方法选一种即可,安装完可输入以下命令验证是否安装成功:
sudo docker version
设置国内镜像源
# 阿里加速服务:https://??????.mirror.aliyuncs.com (需自己申请个人加速服务地址,加速服务不只是提供镜像加速,还有 docker 在各种操作系统的安装文档和加速,注册地址:https://cr.console.aliyun.com/undefined/instances/mirrors)
# 或者一些其他的镜像: 官方 https://registry.docker-cn.com
# 这里仅展示ubuntu和centos的操作,对于 Docker for Windows、Docker for Mac 在设置中编辑 daemon.json ,增加和下面一样的字符串即可
# 命令写入:
$ sudo mkdir -p /etc/docker
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
# 然后重启服务
$ sudo systemctl daemon-reload && sudo systemctl restart docker
# 查看是否成功( 看 Registry Mirrors 项):
$ docker info
设置用户组,打 docker 命令不用加 sudo
# 把 docker 命令加入组中
$ sudo usermod -aG docker $USER
重新登录或输入下面命令即可生效:
$ su ${USER}
设置开机自启
# 用 systemctl 管理服务的 linux 版本可以直接这样:
# 开机自启
$ sudo systemctl enable docker
# 重新启动
$ shutdown -r now
# 查看启动状态
$ systemctl status docker
Docker 架构
理解了上面的小故事的话,我相信使用 Docker对你来说就是小菜一碟
别人打包好的就是 Images(镜像)
你从仓库(Registry)拉下来别人的镜像,运行起来就是 Container(容器)
你也可以自己建一个 dockerfile 配置来构建一个属于你自己的镜像
或者导出你的容器,导出成 Tar files
Docker 命令