用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容器就像便利贴------用完可以扔掉,重要内容要保存(用卷)! 🏷️

相关推荐
JuiceFS14 小时前
降低数据存储成本:JuiceFS v1.4 分层存储设计解析
运维·后端
红茶要加冰14 小时前
linux的例行性工作——计划任务
linux·运维·服务器
byxdaz14 小时前
Linux中查看硬件信息
linux·运维
darkdragonking14 小时前
由一次构建 OpenEuler 22.03 dnf源所了解到的
linux·运维·服务器
米高梅狮子14 小时前
Ceph 分布式存储 部署
linux·运维·数据库·分布式·ceph·docker·华为云
WUYOUGYLU14 小时前
云服务器怎么选、怎么用,才不花冤枉钱
运维·服务器
曹牧14 小时前
Nginx 504
运维·nginx
曦夜日长15 小时前
Linux系统篇,开发工具(五):git的基本使用和浅层认识
linux·运维·服务器
Harm灬小海15 小时前
【云计算学习之路】学习Centos7系统-ROOT密码重置方法
linux·运维·服务器·学习·云计算
IT瑞先生15 小时前
企业云服务器选型分析
运维·服务器