Docker入门
记录笔记仅为个人记忆使用。
1.Docker概述
1.1Docker为什么出现

1.2Docker发展历史

1.3Docker官方资源

- Docker基于Go语言开发,是一个开源项目。
- Docker Hub:https://hub.docker.com/
2.虚拟化和容器化
2.1传统虚拟化
传统虚拟化:为了让不同的人(应用)住得互不干扰,你在地皮(物理服务器)上建了好几栋独栋别墅。每栋别墅都有自己独立的地基、承重墙、水电系统(完整的操作系统Guest OS)。
缺点:太占地方,建房成本高,浪费资源(很多别墅的客厅可能空着)。

2.2容器化技术
容器化技术:大家共享同一栋楼的地基、承重墙和主管道(宿主机的操作系统内核)。但是,每个人住进不同的房间(容器)。房间门一关,互相看不见。
优点:空间利用率极高,拎包入住(启动极快),成本极低。

2.3二者对比
| 对比维度 | 传统虚拟化技术(Virtual Machine) | 容器化技术(Docker) |
|---|---|---|
| 实现层级 | 硬件级虚拟化(通过Hypervisor模拟硬件) | 操作系统级虚拟化(利用Linux内核的Namespace和Cgroups) |
| 操作系统 | 每个虚拟机都需要安装完整的独立操作系统(Guest OS) | 所有容器共享宿主机(Host OS)的内核,没有独立的操作系统 |
| 启动速度 | 分钟级(需要经历完整的系统开机引导过程) | 秒级甚至毫秒级(只需启动一个进程) |
| 资源占用 | 极大(即使不跑应用,操作系统本身也要占几个G的内存和硬盘) | 极小(只占用应用本身和依赖库的体积,通常几十MB到几百MB) |
| 隔离性与安全 | 极强(完全隔离的物理模拟环境) | 较弱(本质上是宿主机上的进程隔离,如果内核有漏洞可能会互相影响) |
| 可移植性 | 较差(往往受限于底层的虚拟化平台,体积庞大不易迁移) | 极强(“一次构建,到处运行”,只要有Docker环境就能跑) |
3.Docker和DevOps

4.Docker核心概念
4.1镜像(image)
Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务。
示例:tomcat镜像===>run===>tomcat01容器。
通过同一个镜像可以创建多个容器,最终服务运行或者项目运行就是在容器中的。
4.2容器(container)
Docker利用容器技术,独立运行一个或者一组应用。容器通过镜像创建。
容器支持启动、停止、删除等基本操作。
目前可以先把容器理解为一个简易的Linux系统。
4.3仓库(repository)
仓库是存放镜像的地方。
常见仓库:
- Docker Hub,默认是国外的镜像仓库。
- 阿里云等厂商也提供容器镜像服务,可以配置镜像加速。
5.Docker环境准备
5.1Linux内核要求
Docker要求Linux内核版本在3.0以上。
ubuntu@Mystpet:~$ uname -r
5.15.0-163-genericuname -r用于查看Linux内核发行号。当前内核版本是5.15,已经满足Docker运行要求。
Docker不是在模拟硬件,它依赖Linux内核底层的Namespace隔离和Cgroups资源限制来实现容器效果。这两个功能在较旧的2.x内核中没有或者不完善,所以Docker教程通常强调内核版本需要3.0以上。
5.2查看系统信息
ubuntu@Mystpet:~$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04 (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy| 字段名称 | 英文含义 | 大白话解释 |
|---|---|---|
| PRETTY_NAME | 漂亮的名称 | 给人类看的全称。写文档时可以使用这个名字,例如“Ubuntu 22.04.3 LTS”。 |
| NAME | 名称 | 系统的家族大类,就是Ubuntu。 |
| VERSION_ID | 版本号 | 22.04,代表2022年4月发布的版本。 |
| VERSION | 完整版本信息 | 包含版本号和代号。LTS代表长期支持版,通常维护5年。 |
| VERSION_CODENAME和UBUNTU_CODENAME | 版本开发代号 | jammy。Ubuntu每次发版都会使用一个开发代号。 |
| ID | 系统标识符 | ubuntu。全小写,通常给代码脚本使用。 |
| ID_LIKE | 类似什么系统 | debian。Ubuntu基于Debian二次开发,所以Ubuntu和Debian使用相似的包管理逻辑,例如都使用apt-get。 |
| HOME_URL及其他 | 各种网址 | 官网、技术支持、Bug报告和隐私政策的网址链接。 |
6.安装Docker
6.1卸载旧版本
较旧的Docker版本称为docker、docker.io或docker-engine。如果已经安装这些程序,需要先卸载它们以及相关依赖项。
#1.卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc6.2安装依赖包
在Ubuntu上,需要安装证书和工具,让apt可以通过HTTPS使用仓库。
#1.更新apt索引
sudo apt-get update
#2.安装依赖
sudo apt-get install ca-certificates curl gnupg lsb-release6.3配置Docker仓库
#1.添加阿里云GPG密钥
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
#2.设置阿里云仓库地址
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null6.4安装Docker Engine
#1.更新apt软件包索引
sudo apt-get update
#2.安装Docker社区版
sudo apt-get install docker-ce docker-ce-cli containerd.io6.5启动并验证Docker
#1.设置Docker开机自启
sudo systemctl enable docker
#2.启动Docker
sudo systemctl start docker
#3.查看Docker版本
sudo docker version
#4.测试运行hello-world
sudo docker run hello-world
#5.查看已经下载的镜像
sudo docker images
#6.清理镜像为<none>的虚悬镜像
sudo docker image prune -f7.卸载Docker
#1.卸载Docker相关依赖
sudo apt-get purge docker-ce docker-ce-cli containerd.io
#2.删除Docker资源目录
sudo rm -rf /var/lib/docker
#3.删除containerd资源目录
sudo rm -rf /var/lib/containerd说明:/var/lib/docker是Docker的默认工作路径。Ubuntu彻底卸载通常使用purge。
8.Docker底层原理
8.1Docker Engine组成


Docker Engine是一个客户端-服务器应用程序,主要包含以下组件:
- 服务器:长期运行的守护进程,也就是
dockerd命令。 - REST API:用于指定程序如何和守护进程通信,并告诉守护进程要做什么。
8.2Client Server工作方式
Docker是一个Client Server结构的系统。Docker守护进程运行在主机上,然后通过Socket连接从客户端访问。
守护进程从客户端接收命令,并管理运行在主机上的容器。容器就是一个运行时环境,也就是常说的集装箱。

