当前位置: 首页 > news >正文

【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的区别

对比维度DockerJVM(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

准备工作

# 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


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

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

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

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

http://www.dtcms.com/a/478533.html

相关文章:

  • 网站的引导页怎么做的手机虚拟空间
  • 大连网站开发公司力推选仟亿科技有源码如何搭建网站
  • 【Java虚拟机(JVM)全面解析】从原理到面试实战、JVM故障处理、类加载、内存区域、垃圾回收
  • 高并发面试
  • 模板网站 建设 方法西安网站建设中心
  • 《早期经验:语言智能体学习的中间道路》Agent Learning via Early Experience论文深度解读
  • QT6中Commd Link Button,Dialog Button Box,Tool Button 功能与应用
  • asp做网站安全性wordpress 文章 接口
  • 关系型数据库RDBMS与非关系型数据库NoSQL区别
  • 网站建设发布wordpress主题带会员中心
  • 单元测试 vs Main方法调试:何时使用哪种方式?
  • 03--CSS基础(2)
  • Wireshark笔记-从抓包的角度分析几种客户端不能正常获取IP地址的场景
  • 企业 网站 推广wordpress文章状态
  • typescript中infer常见用法
  • 科技赋能塞上农业:宁夏从黄土地到绿硅谷的蝶变
  • 第13讲:深入理解指针(3)——数组与指针的“深度绑定”
  • 基于MATLAB的匈牙利算法实现任务分配
  • Type-C 接口充电兼容设计(针对 5V1A 需求)
  • Anaconda 学习手册记录
  • Python-适用于硬件测试的小工具
  • 第三方软件测评机构:【Locust的性能测试和负载测试】
  • 【Python】列表 元组 字典 文件
  • 简单asp网站深圳做个商城网站设计
  • OpenTelemetry 入门
  • 昆山做网站找哪家好wordpress 算数验证码
  • 网站建设服务费入阿里云域名注册平台
  • 美颜的灵魂:磨皮技术的演进与实现原理详解
  • 自定义半精度浮点数modelsim仿真显示
  • 广东GEO优化哪家专业哪家服务好