【Docker】零基础上手:原理+Ubuntu/Windows GUI 安装 + 镜像源 / 目录优化
🔥个人主页: 中草药
🔥专栏:【中间件】企业级中间件剖析
概述
Docker 是一个开源的容器化平台,它能将应用程序及其依赖(如库、配置文件、环境变量)打包成一个标准化的 “容器”,确保应用在任何支持 Docker 的环境中(开发机、测试机、生产服务器)都能以完全相同的方式运行,彻底解决 “在我这能跑,到你那跑不起来” 的经典问题。
Docker 本质是容器的易用工具(基于 Linux 内核容器技术,早期核心为 LXC 的二次封装),是容器技术最成功的实现;它以 Go 语言开发,目标是 “Build, Ship and Run Any APP, Anywhere”,通过对应用生命周期的管理,实现应用及运行环境 “一次封装,到处运行”。
早期 Docker 借助 LXC 做容器管理引擎,但通过镜像技术(将操作系统用户空间所需组件编排打包为image
文件,并集中存储于仓库)简化容器使用:创建容器时不再依赖 LXC 模板安装,而是拉取匹配的镜像后启动,使容器的创建与启停(如通过docker-run
、docker-stop
等命令)变得极为简便。
和虚拟机的区别
对比维度 | 传统虚拟机(VM) | Docker 容器 |
---|---|---|
底层架构 | 基于 Hypervisor(虚拟机监控器) | 基于 Linux 内核特性(Namespace/Cgroups) |
资源占用 | 磁盘占用大(需模拟完整操作系统,GB 级,几个GB到几十个GB左右) | 磁盘占用小(共享宿主机内核,MB 级,几十MB到几百MB左右) |
启动速度 | 慢(分钟级) | 快(秒级 / 毫秒级) |
隔离级别 | 强(系统级别,完全隔离操作系统) | 弱(进程级别,隔离进程,共享内核) |
应用部署 | 手动部署,速度慢 | 体系化部署,可以自动化,速度快 |
和JVM的区别
对比维度 | Docker | JVM(Java 虚拟机) |
---|---|---|
本质定位 | 轻量级容器化平台(基于 Linux 内核的 Namespace/Cgroups 实现进程级隔离) | Java 字节码的运行时环境(将字节码编译为机器码,实现跨平台运行) |
虚拟化层次 | 操作系统层(共享宿主机内核,无需模拟完整 OS) | 应用层(在宿主机 OS 上运行,依赖具体操作系统的 JVM 实现) |
隔离能力 | 强隔离(独立文件系统、网络、进程空间,通过 Namespace 实现) | 弱隔离(仅提供 Java 运行时的内存 / 类加载隔离,不隔离宿主机系统资源) |
资源占用 | 极低(MB 级,共享内核,无 Guest OS 开销) | 较高(GB 级,JVM 自身需要堆内存、元空间等,运行 Java 程序时额外消耗资源) |
启动速度 | 极快(秒级 / 毫秒级,直接启动容器进程) | 较慢(JVM 启动需加载类库、初始化堆内存,大型应用可能达数十秒) |
可移植性 | 跨环境一致(镜像打包后可在任何支持 Docker 的平台运行) | 跨平台兼容(Java 字节码可在 Windows/Linux/Mac 等不同 OS 的 JVM 上运行) |
适用场景 | 分布式应用部署、微服务架构、环境一致性保障(“一次打包,到处运行”) | Java 程序的跨平台运行(解决 “编译一次,到处运行” 的语言层可移植性) |
技术依赖 | 依赖 Linux 内核特性(或通过虚拟机模拟 Linux 环境,如 Docker Desktop) | 依赖具体操作系统的 JVM 实现(如 Windows 版 JVM、Linux 版 OpenJDK) |
隔离粒度 | 进程级隔离(容器内进程与宿主机进程隔离,但共享内核) | 线程级隔离(JVM 内的 Java 线程由宿主机 OS 调度,无系统级隔离) |
生态工具 | 配套 Docker Compose、Kubernetes 等容器编排工具,适合大规模集群管理 | 依赖 Java 生态工具(如 Maven/Gradle 构建、JProfiler 监控) |
安全性 | 隔离性依赖容器镜像和内核安全机制,若镜像存在漏洞可能影响宿主机 | 内置类加载器、沙箱等安全机制,降低恶意代码对宿主机的直接威胁 |
Docker 为什么比虚拟机资源利用率高,启动快
docker 有比虚拟机更少的抽象层。docker 不需要 Hypervisor 实现硬件资源虚拟化,运行在 docker 容器上的程序直接使用的是实际物理机的硬件资源。因此在 cpu、内存利用率上 docker 将会在效率上有明显的优势。docker 利用的是宿主机的内核,而不需要 Guest OS,节省了 Guest OS 占用的资源。
docker 不需要 Guest OS,创建一个容器时,不需要和虚拟机一样重新加载一个操作系统内核。从而避免引导、加载操作系统内核返回时耗时耗资源的过程,当新建一个虚拟机时,虚拟机软件需要加载 Guest OS,返回新建过程是分钟级别的。而新建一个 docker 容器只需要几秒钟。
Guest OS(客户机操作系统):每个虚拟机内部运行的完整独立操作系统(如 Linux、Windows)。因为虚拟机要模拟 “一台完整计算机”,所以需要独立的 OS 来管理虚拟机内的应用、资源。
架构设计
docker 采用 客户端 - 服务器(C/S)架构,使用远程API来管理和创建Docker容器,结合图示,其系统架构的核心组件及交互流程如下:
Client(客户端)
是用户操作 Docker 的入口,通过 Docker 命令行或者其他工具(如 docker build
、docker pull
、docker run
等)向 Docker 守护进程(Docker daemon)发送请求,发起 “构建镜像”“拉取镜像”“运行容器” 等操作。
Docker Host(Docker 主机)
是运行 Docker 守护进程和容器的核心环境,包含以下关键部分:
-
Docker daemon(守护进程):
是 Docker 的 “大脑”,负责监听 Client 的请求并执行具体操作(如管理镜像、创建 / 启动 / 停止容器等)。它是所有 Docker 操作的核心后台进程,协调镜像、容器等资源的生命周期。 -
Images(镜像):
镜像是只读的 Docker容器的模板,包含运行应用所需的所有内容(如文件系统、代码、运行时、依赖库等)。例如图中的 Ubuntu 镜像、数据库镜像等,是创建容器的 “基础模板”。 -
Containers(容器):
容器是镜像的运行实例(动态、可运行的实体)。每个容器相互隔离,拥有独立的资源空间,但共享宿主机内核(无需像虚拟机一样加载 Guest OS),因此轻量、启动快。图中多个容器可基于同一份镜像创建,运行时在镜像的 “只读层” 基础上添加 “可写层”(图中简化展示)。
Registry(镜像仓库)
是存储和分发 Docker 镜像的中心仓库(类似 “代码仓库”)。官方公共仓库是 Docker Hub(图中可见 Ubuntu、NGINX 等镜像标识),也支持私有仓库部署。
- 拉取镜像:用户通过
docker pull
命令,让 Docker daemon 从 Registry 拉取所需镜像到本地 Docker Host 的 “Images” 中。 - 推送镜像:用户可将本地构建的镜像(通过
docker build
生成),用docker push
推送到 Registry,实现镜像共享或备份。
组件交互流程(示例)
-
拉取并运行镜像:
用户通过 Client 执行docker pull nginx
,Docker daemon 从 Registry 拉取 NGINX 镜像到本地 Images;再执行docker run nginx
,Docker daemon 基于该镜像创建并启动一个 NGINX 容器。 -
本地构建镜像:
用户编写Dockerfile
后,执行docker build
,Docker daemon 会根据Dockerfile
构建新镜像,并存储到本地 Images,后续可基于该镜像创建容器。
这种架构的优势的是:解耦了 “操作发起” 与 “后台执行”,让 Docker 支持本地 / 远程的镜像、容器管理;同时借助 “镜像分层存储” 和 “容器轻量隔离”,实现了高效的资源利用(无需 Guest OS,共享宿主机内核)与快速的部署启动(新建容器仅需几秒)。
安装
Ubuntu
准备工作
# 1. 卸载旧版本(如果是新版本此命令不会卸载)
sudo apt-get remove docker docker-engine docker.io containerd runc# 2. 卸载历史版本
sudo apt-get purge docker-ce docker-ce-cli containerd.io dockerbuildx-plugin docker-compose-plugin docker-ce-rootless-extras -y# 3. 删除数据目录
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd# 4.curl 命令安装
sudo apt install curl -y# 配置下载源
# 5.创建 gpg key 目录
sudo mkdir -m 0755 -p /etc/apt/keyrings# 6.下载 gpg key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg# 7.安装
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -yecho \"deb [arch=$(dpkg --print-architecture) signedby=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null# 8. 更新apt源
sudo apt update
安装
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
自动启动配置
#配置加载
sudo systemctl daemon-reload
#启动服务
sudo systemctl start docker
#开启启动
sudo systemctl enable docker
#查看服务状态
sudo systemctl status docker
查看日志
#journalctl 是操作系统日志查看命令
#-e 表示从末尾看
#-u 表示看哪个系统组件的,我们的组件是 docker
journalctl -eu docker
检查安装
docker version
docker info
实战经验
Docker镜像源修改
镜像源是对原始数据源的完整复制副本,核心作用是解决 “原始数据源太远、访问太慢、不稳定” 的问题,让用户能更高效地获取所需资源(如软件安装包、代码库、系统镜像等)。
在配置文件 /etc/docker/daemon.json 中加入镜像源的配置
{"registry-mirrors": [ "https://mirror.ccs.tencentyun.com","https://docker.m.daocloud.io","https://dockerhub.timeweb.cloud","https://huecker.io"]
}
Docker 目录修改
docker的默认安装目录为/var/lib/docker,里面会存放很多镜像,需要考虑这个目录的空间
# 编辑配置文件
vi /etc/docker/daemon.json
# 输入下面的 json
{
"data-root": "/data/var/lib/docker"
}# 加载配置
sudo systemctl daemon-reload
# 重启 docker
sudo systemctl restart docker
#查看 docker 状态
sudo systemctl status docker
GUI版本
以win11为例
1、确定开启虚拟化
2、启动windows功能-适用于Linux的windows子系统和虚拟机平台
3、安装WSL2
以管理员权限运行powershell
#查看版本,如果不是 2 需要更新到 2
wsl --status#PowerShell 运行命令更新 wsl 到最新版本
PS C:\WINDOWS\system32> wsl --update#设置 wsl 默认版本
PS C:\WINDOWS\system32> wsl --set-default-version 2
4、通过微软商店安装Ubuntu
5、安装docker
下载链接 https://desktop.docker.com/win/stable/Docker%20Desktop%20Installer.exe
文章合为时而著,歌诗合为事而作。——白居易
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
以上,就是本期的全部内容啦,若有错误疏忽希望各位大佬及时指出💐
制作不易,希望能对各位提供微小的帮助,可否留下你免费的赞呢🌸