【Docker】零基础上手:原理+Ubuntu/Windows GUI 安装 + 镜像源 / 目录优化

🔥个人主页: 中草药

🔥专栏:【中间件】企业级中间件剖析


概述

Docker 是一个开源的容器化平台 ,它能将应用程序及其依赖(如库、配置文件、环境变量)打包成一个标准化的 "容器",确保应用在任何支持 Docker 的环境中(开发机、测试机、生产服务器)都能以完全相同的方式运行,彻底解决 "在我这能跑,到你那跑不起来" 的经典问题。

Docker 本质是容器的易用工具 (基于 Linux 内核容器技术,早期核心为 LXC 的二次封装),是容器技术最成功的实现;它以 Go 语言开发,目标是 "Build, Ship and Run Any APP, Anywhere",通过对应用生命周期的管理,实现应用及运行环境 "一次封装,到处运行"。

早期 Docker 借助 LXC 做容器管理引擎,但通过镜像技术 (将操作系统用户空间所需组件编排打包为image文件,并集中存储于仓库)简化容器使用:创建容器时不再依赖 LXC 模板安装,而是拉取匹配的镜像后启动,使容器的创建与启停(如通过docker-rundocker-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 builddocker pulldocker 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,实现镜像共享或备份。

组件交互流程(示例)

  1. 拉取并运行镜像

    用户通过 Client 执行 docker pull nginx,Docker daemon 从 Registry 拉取 NGINX 镜像到本地 Images;再执行 docker run nginx,Docker daemon 基于该镜像创建并启动一个 NGINX 容器。

  2. 本地构建镜像

    用户编写 Dockerfile 后,执行 docker build,Docker daemon 会根据 Dockerfile 构建新镜像,并存储到本地 Images,后续可基于该镜像创建容器。

这种架构的优势的是:解耦了 "操作发起" 与 "后台执行" ,让 Docker 支持本地 / 远程的镜像、容器管理;同时借助 "镜像分层存储" 和 "容器轻量隔离",实现了高效的资源利用 (无需 Guest OS,共享宿主机内核)与快速的部署启动(新建容器仅需几秒)。

安装

Ubuntu

准备工作

bash 复制代码
# 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 -y

echo \
 "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

安装

bash 复制代码
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

自动启动配置

bash 复制代码
#配置加载
sudo systemctl daemon-reload 
#启动服务
sudo systemctl start docker 
#开启启动
sudo systemctl enable docker
#查看服务状态
sudo systemctl status docker

查看日志

bash 复制代码
#journalctl 是操作系统日志查看命令
#-e 表示从末尾看
#-u 表示看哪个系统组件的,我们的组件是 docker
journalctl -eu docker

检查安装

bash 复制代码
docker version
docker info

实战经验

Docker镜像源修改

镜像源是对原始数据源的完整复制副本,核心作用是解决 "原始数据源太远、访问太慢、不稳定" 的问题,让用户能更高效地获取所需资源(如软件安装包、代码库、系统镜像等)。

在配置文件 /etc/docker/daemon.json 中加入镜像源的配置

bash 复制代码
{
 "registry-mirrors": [ 
 "https://mirror.ccs.tencentyun.com",
 "https://docker.m.daocloud.io",
 "https://dockerhub.timeweb.cloud",
 "https://huecker.io"]
}

Docker 目录修改

docker的默认安装目录为/var/lib/docker,里面会存放很多镜像,需要考虑这个目录的空间

bash 复制代码
# 编辑配置文件
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

bash 复制代码
#查看版本,如果不是 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


文章合为时而著,歌诗合为事而作。------白居易

🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀

以上,就是本期的全部内容啦,若有错误疏忽希望各位大佬及时指出💐

制作不易,希望能对各位提供微小的帮助,可否留下你免费的赞呢🌸

相关推荐
勇往直前plus4 小时前
如何利用docker部署springboot应用
spring boot·docker·容器
jerryinwuhan5 小时前
LINUX复习资料(二)
linux·运维·服务器
学习的周周啊6 小时前
一人AI自动化开发体系(Cursor 驱动):从需求到上线的全流程闭环与实战清单
运维·人工智能·自动化·ai编程·全栈·devops·cursor
qq_312920116 小时前
从零搭建企业级DevOps流水线
运维·devops
川石课堂软件测试7 小时前
全链路Controller压测负载均衡
android·运维·开发语言·python·mysql·adb·负载均衡
一枚正在学习的小白7 小时前
PG数据文件位置迁移
linux·运维·服务器·数据库
Tfly__7 小时前
Ubuntu 20.04 安装Aerial Gym Simulator - 基于 Gym 的无人机强化学习仿真器
linux·人工智能·ubuntu·github·无人机·强化学习·运动规划