Docker 基础入门教程
Docker 基础入门教程

Docker 让开发者可以打包应用及其依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 或 Windows 机器上。本教程将以最通俗易懂的方式,带你掌握 Docker 的核心用法。
一、 Docker 环境安装
1. Windows 系统
在 Windows 上,我们通常安装 Docker Desktop。
- 下载地址:Docker 官网
- 注意项:安装时请确保勾选了 WSL 2 支持,这会让 Docker 运行得更加顺畅。
- 验证:打开终端输入
docker --version,看到版本号即安装成功。
2. Linux 系统(以 Ubuntu 为例)
Linux 下通常使用命令行安装,最快的方法是使用官方的一键脚本:(选择1,4的命令进行安装)
1 | |
记得使用科学的上网方式进行安装哦
pull异常 教程 切换镜像站
一键配置脚本
1 | |
**支持系统:**OpenCloudOS、Ubuntu、Debian、CentOS、RHEL、Rocky Linux 等主流发行版。
二、 核心运行参数详解 (docker run)
在使用 Docker 时,最常用的命令就是 docker run。这个命令后面经常跟着一串“英文字母”参数,理解这些参数是入门的关键。

以下是常用参数的深度解析:
1. -i:交互式操作 (interactive)
- 通俗解释:保持容器的标准输入(STDIN)开启。
- 为什么要用:如果你想在容器启动后输入命令,就必须带上这个参数。它就像是连接了容器的“麦克风”,让它能听见你说话。
2. -t:终端 (tty)
- 通俗解释:为容器分配一个伪终端。
- 为什么要用:它会为你提供一个类似于 Linux 终端的命令行界面。通常与
-i连用(-it),让你感觉就像直接登录进了另一台电脑的黑色窗口。
3. -d:后台运行 (detach)
- 通俗解释:容器启动后会在后台运行,不会占用你当前的终端窗口。
- 为什么要用:当你运行一个网站服务器(如 Nginx)或数据库(如 MySQL)时,你不希望它一直霸占着你的屏幕,这时就用
-d。
4. -p:端口映射 (publish)
- 格式:
-p 宿主机端口:容器内端口 - 通俗解释:在容器的“围墙”上开扇窗户。
- 为什么要用:容器内部是一个隔离的网络。如果你在容器内部运行了一个 80 端口的 Web 服务,外部是访问不到的。通过
-p 8080:80,你可以访问电脑的localhost:8080,流量会自动转发到容器内部的 80 端口。
5. --name:指定容器名称
- 通俗解释:给你的容器起个“绰号”。
- 为什么要用:如果不指定,Docker 会随机给它起一个类似
determined_shirley的名字。指定名字(如--name my-web)方便你后续停止或删除它。
6. -v : 挂载卷
在掌握了基础的容器运行(-itd)和端口映射(-p)后,另一个至关重要的参数就是 -v。如果你不学会使用 -v,那么你的 Docker 容器就像一个没有硬盘的临时电脑,一旦关机(删除容器),所有数据都会灰飞烟灭。
1️⃣、 -v 是什么?
-v 代表 Volume(卷),也常被称为 “挂载”。
- 通俗解释:它就像是在你的宿主机(真实的 Windows 或 Linux 电脑)和 Docker 容器之间拉了一根“传送带”或者建立了一个“共享文件夹”。
- 核心功能:将宿主机的目录或文件,映射到容器内部。
2️⃣、 为什么要用 -v?(解决两大痛点)
1. 数据持久化(防止丢失)
默认情况下,你在容器里创建的任何文件(比如数据库里的数据、用户上传的图片)都保存在容器的层中。一旦你执行了 docker rm 删除了容器,这些数据会全部消失。
通过 -v,你把数据存在宿主机上,即使容器删了,新建一个容器挂载同一个目录,数据依然在。
2. 修改方便(实时同步)
如果你想修改容器里的配置文件(比如 Nginx 的 index.html),你不需要每次都进入容器内部去写代码。你只需要在外面(Windows/Linux)修改那个挂载的文件夹,容器内部会实时同步生效。
3️⃣、 -v 的语法格式
1 | |
1. 宿主机路径 (Host Path)
你电脑上的真实路径,例如 D:\web_data (Windows) 或 /home/user/app (Linux)。
2. 容器内路径 (Container Path)
镜像中预设的路径,例如 Nginx 存放网页的 /usr/share/nginx/html。
3. 权限 (可选)
rw: 读写(默认)。ro: 只读(read-only)。如果你希望容器只能看文件,不能改文件,就加上:ro。
4️⃣、 实战案例:一分钟修改网页内容
假设我们想运行一个 Nginx 容器,但不想用它默认的欢迎页面,而是用我们自己电脑上的 HTML 文件。
1. 在宿主机创建文件
在 Linux 的 /root/html 目录下(或 Windows 的某个文件夹下)创建一个 index.html,内容写上 <h1>Hello Docker Volume!</h1>。
2. 运行挂载命令
1 | |
命令拆解:
-d: 后台运行。-p 8080:80: 电脑 8080 端口映射容器 80 端口。-v /root/html:/usr/share/nginx/html:- 把外部的
/root/html文件夹。 - 映射到内部的
/usr/share/nginx/html。
- 把外部的
nginx: 镜像名。
3. 验证结果
现在你访问 http://localhost:8080,看到的不再是 Nginx 默认页面,而是你刚才写的 Hello Docker Volume!。
神奇之处: 此时你修改宿主机 /root/html/index.html 里的内容,刷新浏览器,页面会立刻变化,无需重启容器!
5️⃣、 匿名卷与具名卷(进阶)
除了上面这种指定具体路径的“绑定挂载”(Bind Mount),Docker 还有两种常见方式:
匿名卷:
-v /data
(只写了容器内路径。Docker 会自动在宿主机深处创建一个随机名字的文件夹。通常用于不关心数据存在哪,只要能持久化就行的情况。)具名卷:
-v my_db_data:/var/lib/mysql
(my_db_data是一个名字。Docker 会管理这个卷。你可以通过docker volume ls看到它。这种方式最推荐,因为它由 Docker 统一管理,方便备份和迁移。)你要学会管理你的“具名卷”,主要靠这几个指令:
命令 作用 docker volume ls查看当前所有的命名卷(看看有哪些保险柜) docker volume inspect <卷名>查看这个卷在硬盘的什么位置(通常在 /var/lib/docker/volumes/)docker volume create <卷名>手动创建一个卷(可选,通常运行 run时会自动创建)docker volume rm <卷名>删除一个卷(注意:删了数据就真没了) docker volume prune删除所有没在使用的卷(清理空间)
1 | |
实战演示:如何使用命名卷
第一步:运行容器并绑定命名卷
你不需要手动创建卷,直接运行命令,Docker 发现卷不存在会自动创建:
1 | |
第二步:查看卷是否生成
1 | |
你会看到列表中多了一个 my_web_data。
第三步:查看卷的真实位置(仅限 Linux)
如果你想知道 Docker 把数据存哪了:
1 | |
在输出的 Mountpoint 字段,你会看到类似 /var/lib/docker/volumes/my_web_data/_data 的路径。
5. 常见困惑:命名卷 vs 绑定挂载
| 特性 | 命名卷 (-v my_vol:/app) |
绑定挂载 (-v /root/data:/app) |
|---|---|---|
| 存储位置 | Docker 管理的特定区域 | 你自己指定的任何地方 |
| 管理方式 | 通过 Docker 命令管理 | 通过文件浏览器或系统命令管理 |
| 适用场景 | 数据库存储、持久化配置文件 | 开发环境(需要实时改代码) |
| 对初学者 | 更推荐(不容易写错路径) | 需要搞清楚宿主机绝对路径 |
6️⃣、 小结
| 参数项 | 全称 | 作用 | 就像是… |
|---|---|---|---|
| -v | Volume | 数据挂载 | 给容器插了一块“外接硬盘” |
使用建议:
- 数据库(MySQL/Redis):一定要用
-v,否则删容器等于删库跑路。 - 配置文件:建议用
-v,方便在外面改配置。 - 日志文件:建议用
-v,方便在宿主机直接查看日志,不用进容器。
注意:尽管 -v 是 Docker 的标准操作,但在 Windows 环境下使用 WSL 2 挂载路径时,可能会遇到文件权限或路径格式转换的问题,操作时请留意报错信息。
7. -e : 设置环境变量
作用:
向容器内部传递环境变量,常用于配置应用程序。
基本语法:
1 | |
使用示例:
1 | |
📊 实际应用场景
场景1:运行数据库
1 | |
场景2:运行Web应用
1 | |
场景3:运行Redis
1 | |
🔧 组合使用示例
1 | |
📋 常用组合模式
| 场景 | 典型命令 | 说明 |
|---|---|---|
| 快速测试 | docker run -it --rm alpine sh |
交互式临时容器 |
| 后台服务 | docker run -d -p 80:80 nginx |
Web服务器 |
| 数据库 | docker run -d -e VAR=val mysql |
需要配置的服务 |
| 开发环境 | docker run -d -v $(pwd):/app node |
挂载代码目录 |
💡 实用技巧
1. 查看容器环境变量
1 | |
2. 动态修改环境变量
1 | |
3. 使用环境变量文件
1 | |
⚠️ 注意事项
-e 的注意事项:
敏感信息:不要在命令中直接写密码(会出现在history中)
1
2
3
4
5
6
7
8
9# 不安全(密码在history中可见)
docker run -e PASSWORD=123456 app
# 相对安全(从变量读取)
export DB_PASS=123456
docker run -e PASSWORD=$DB_PASS app
# 最安全(使用Docker Secrets或环境文件)
docker run --env-file .secrets app变量覆盖:容器内已有的环境变量会被覆盖
特殊字符:包含空格或特殊字符的值需要引号
1
docker run -e GREETING="Hello World" app
🆚 -it 与 -d 对比
| 选项 | 用途 | 适用场景 |
|---|---|---|
-it |
交互式终端 | 调试、进入容器、执行命令 |
-d |
后台运行 | 长期运行的服务(Web、DB等) |
1 | |
-d*→* Detached(分离)→ 后台运行-e*→* Environment(环境)→ 环境变量-it*→* I*nteractive +* TTY → 交互式终端
8. --name : 自定义容器名称
1 | |
📚 优点
不使用 –name 的情况:
1 | |
使用 –name 的好处:
- 易于记忆:
my-nginx比romantic_babbage好记 - 便于管理:停止、启动、删除时不用记ID
- 避免冲突:明确知道每个容器的用途
- 脚本友好:在脚本中使用名称而不是ID
🔧 基本用法
1. 给容器起名字
1 | |
2. 使用名称管理容器
1 | |
综合实战演示
让我们把上面的参数串起来,运行一个 Nginx(网页服务器)容器:
1 | |
这段命令的意思是:
docker run: 启动一个新容器。-itd: 结合了交互、终端和后台运行。意味着它在后台活着,但如果你想进入它内部,它也为你准备好了终端。--name my-nginx: 给容器起名叫my-nginx。-p 8888:80: 把容器里的 80 端口映射到我电脑的 8888 端口。nginx: 使用的镜像名称。
执行完后,你在浏览器输入 localhost:8888 就能看到 Nginx 的欢迎页面了。
9. --restart : 重启策略
1 | |
📚 四种重启策略
1. no - 不自动重启(默认)
bash
1 | |
特点:
- 容器退出后不会自动重启
- 适用于一次性任务、测试容器
2. always - 总是重启
bash
1 | |
特点:
- 容器退出时总是重启
- 无论退出状态码是什么(0或非0)
- 适用于必须保持运行的服务
3. on-failure - 失败时重启
bash
1 | |
特点:
- 只有非0状态码退出时才重启
- 可以指定最大重试次数
- 适用于可能出错但需要恢复的服务
4. unless-stopped - 除非手动停止
bash
1 | |
特点:
- 容器退出时重启,除非用户手动停止
- Docker守护进程重启后,容器也会自动启动
- 最常用的生产环境策略
📊 策略对比表
| 策略 | 退出时重启 | Docker重启时启动 | 手动停止后 | 适用场景 |
|---|---|---|---|---|
no |
❌ 否 | ❌ 否 | - | 测试、一次性任务 |
always |
✅ 总是 | ✅ 是 | ✅ 会重启 | 必须持续运行的服务 |
on-failure |
⚠️ 失败时 | ✅ 是 | - | 可能出错的服务 |
unless-stopped |
✅ 总是 | ✅ 是 | ❌ 不重启 | 生产环境推荐 |
四、 常用管理命令
1. 查看容器状态
docker ps: 查看当前正在运行的容器。docker ps -a: 查看所有容器(包括已经停止的)。
2. 停止与启动
docker stop my-nginx: 停止名为my-nginx的容器。docker start my-nginx: 再次启动它。
3. 进入容器内部
如果你想进到容器里修改文件,使用:
1 | |
4. 删除容器与镜像
docker rm -f my-nginx: 强制删除运行中的容器。docker rmi nginx: 删除本地的 nginx 镜像。
五、 Docker 常用命令速查表
📋 核心命令对比表
| 命令 | 作用 | 常用选项 | 示例 | 说明 |
|---|---|---|---|---|
docker pull |
拉取镜像 | -a:所有标签 --platform:指定平台 |
docker pull nginx:alpine |
只下载镜像,不运行 |
docker create |
创建容器 | --name:命名 -it:交互终端 -p:端口映射 -v:卷挂载 -e:环境变量 |
docker create --name myapp nginx |
只创建,不启动 |
docker run |
创建并启动容器 | -d:后台运行 --rm:退出后删除 --restart:重启策略 |
docker run -d -p 80:80 nginx |
最常用,等于 create + start |
docker start |
启动已存在的容器 | -a:附加输出 -i:交互模式 |
docker start myapp |
启动已停止的容器 |
docker stop |
停止运行中的容器 | -t:超时时间(秒) |
docker stop myapp |
优雅停止(SIGTERM) |
docker restart |
重启容器 | -t:超时时间 |
docker restart myapp |
等于 stop + start |
docker pause |
暂停容器 | 无 | docker pause myapp |
暂停所有进程 |
docker unpause |
恢复容器 | 无 | docker unpause myapp |
恢复暂停的容器 |
docker rm |
删除容器 | -f:强制删除运行中的 -v:同时删除卷 |
docker rm -f myapp |
删除容器(镜像还在) |
docker rmi |
删除镜像 | -f:强制删除 |
docker rmi nginx |
删除镜像 |
🔄 容器生命周期管理
完整流程示例:
1 | |
快捷方式:
1 | |
📊 状态转换图
1 | |
🎯 常用组合命令
开发测试:
1 | |
生产部署:
1 | |
批量操作:
1 | |
⚙️ 选项详解表
| 选项 | 适用命令 | 作用 | 示例 |
|---|---|---|---|
-d |
run |
后台运行 | docker run -d nginx |
-it |
run, create, exec |
交互终端 | docker run -it alpine sh |
--name |
run, create |
容器命名 | docker run --name myapp nginx |
-p |
run, create |
端口映射 | docker run -p 8080:80 nginx |
-v |
run, create |
卷挂载 | docker run -v /data:/app nginx |
-e |
run, create |
环境变量 | docker run -e KEY=value nginx |
--rm |
run |
退出后删除 | docker run --rm alpine echo hi |
--restart |
run, create |
重启策略 | docker run --restart always nginx |
-f |
rm, rmi |
强制操作 | docker rm -f myapp |
-a |
ps, start, pull |
所有/附加 | docker ps -a |
🔍 查看和监控
| 命令 | 作用 | 常用选项 |
|---|---|---|
docker ps |
查看容器 | -a:所有容器-q:只显示ID--filter:过滤 |
docker images |
查看镜像 | -a:所有镜像-q:只显示ID |
docker logs |
查看日志 | -f:实时跟踪--tail N:最后N行 |
docker inspect |
查看详情 | -f:格式化输出 |
docker stats |
实时资源监控 | 无 |
docker top |
查看容器进程 | 无 |
docker diff |
查看文件变化 | 无 |
💡 实用技巧
1. 一键清理
1 | |
2. 查看帮助
1 | |
3. 导出和导入
1 | |
🚨 注意事项
docker run≠docker create + startrun会应用所有运行时配置create只创建,可以后续修改配置
停止 vs 删除
stop:容器还在,可以重新启动rm:容器被删除,数据可能丢失(除非用了卷)
镜像 vs 容器
pull/rmi:操作的是镜像(模板)run/stop/rm:操作的是容器(实例)
生产环境建议
1
2
3# 总是使用 --name
# 总是使用 --restart unless-stopped
# 重要数据一定要用 -v 挂载卷
📱 快速参考卡片
1 | |
这个表格涵盖了 Docker 日常使用中 90% 的场景。掌握这些命令,你就能熟练管理 Docker 容器了!
六、 总结
Docker 的核心逻辑就是:拉取镜像 -> 运行容器 -> 管理容器。
- 镜像是“安装包”。
- 容器是安装好后“正在运行的程序”。
- 参数(
-i,-t,-d,-p)是用来控制这个程序运行方式的“开关”。
