Docker是什么?
docker是一个用Go语言实现的开源项目,可以让我们方便的创建和使用容器,docker将程序以及程序所有的依赖都打包到docker container,这样你的程序可以在任何环境都会有一致的表现,这里程序运行的依赖也就是容器就好比集装箱,容器所处的操作系统环境就好比货船或港口,程序的表现只和集装箱有关系(容器),和集装箱放在哪个货船或者哪个港口(操作系统)没有关系。
因此我们可以看到docker可以屏蔽环境差异,也就是说,只要你的程序打包到了docker中,那么无论运行在什么环境下程序的行为都是一致的。
也可以看看这篇
Docker安装
安装:
环境:Ubuntu
sudo apt install -y docker.io # 安装 dokcer Engine
安装成功后启动:
因为操作Docker 必须有 root 权限,直接使用 root 不够安全,所以加入 Docker 用户组是一个比较好的选择,也是Docker官方推荐的做法。
sudo service docker start # 启动docker服务
sudo usermod -aG docker ${USER} # 当前用户加入docker组
至此还需要退出系统(exit命令),再重新登录一次,这样才能让修改用户组的命令 usermod 生效。
验证:
docker version # 查看Docker客户端和服务器的版本信息
docker info # 查看Docker系统相关信息例如 CPU、内存、容器数量、镜像数量、容器运行时、存储文件系统等等
Server:
Containers: 1
Running: 0
Paused: 0
Stopped: 1
Images: 8
Server Version: 20.10.12
Storage Driver: overlay2
Backing Filesystem: extfs
Cgroup Driver: systemd
Default Runtime: runc
Kernel Version: 5.13.0-19-generic
Operating System: Ubuntu Jammy Jellyfish (development branch)
OSType: linux
Architecture: aarch64
CPUs: 2
Total Memory: 3.822GiB
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。
从外部镜像仓库拉取镜像:docker pull
docker pull busybox # 拉取 busybox镜像,可以类比它是Ubuntu里的“apt install”下载软件包
查看Docker当前存储的所有镜像:docker images
命令会显示有一个叫 busybox 的镜像,镜像的 ID 号是一串 16 进制数字,大小是 1.41MB。
启动容器:docker run
可以使用 echo输出字符串,这条命令会在我们的终端上,输出计算机世界最著名的语句“hello world”:
docker run busbox echo hello word
# 输出
hello word
然后,我们再使用 docker ps -a 查看已运行完毕的容器:
至此先学这么多
Docker的架构
先了解一下 Docker的架构和Docker Engine 的内部角色和工作流程
张图来自 Docker 官网(https://docs.docker.com/get-started/overview/),精准地描述了 Docker Engine 的内部角色和工作流程,对我们的学习研究非常有指导意义。
我们使用的 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 的详细工作流程,你只需要执行这样一个命令:
docker run hello-word
它会先检查本地镜像,如果没有就从远程仓库拉取,再运行容器,最后输出运行信息:
Steps:
- Docker client 联系了 Docker daemon
- Docker daemon 从 Dcoker Hub 拉取到 “hello word” 镜像
- Docker daemon 从该镜像创建了一个新的容器,该容器运行可执行文件,该文件生成您当前正在读取的输出
- 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 协作完成各种功能。