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

Docker 学习篇(一)| 认识 Docker

Docker 学习篇(一)| 认识 Docker

  • 1. 什么是 Docker
  • 2. Windows 上装软件的痛
  • 3. Docker 怎么解决的
  • 4. 三核心:仓库、镜像、容器
  • 5. 三个动作,没有"安装"
  • 6. Docker 解决了传统部署的三大痛点
    • 痛点一:环境冲突 —— JDK 版本打架
    • 痛点二:移植噩梦 —— Ubuntu 迁 CentOS
    • 痛点三:资源浪费 —— 空闲服务吃内存
  • 7. Docker Desktop 是什么
  • 8. 实际好处
  • 9. 常见疑问

1. 什么是 Docker

Docker 是一个容器引擎。它把程序和程序需要的运行环境(操作系统、依赖库、配置)打包在一起,放进一个叫"容器"的隔离空间里运行。

你可以理解为:Docker 在你的电脑里划出一个个独立的小隔间,每个隔间自带一套微型 Linux,互不干扰。程序跑在隔间里,和外面 Windows 系统是隔离的。

三个关键词:打包、隔离、一次构建到处运行。


2. Windows 上装软件的痛

装 MySQL:下载.exe→ 下一步 → 输密码 → 完成。一切正常。

直到你想同时装 MySQL 5.7 和 8.0 —— 安装程序直接拒绝:「已检测到 MySQL 存在」。

不是你的问题。Windows 的设计决定了所有程序共享一套环境——同一个文件系统、同一份注册表、同一组系统服务。两个版本的同一款软件必然打架。


3. Docker 怎么解决的

Docker 给每个程序分配一个独立的小隔间,叫"容器"。每个容器自带:

  • 一个微型 Linux(几十 MB,不依赖你的 Windows)
  • 程序需要的所有依赖(JDK、glibc 等)
  • 程序本身

容器之间完全隔离。

场景WindowsDocker
装两个 MySQL不可能两个容器,各跑各的
卸载软件卸载程序 + 残留注册表 + 残留文件删容器,彻底干净
软件依赖冲突两个软件要不同版本的 Python?得折腾各自容器自带

Windows 是大通铺,Docker 是公寓楼,每个房间自带水电。


4. 三核心:仓库、镜像、容器

Docker 的世界里只有这三样东西:

核心是什么类比
仓库(Registry)存放镜像的地方,官方的叫 Docker Hub,国内有镜像加速站应用商店
镜像(Image)程序 + 微型 Linux + 所有依赖,打包成一个只读文件Word 模板(.dotx
容器(Container)用镜像启动出来的运行实例,正在干活的进程打开后的编辑窗口

关系一句话:仓库里存镜像,镜像启动变容器。镜像是文件,容器是进程。


5. 三个动作,没有"安装"

Docker 世界里没有"安装软件"这一步,只有三个动作:

动作命令做什么
拉取docker pull mysql:8.0下载别人做好的镜像
构建docker build -t my-app .把自己的项目打成镜像
运行docker run -d mysql:8.0从镜像启动容器

6. Docker 解决了传统部署的三大痛点

痛点一:环境冲突 —— JDK 版本打架

服务器上已有 Spring Boot 1.x 项目(要 JDK 8),新项目 Spring Boot 3.x(必须 JDK 17)。Linux 只有一个全局JAVA_HOME

  • 指 JDK 8 → 新项目报Unsupported major.minor version 61.0
  • 指 JDK 17 → 老项目报NoClassDefFoundError: javax/xml/bind/…

传统解法:装两个 JDK,给每个项目写脚本设各自的JAVA_HOME,再写 systemd 服务文件管理启停。每来一个新 JDK 版本的项目就重复一遍。

Docker:每个项目自己打包一个 Dockerfile,各带各的 JDK:

# 老项目 FROM eclipse-temurin:8-jdk-alpine COPY old-demo.jar app.jar CMD ["java", "-jar", "app.jar"] # 新项目 FROM eclipse-temurin:17-jdk-alpine COPY new-demo.jar app.jar CMD ["java", "-jar", "app.jar"]
dockerrun-d--nameold-project-p8081:8080 old-project:v1dockerrun-d--namenew-project-p8082:8080 new-project:v1

JDK 各带各的,宿主机不装 JDK 都行。不止 JDK,一台 Docker 可以同时跑不同版本的 MySQL、Redis、Nginx:

Docker(只装一个,管理一切) ├── MySQL 8.0 容器 → 宿主机 3306 ├── MySQL 5.7 容器 → 宿主机 3307 ├── Redis 7 容器 → 宿主机 6379 ├── Nginx 容器 → 宿主机 80 ├── 博客后端 容器 → JDK 17 → 宿主机 8080 └── 老项目 容器 → JDK 8 → 宿主机 8081

六个容器,各带各的版本,互不干扰。Windows 上做不到。

痛点二:移植噩梦 —— Ubuntu 迁 CentOS

本地 Ubuntu 22.04 开发好了,迁移到 CentOS 8 服务器:

  • MySQL 安装命令不同(aptvsdnf),配置路径不同
  • 系统库包名不同(libpng-devvslibpng-devel
  • 文件权限不同(ubuntu用户 vsec2-user

传统解法:导出apt list --installed,手动映射到dnf包名,一个个装。改配置路径。修权限。反反复复试错。

Docker:本地和服务器用同一份docker-compose.yml+Dockerfile

# 本地dockercompose up-d# 服务器 —— 完全一样的命令dockercompose up-d

系统和库在镜像里,不依赖宿主机。数据库地址用容器名mysql而不是 IP,换个环境照样通。

痛点三:资源浪费 —— 空闲服务吃内存

一台 4GB 服务器跑 Redis(默认 100MB)+ MySQL(默认 300MB)+ Tomcat(默认 200MB)。晚上没人用也吃掉 600MB。

传统解法:手动调每个服务的配置(redis.confmaxmemorymy.cnfinnodb_buffer_pool_size、Tomcat 的JAVA_OPTS),写 cron 定时停启脚本。累,容易出错。

Docker

dockerrun-d--nameredis--memory=50m redis:7-alpinedockerrun-d--namemysql--memory=100m-eMYSQL_ROOT_PASSWORD=root mysql:8.0dockerrun-d--nametomcat--memory=100m tomcat:9

一行--memory搞定,不需要改服务内部配置,随时可调。


7. Docker Desktop 是什么

它是你 Windows 上唯一需要安装的软件。底层通过 WSL2 跑一个轻量级 Linux 虚拟机,在这个虚拟机里运行 Docker 引擎。

  • 不需要装多个 Docker——一个引擎管理所有容器
  • 不需要在 Windows 上装 MySQL、Redis、Nginx——它们全跑在容器里
  • 你的 Windows 保持干净

8. 实际好处

  1. 环境不打架:JDK 8 / 17 / 21 同时跑,MySQL 5.7 和 8.0 并存
  2. 不污染本机:中间件全部容器化,系统零残留
  3. 换电脑无痛:装 Docker Desktop → 拉代码 →docker compose up -d,所有服务全起
  4. 环境一致性:本地、测试、生产用同一个镜像,「我电脑上能跑」成为历史
  5. 用完即弃:测完删容器,不留痕迹

9. 常见疑问

疑问答案
容器里面装了 Docker 吗?没有。容器里只有程序和依赖,Docker 引擎在外面,唯一一个
每个容器有自己的 JDK?对,各自打包各自的版本,互不影响
容器之间能通信吗?能,通过 Docker 内部网络直接互访
Docker 是在 Windows 里又装了个系统?是跑了一个微型 Linux,不是再装个 Windows
镜像是安装包吗?不是。是「程序 + 环境」的打包文件,不需要安装,启动就是容器
http://www.jsqmd.com/news/766742/

相关文章:

  • 2026 年机房防静电地板全国普及:安全价值与全国化供应格局解析 - 小艾信息发布
  • N_m3u8DL-RE架构深度解析:现代流媒体下载引擎的设计哲学与技术实现
  • Windows预览版一键退出指南:如何快速恢复系统稳定性的完整教程
  • 别让布线毁了信号!深入PCIe链路训练:Polarity Inversion检测与纠正全流程解析
  • GTA5线上小助手:重新定义你的洛圣都游戏体验
  • 别再死磕标准库了!STM32CubeMX+HAL库开发实战,从零到点亮LED(附避坑指南)
  • Allegro 16.6实战:为了信号完整性和良率,我这样设置PCB无盘工艺
  • 内容创作平台集成Taotoken实现多模型文章辅助生成与润色
  • 2026年值得关注的AI大模型接口中转站推荐,这五家让你的开发之路更顺畅
  • 工控机上的游戏手柄:Ubuntu 20.04连接Xbox/北通手柄完整配置与避坑指南
  • SQL 入门 13:SQL 存储过程与函数:封装逻辑与参数处理
  • qmc-decoder终极指南:三步解锁QQ音乐加密文件,实现跨平台音乐自由
  • Ubuntu 18.04离线环境升级GLIBC踩坑记:从报错到成功,我绕过了哪些弯路?
  • 【软考高级架构】案例题考前突击12:软件架构的演化
  • 3分钟搞定M3U8视频下载:告别命令行,拥抱图形化下载神器
  • Go语言构建Webhook转发桥梁:解决内网穿透,实现自动化流程
  • KMS激活脚本终极指南:5分钟免费激活Windows和Office的完整教程
  • Linux USB Gadget配置避坑指南:从DTS到Function驱动的完整流程解析
  • Sunshine游戏串流服务器:开源自托管方案重塑跨设备游戏体验
  • 借助Taotoken模型广场为不同任务选择性价比最优的大模型
  • 2026年华为云简洁教程:OpenClaw怎么搭建及大模型API Key、Skill配置全攻略
  • 开源神器LinkSwift:一键获取九大网盘真实下载链接的终极指南
  • 2026奇点大会闭门报告流出(AISMM V2.1实测数据包):92.7%头部AI厂商已启动内部对标,你还在用LlamaScore?
  • 深入HAL库驱动文件夹:手把手教你裁剪与配置stm32xxxx_hal_conf.h,为你的项目‘瘦身’
  • RealVNC Server 7.6.0 企业版新功能实测:动态分辨率与云连接状态到底有多好用?
  • 面试官总爱问ArrayList?这份从JDK 1.2到JDK 17的演进史和避坑指南请收好
  • 体验Taotoken多模型聚合带来的低延迟与高稳定性
  • Unity新手避坑:用Video Player在UI上流畅播放CG视频的完整流程(附Render Texture设置)
  • 别再只看序列了!深度解析geNomad输出文件里的‘病毒信心分’和‘拓扑结构’,帮你精准判断结果
  • Docker 学习篇(三)| Docker安装指南(Linux版)