目前使用 Docker 基本上有两个选择:Docker Desktop
和Docker Engine
。Docker Desktop
是专门针对个人使用而设计的,支持 Mac 和 Windows 快速安装,具有直观的图形界面,还集成了许多周边工具,方便易用。
不是太推荐使用Docker Desktop
,原因有两个。第一个,它是商业产品,难免会带有 Docker 公司的“私人气息”,有一些自己的、非通用的东西,不利于我们后续的 Kubernetes 学习。第二个,它只是对个人学习免费,受条款限制不能商用,我们在日常工作中难免会“踩到雷区”。
Docker Engine
则和Docker Desktop
正好相反,完全免费,但只能在 Linux 上运行,只能使用命令行操作,缺乏辅助工具,需要我们自己动手 DIY 运行环境。不过要是较起真来,它才是Docker
当初的真正形态,“血脉”最纯正,也是现在各个公司在生产环境中实际使用的 Docker 产品,毕竟机房里 99% 的服务器跑的都是 Linux。
sudo apt install -y docker.io
安装docker。
完成之后如下图:
sudo systemctl start docker
启动docker
。
sudo systemctl status docker
可以看到状态是active (running)
。
sudo usermod -aG docker ${USER}
把当前用户加入docker组,退出系统(命令 exit ),再重新登录一次,这样才能让修改用户组的命令 usermod 生效。
因为我使用的是root
用户,所以不用执行。
sudo docker version
会输出 Docker 客户端和服务器各自的版本信息:
可以看到,我使用的是Docker Engine 24.0.5
,系统是Linux
,硬件架构是amd64
。
sudo docker info
会显示当前 Docker 系统相关的信息,例如 CPU、内存、容器数量、镜像数量、容器运行时、存储文件系统等等。
sudo docker info
显示的这些信息,对于我们了解 Docker 的内部运行状态非常有用。
docker ps
,它会列出当前系统里运行的容器,就像我们在 Linux 系统里使用 ps 命令列出运行的进程一样。
所有的 Docker 操作都是这种形式:以 docker 开始,然后是一个具体的子命令,之前的docker version
和docker info
也遵循了这样的规则。你还可以用help
或者--help
来获取帮助信息,查看命令清单和更详细的说明。
docker pull
,从外部的镜像仓库(Registry)拉取一个 busybox 镜像(image),你可以把它类比成是 Ubuntu 里的“apt install
”下载软件包,docker pull busybox
拉取busybox镜像。
docker images
列出当前 Docker 所存储的所有镜像。
可以看到,命令会显示有一个叫busybox
的镜像,镜像的 ID 号是一串 16 进制数字a416a98b71e2
,大小是 4.26MB。
docker run busybox echo hello world
输出计算机世界最著名的语句“hello world
”。
docker ps -a
列出来所有的镜像。
Docker 的架构
下面的这张图来自 Docker 官网(https://docs.docker.com/get-started/overview/),精准地描述了 Docker Engine 的内部角色和工作流程,对我们的学习研究非常有指导意义。
刚才我们敲的命令行 docker 实际上是一个客户端 client ,它会与 Docker Engine 里的后台服务 Docker daemon 通信,而镜像则存储在远端的仓库 Registry 里,客户端并不能直接访问镜像仓库。
Docker client 可以通过 build、pull、run等命令向 Docker daemon 发送请求,而 Docker daemon 则是容器和镜像的“大管家”,负责从远端拉取镜像、在本地存储镜像,还有从镜像生成容器、管理容器等所有功能。
所以,在 Docker Engine 里,真正干活的其实是默默运行在后台的 Docker daemon,而我们实际操作的命令行工具“docker”只是个“传声筒”的角色。
Docker 官方还提供一个“hello-world”示例,可以为你展示 Docker client 到 Docker daemon 再到 Registry 的详细工作流程,你只需要执行这样一个命令docker run hello-world
。
它会先检查本地镜像,如果没有就从远程仓库拉取,再运行容器,最后输出运行信息:
此文章为10月Day 5学习笔记,内容来源于极客时间《Kubernetes 入门实战课》