容器类型概览
📊 容器分类
1. 📝 临时容器(用完即删)
2. 💾 持久容器(长期运行)
3. 🎯 任务容器(执行特定任务)
4. 🌐 网络容器(提供网络服务)
5. 📁 数据容器(专门存储数据)
6. 🖥️ 交互式容器(可操作)
1. 临时容器(Disposable Containers)
🗑️ 特点:用完自动删除,不保留任何状态
基础命令:
bash
# 最基本:运行后立即删除
docker run --rm [镜像] [命令]
# 示例:
docker run --rm alpine echo "Hello Docker" # 输出后删除
docker run --rm ubuntu ls / # 列出根目录后删除
docker run --rm busybox ping -c 3 google.com # ping测试后删除
实际用例:
bash
# 1. 测试网络连通性
docker run --rm busybox ping -c 3 8.8.8.8
# 2. 快速查看镜像内容
docker run --rm ubuntu cat /etc/os-release
# 3. 清理测试文件(假设有测试镜像)
docker run --rm test-image clean-up-script.sh
2. 持久容器(Persistent Containers)
🏠 特点:长期运行,提供持续服务
基础命令:
bash
# 后台运行容器(最常见)
docker run -d --name [容器名] [镜像]
# 示例:
docker run -d --name my-nginx nginx
docker run -d --name my-mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
docker run -d --name my-redis redis
带配置的持久容器:
bash
# 1. 数据库容器(带环境变量和端口映射)
docker run -d \
--name mysql-db \
-e MYSQL_ROOT_PASSWORD=mysecret \
-p 3306:3306 \
mysql:8.0
# 2. Web服务器容器(挂载配置文件)
docker run -d \
--name web-server \
-p 80:80 \
-v /my/nginx.conf:/etc/nginx/nginx.conf \
nginx
# 3. 带数据持久化的容器
docker run -d \
--name wordpress \
-p 8080:80 \
-v wordpress_data:/var/www/html \
wordpress
管理持久容器:
bash
# 查看运行中的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
# 停止容器
docker stop my-nginx
# 启动已停止的容器
docker start my-nginx
# 重启容器
docker restart my-nginx
# 删除容器(必须先停止)
docker rm my-nginx
3. 交互式容器(Interactive Containers)
💬 特点:可以进入容器内部操作
基础命令:
bash
# 进入容器并打开shell(常用)
docker run -it --name [容器名] [镜像] sh/bash
# 示例:
docker run -it --name my-alpine alpine sh
docker run -it --name my-ubuntu ubuntu bash
docker run -it --name my-centos centos bash
实际用例:
bash
# 1. 探索镜像内容
docker run -it ubuntu bash
# 进入后可以:
# ls / # 查看根目录
# apt update # 更新包列表
# exit # 退出(容器停止)
# 2. 调试运行中的容器
# 先运行一个后台容器
docker run -d --name web nginx
# 然后进入这个容器查看
docker exec -it web bash
# 进入后可以:
# nginx -t # 测试nginx配置
# ps aux # 查看进程
# exit # 退出(容器继续运行)
# 3. 创建交互式开发环境
docker run -it \
--name dev-env \
-v $(pwd):/workspace \
-w /workspace \
python:3.9 \
bash
4. 任务容器(Task Containers)
⚙️ 特点:执行一次性任务,完成后停止
基础命令:
bash
# 运行一次性任务
docker run [镜像] [单次命令]
# 示例:
docker run node:14 node -e "console.log('Hello')"
docker run python:3 python -c "print('Hello World')"
实际用例:
bash
# 1. 数据处理任务
docker run --rm \
-v $(pwd)/data:/data \
python:3 \
python /data/process.py
# 2. 构建任务
docker run --rm \
-v $(pwd):/src \
-w /src \
node:16 \
npm run build
# 3. 备份任务(每天定时运行)
# 假设有备份脚本 backup.sh
docker run --rm \
-v db_data:/data \
-v $(pwd)/backups:/backup \
alpine \
tar czf /backup/backup-$(date +%Y%m%d).tar.gz /data
5. 数据容器(Data-Only Containers)
💿 特点:专门用于存储数据,不运行应用
创建数据容器:
bash
# 传统方式(旧版本)
docker create --name data-container \
-v /data \
busybox
# 现代方式:使用数据卷(更简单)
# 1. 创建数据卷
docker volume create mydata
# 2. 在应用容器中使用
docker run -d \
--name app \
-v mydata:/app/data \
myapp-image
6. 网络服务容器(Network Service Containers)
🌐 特点:提供网络服务,需要端口映射
基础命令:
bash
# 端口映射格式:-p [主机端口]:[容器端口]
docker run -d -p 80:80 --name web nginx
复杂端口映射:
bash
# 1. 多个端口映射
docker run -d \
--name full-stack \
-p 80:80 \
-p 443:443 \
-p 3306:3306 \
myapp
# 2. 指定主机IP
docker run -d \
--name internal-web \
-p 127.0.0.1:8080:80 \
nginx
# 3. 随机主机端口
docker run -d \
--name random-port \
-p 80 \
nginx
# 查看分配的端口
docker port random-port
完整对比表
| 类型 | 常用命令 | 特点 | 适用场景 |
|---|---|---|---|
| 临时容器 | docker run --rm |
用完即删,不保留状态 | 测试、一次性任务 |
| 持久容器 | docker run -d |
后台运行,长期存在 | Web服务器、数据库 |
| 交互式容器 | docker run -it |
可进入操作 | 调试、开发环境 |
| 任务容器 | docker run [命令] |
执行单次任务 | 批处理、构建 |
| 数据容器 | docker volume create |
专门存储数据 | 数据持久化 |
| 网络容器 | docker run -p |
端口映射 | Web服务、API |
新手实战练习
🎮 练习1:从简单到复杂
bash
# 第1步:运行最简单的临时容器
docker run --rm hello-world
# 第2步:运行交互式容器探索
docker run -it --rm ubuntu bash
# 在容器内:ls, pwd, exit
# 第3步:运行持久Web服务
docker run -d --name my-web -p 8080:80 nginx
# 浏览器访问 http://localhost:8080
# 第4步:运行数据库服务
docker run -d --name my-db -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql
# 第5步:组合使用(WordPress)
docker run -d --name wp-db \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql
docker run -d --name wp-web \
-p 80:80 \
--link wp-db:mysql \
wordpress
📝 常用参数总结
bash
# 基础参数
-d # 后台运行(守护进程)
-it # 交互式+终端(可操作)
--name # 给容器起名字
--rm # 退出后自动删除
# 资源配置
-p # 端口映射(主机:容器)
-v # 数据卷/目录挂载
-e # 环境变量
-w # 工作目录
--link # 连接其他容器
# 资源限制
--memory # 内存限制
--cpus # CPU限制
创建容器的完整流程
🔄 思考步骤
1. 我需要什么类型的容器?
□ 临时测试 □ 长期服务 □ 交互操作
2. 需要什么配置?
□ 端口映射 □ 数据存储 □ 环境变量
3. 资源需求?
□ 内存限制 □ CPU限制 □ 网络设置
4. 生命周期?
□ 自动删除 □ 手动管理 □ 重启策略
📋 决策树
开始
↓
是否需要保留数据? → 是 → 使用 -v 挂载卷
↓否
是否需要访问服务? → 是 → 使用 -p 映射端口
↓否
是否需要交互操作? → 是 → 使用 -it
↓否
是否长期运行? → 是 → 使用 -d
↓否
使用 --rm 创建临时容器
错误处理建议
🐛 新手常见问题
bash
# 问题1:容器名已存在
# 错误:Conflict. The container name "/myapp" is already in use
# 解决:换个名字或删除旧的
docker rm myapp
docker run --name myapp-new ...
# 问题2:端口已被占用
# 错误:Bind for 0.0.0.0:80 failed: port is already allocated
# 解决:换个端口
docker run -p 8080:80 ...
# 问题3:镜像不存在
# 错误:Unable to find image 'xxx:latest' locally
# 解决:检查镜像名或先拉取
docker pull ubuntu
docker run ubuntu ...
# 问题4:权限不足
# 错误:Got permission denied while trying to connect to the Docker daemon
# 解决:加sudo或添加用户到docker组
sudo docker run ...
# 或永久解决:sudo usermod -aG docker $USER
最佳实践建议
✅ 给新手的建议
- 从简单开始 :先用
--rm参数,避免容器积累 - 总要命名 :用
--name给容器起有意义的名字 - 先测试再持久化 :临时运行没问题,再加
-d - 及时清理 :定期
docker system prune - 学习日志查看 :
docker logs [容器名]
记住:Docker容器就像便利贴------用完可以扔掉,重要内容要保存(用卷)! 🏷️