Docker 学习篇(一)| 认识 Docker

📅 2026/7/12 18:37:35 👁️ 阅读次数 📝 编程学习
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
镜像是安装包吗?不是。是「程序 + 环境」的打包文件,不需要安装,启动就是容器