📌 前言
Docker 是目前最流行的容器化平台,它可以将应用及其依赖打包成一个标准化的容器镜像,实现”一次构建,到处运行“。无论你是在本机开发、测试环境验证,还是在生产服务器上部署,Docker 都能保证环境的一致性。
本文将涵盖四大板块:
- 🔍 Docker 核心概念(镜像、容器、仓库的关系)
- 🐧 Ubuntu 22.04 安装 Docker Engine
- 🪟 Windows 安装 Docker Desktop + WSL2 优化
- 🛠️ 常用命令与实战示例
🔍 Docker 核心概念
在动手安装之前,先理清几个最基础的概念,这能帮你快速理解 Docker 的工作方式。
镜像(Image)、容器(Container)与仓库(Registry)
这三者的关系可以用 面向对象编程 来类比:
| Docker 概念 |
OOP 类比 |
说明 |
| 镜像(Image) |
类(Class) |
一个只读模板,包含运行某个应用所需的完整环境(OS、依赖、代码) |
| 容器(Container) |
实例(Object) |
镜像的运行态,相当于一个轻量级沙箱,可在其中运行应用 |
| 仓库(Registry) |
Maven/NPM 仓库 |
存储和分发镜像的地方,如 Docker Hub、阿里云镜像仓库 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| ┌──────────────────────────────────────────┐ │ Docker Registry │ │ (Docker Hub / 阿里云 / 私有仓库) │ │ │ │ ┌──────────┐ ┌──────────┐ │ │ │ Image A │ │ Image B │ ... │ │ └────┬─────┘ └────┬─────┘ │ └────────┼─────────────┼───────────────────┘ │ docker pull │ ▼ ▼ ┌─────────────────────────┐ │ Docker Host │ │ │ │ ┌──────────┐ ┌───────┐ │ │ │ Container│ │Cont...│ │ ← 由 Image 启动的实例 │ └──────────┘ └───────┘ │ └─────────────────────────┘
|
其他关键概念
- Dockerfile:一个文本文件,定义了构建镜像的步骤(相当于”镜像的配方”)
- Docker Compose:用于定义和运行多容器应用的工具,通过一个
docker-compose.yml 文件即可一键启动整套服务
- Volume(数据卷):容器删除后数据会丢失,Volume 可以将数据持久化到宿主机
🐧 Ubuntu 22.04 安装 Docker Engine
以下步骤使用阿里云镜像源,解决国内下载慢的问题。
1. 卸载旧版本
1
| sudo apt-get remove docker docker-engine docker.io containerd runc
|
2. 更新软件包并安装依赖
1 2 3
| sudo apt-get update sudo apt-get upgrade sudo apt-get install ca-certificates curl gnupg lsb-release
|
3. 添加阿里云 Docker 镜像源
1 2 3 4 5
| curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
|
4. 安装 Docker
1 2
| sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io
|
5. 配置普通用户免 sudo 执行 Docker
1 2 3 4 5
| sudo usermod -aG docker $USER
sudo reboot
|
6. 验证安装
1 2 3 4 5
| sudo systemctl start docker
sudo docker run hello-world
|
如果看到 Hello from Docker! 的欢迎信息,说明安装成功。
查看基本信息:
1 2
| sudo docker version sudo docker images
|
🪟 Windows 安装 Docker Desktop + WSL2 优化
Windows 用户推荐使用 Docker Desktop,它默认基于 WSL2 后端运行,性能和兼容性都优于旧版 Hyper-V 方案。
安装到指定盘符(避免占用 C 盘)
默认情况下 Docker Desktop 安装在 C 盘,运行一段时间后 WSL2 虚拟磁盘也会挤占 C 盘空间。下面教你怎么装到 D 盘。
步骤一:从 Docker 官网 下载 Docker Desktop Installer.exe。
步骤二:以管理员身份打开终端,进入安装包所在目录后执行:
1
| start /w "" "Docker Desktop Installer.exe" install --installation-dir=D:\Docker --wsl-default-data-root=D:\Docker\wsl
|
参数说明:
| 参数 |
作用 |
--installation-dir=D:\Docker |
将 Docker Desktop 程序安装到 D 盘 |
--wsl-default-data-root=D:\Docker\wsl |
将 WSL2 数据目录也放到 D 盘 |
压缩 WSL2 虚拟磁盘释放空间
Docker 运行久了,WSL2 的虚拟磁盘文件 docker_data.vhdx 会膨胀。即使删除了容器和镜像,它也不会自动缩小。下面脚本可以手动压缩回收空间:
1 2 3 4 5 6 7 8 9 10 11
| wsl --shutdown
$diskpartScript = @" select vdisk file=$env:USERPROFILE\AppData\Local\Docker\wsl\disk\docker_data.vhdx compact vdisk detach vdisk "@
$diskpartScript | diskpart
|
💡 原理:compact vdisk 会回收动态扩展 VHDX 文件中未被实际使用的空间。完成后 WSL2 会在下次启动时自动重新挂载。
操作完成后重新打开 Docker Desktop 即可恢复正常使用。
🛠️ Docker 常用命令速查
镜像管理
1 2 3 4 5 6 7
| docker images docker pull <image>:<tag> docker rmi <image> docker build -t <name:tag> . docker tag <image> <new> docker push <image> docker history <image>
|
容器生命周期
1 2 3 4 5 6 7 8
| docker run <image> docker ps docker ps -a docker start <container> docker stop <container> docker restart <container> docker rm <container> docker rm -f <container>
|
docker run 常用参数
1 2 3 4 5 6 7 8
| docker run \ -d \ --name my-app \ -p 8080:80 \ -v /host/path:/container \ -e ENV=value \ --restart=always \ nginx:latest
|
容器调试
1 2 3 4 5 6 7
| docker logs <container> docker logs -f <container> docker exec -it <container> bash docker exec <container> <cmd> docker cp <from> <to> docker inspect <container> docker stats
|
清理
1 2 3
| docker system prune docker system prune -a docker volume prune
|
🧪 实战示例
示例一:快速部署 Nginx
1 2 3 4 5 6 7 8 9 10
| docker pull nginx:latest
docker run -d --name my-nginx -p 8080:80 nginx:latest
docker logs my-nginx
|
示例二:部署 MySQL 并持久化数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| mkdir -p ~/mysql-data
docker run -d \ --name my-mysql \ -p 3306:3306 \ -v ~/mysql-data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=my-secret-pw \ mysql:8.0
docker exec -it my-mysql mysql -uroot -p
docker stop my-mysql
|
示例三:Docker Compose 编排多服务
创建 docker-compose.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| version: '3.8' services: web: image: nginx:latest ports: - "8080:80" depends_on: - app
app: build: ./app ports: - "3000:3000" environment: - DB_HOST=db depends_on: - db
db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: secret volumes: - db-data:/var/lib/mysql
volumes: db-data:
|
一键启动所有服务:
❓ 常见问题
Q1: 拉取镜像很慢怎么办?
配置国内镜像加速器。编辑 /etc/docker/daemon.json:
1 2 3 4 5 6
| { "registry-mirrors": [ "https://docker.m.daocloud.io", "https://dockerproxy.com" ] }
|
然后重启 Docker 服务:
1
| sudo systemctl restart docker
|
Q2: 容器退出后还能重新进入吗?
直接 docker exec 需要容器处于运行状态。如果容器已退出且设置了 --restart=no,可以先 docker start <container> 再 docker exec。如果只想看退出的容器里的文件,可以用 docker cp 或重新 docker run 一个临时容器挂载原容器的数据卷。
Q3: 容器和虚拟机有什么区别?
| 维度 |
容器 |
虚拟机 |
| 启动速度 |
秒级 |
分钟级 |
| 资源占用 |
共享宿主机内核,MB 级 |
独立 OS,GB 级 |
| 隔离性 |
进程级隔离 |
完全隔离 |
| 适用场景 |
微服务、快速部署 |
传统应用、强隔离需求 |
Q4: 数据卷(Volume)和宿主机目录挂载(Bind Mount)有什么区别?
- Volume:由 Docker 管理,存储在
/var/lib/docker/volumes/,推荐用于持久化
- Bind Mount:直接挂载宿主机路径,适合开发和共享配置文件
📝 总结
本文从零开始介绍了 Docker 的:
| 板块 |
内容 |
| 🧠 核心概念 |
镜像、容器、仓库的关系(类-实例-仓库类比) |
| 📦 Ubuntu 安装 |
阿里云镜像源 + 一键安装 + 用户组配置 |
| 🪟 Windows 安装 |
D 盘安装 + WSL2 数据目录迁移 + 磁盘压缩 |
| 🛠️ 常用命令 |
镜像管理、容器操作、调试、清理 |
| 🧪 实战示例 |
Nginx、MySQL 部署 + Docker Compose 多服务编排 |
Docker 是现代开发和运维的必备技能。掌握了这些基础知识,你已经可以应对绝大多数日常场景了。
🔗 相关链接
📢 如果本文对你有帮助,欢迎点赞收藏!如有问题欢迎在评论区留言讨论。