Docker是什么?

docker是一个用Go语言实现的开源项目,可以让我们方便的创建和使用容器,docker将程序以及程序所有的依赖都打包到docker container,这样你的程序可以在任何环境都会有一致的表现,这里程序运行的依赖也就是容器就好比集装箱,容器所处的操作系统环境就好比货船或港口,程序的表现只和集装箱有关系(容器),和集装箱放在哪个货船或者哪个港口(操作系统)没有关系
因此我们可以看到docker可以屏蔽环境差异,也就是说,只要你的程序打包到了docker中,那么无论运行在什么环境下程序的行为都是一致的。
也可以看看这篇

Docker安装

安装:

环境:Ubuntu

  1. sudo apt install -y docker.io # 安装 dokcer Engine

安装成功后启动:
因为操作Docker 必须有 root 权限,直接使用 root 不够安全,所以加入 Docker 用户组是一个比较好的选择,也是Docker官方推荐的做法。

  1. sudo service docker start # 启动docker服务
  2. sudo usermod -aG docker ${USER} # 当前用户加入docker组

至此还需要退出系统(exit命令),再重新登录一次,这样才能让修改用户组的命令 usermod 生效。

验证:

  1. docker version # 查看Docker客户端和服务器的版本信息
  2. docker info # 查看Docker系统相关信息例如 CPU、内存、容器数量、镜像数量、容器运行时、存储文件系统等等

image.png

  1. Server:
  2. Containers: 1
  3. Running: 0
  4. Paused: 0
  5. Stopped: 1
  6. Images: 8
  7. Server Version: 20.10.12
  8. Storage Driver: overlay2
  9. Backing Filesystem: extfs
  10. Cgroup Driver: systemd
  11. Default Runtime: runc
  12. Kernel Version: 5.13.0-19-generic
  13. Operating System: Ubuntu Jammy Jellyfish (development branch)
  14. OSType: linux
  15. Architecture: aarch64
  16. CPUs: 2
  17. Total Memory: 3.822GiB
  18. Docker Root Dir: /var/lib/docker

docker info 显示的这些信息,对于我们了解 Docker 的内部运行状态非常有用,比如在这里,你就能够看到当前有一个容器处于停止状态,有 8 个镜像,存储用的文件系统是 overlay2,Linux 内核是 5.13,操作系统是 Ubuntu 22.04 Jammy Jellyfish,硬件是 aarch64,两个 CPU,内存 4G。

Docker 的基本使用

所有的 Docker 操作都是这种形式:以 docker 开始,然后是一个具体的子命令,之前的 docker version 和 docker info 也遵循了这样的规则。你还可以用 help 或者 —help 来获取帮助信息,查看命令清单和更详细的说明。

查看正在运行的容器: docker ps

先使用 docker ps 查看当前正在运行的容器,就像 Linux 的 ps。
image.png

从外部镜像仓库拉取镜像:docker pull

  1. docker pull busybox # 拉取 busybox镜像,可以类比它是Ubuntu里的“apt install”下载软件包

image.png

查看Docker当前存储的所有镜像:docker images

image.png
命令会显示有一个叫 busybox 的镜像,镜像的 ID 号是一串 16 进制数字,大小是 1.41MB。

启动容器:docker run

可以使用 echo输出字符串,这条命令会在我们的终端上,输出计算机世界最著名的语句“hello world”:

  1. docker run busbox echo hello word
  2. # 输出
  3. hello word

然后,我们再使用 docker ps -a 查看已运行完毕的容器:
image.png
至此先学这么多

Docker的架构

先了解一下 Docker的架构和Docker Engine 的内部角色和工作流程
张图来自 Docker 官网(https://docs.docker.com/get-started/overview/),精准地描述了 Docker Engine 的内部角色和工作流程,对我们的学习研究非常有指导意义。
image.png
我们使用的 docker 命令行实际上是一个客户端,镜像存储在远端仓库 Registry 里,客户端并不能直接访问镜像仓库。
它会与 Docker Engine 的后台服务 Docker daemon 通信,通过 build、pull、run 等命令向 Docker daemon 发送请求,Docker daemon 负责从远端拉取镜像、本地存储镜像,还有从镜像生成容器、管理容器等所有功能。所以,在 Docker Engine 里,真正干活的是 Docker daemon。

Docker 官方还提供一个“hello-world”示例,可以为你展示 Docker client 到 Docker daemon 再到 Registry 的详细工作流程,你只需要执行这样一个命令:

  1. docker run hello-word

它会先检查本地镜像,如果没有就从远程仓库拉取,再运行容器,最后输出运行信息:
image.png
Steps:

  1. Docker client 联系了 Docker daemon
  2. Docker daemon 从 Dcoker Hub 拉取到 “hello word” 镜像
  3. Docker daemon 从该镜像创建了一个新的容器,该容器运行可执行文件,该文件生成您当前正在读取的输出
  4. Docker daemon 将该输出传输到 Docker client,将其发送到您的终端

    总结

  • 容器技术起源于 Docker,它目前有两个产品:Docker Desktop 和 Docker Engine,我们的课程里推荐使用免费的 Docker Engine,它可以在 Ubuntu 系统里直接用 apt 命令安装。
  • Docker Engine 需要使用命令行操作,主命令是 docker,后面再接各种子命令。查看 Docker 的基本信息的命令是 docker version 和 docker info ,其他常用的命令有 docker ps、docker pull、docker images、docker run。
  • Docker Engine 是典型的客户端 / 服务器(C/S)架构,命令行工具 Docker 直接面对用户,后面的 Docker daemon 和 Registry 协作完成各种功能。