用Docker创建不同的容器类型

容器类型概览

📊 容器分类

复制代码
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

最佳实践建议

给新手的建议

  1. 从简单开始 :先用 --rm 参数,避免容器积累
  2. 总要命名 :用 --name 给容器起有意义的名字
  3. 先测试再持久化 :临时运行没问题,再加 -d
  4. 及时清理 :定期 docker system prune
  5. 学习日志查看docker logs [容器名]

记住:Docker容器就像便利贴------用完可以扔掉,重要内容要保存(用卷)! 🏷️

相关推荐
2501_933670796 小时前
中专学财务,2026年就业方向全解析:从出纳到财务BP的进阶路
运维·服务器
Dovis(誓平步青云)6 小时前
《滑动窗口算法:从 “暴力遍历” 到 “线性高效” 的思维跃迁》
运维·服务器·数据库·算法
迎仔6 小时前
05-计算设备运维进阶:算力中心的设备医生
运维
小Pawn爷6 小时前
3.Dockerfile
docker
CodeGolang6 小时前
Docker容器化部署Zabbix监控系统完整指南
docker·容器·zabbix
石去皿6 小时前
【嵌入式就业10】Linux内核深度解析:从启动流程到驱动框架的工业级实践
linux·运维·服务器
Wpa.wk6 小时前
接口自动化 - 多环境统一文件配置 +多响应统一转换处理
运维·服务器·测试工具·自动化·接口自动化·统一配置
Trouvaille ~6 小时前
【Linux】应用层协议设计实战(二):Jsoncpp序列化与完整实现
linux·运维·服务器·网络·c++·json·应用层
是枚小菜鸡儿吖7 小时前
从 0 到 1 生成自定义算子:CANN + AIGC 的自动化工作流
运维·自动化·aigc