跳到正文

天行健,君子以自强不息

Docker 从入门到实践:安装部署、核心概念与常用命令

1.3k 5 分钟

📌 前言

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
# 添加 Docker 官方 GPG 密钥(使用阿里云镜像)
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
# 将当前用户加入 docker 组
sudo usermod -aG docker $USER

# 重启使配置生效
sudo reboot

6. 验证安装

1
2
3
4
5
# 启动 Docker 服务
sudo systemctl start docker

# 运行经典测试容器
sudo docker run hello-world

如果看到 Hello from Docker! 的欢迎信息,说明安装成功。

查看基本信息:

1
2
sudo docker version    # 查看 Docker 版本
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
# 第一步:关闭 WSL2
wsl --shutdown

# 第二步:使用 DiskPart 压缩虚拟磁盘
$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 pull nginx:latest)
docker rmi <image> # 删除镜像
docker build -t <name:tag> . # 根据 Dockerfile 构建镜像
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> # 实时跟踪日志(类似 tail -f)
docker exec -it <container> bash # 进入容器的 Shell
docker exec <container> <cmd> # 在容器中执行命令
docker cp <from> <to> # 宿主机与容器之间拷贝文件
docker inspect <container> # 查看容器详细信息(JSON 格式)
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

# 启动容器,将宿主机的 8080 映射到容器的 80
docker run -d --name my-nginx -p 8080:80 nginx:latest

# 打开浏览器访问 http://localhost:8080 即可看到 Nginx 欢迎页

# 查看日志
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

# 启动 MySQL,将数据持久化到宿主机目录
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 # 从本地 Dockerfile 构建
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:

一键启动所有服务:

1
docker compose up -d

❓ 常见问题

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 是现代开发和运维的必备技能。掌握了这些基础知识,你已经可以应对绝大多数日常场景了。


🔗 相关链接


📢 如果本文对你有帮助,欢迎点赞收藏!如有问题欢迎在评论区留言讨论。