长安的Docker教程长安的Docker教程
首页
快速开始
编程指南
首页
快速开始
编程指南
  • 🎯 Docker入门篇

    • 快速开始
    • Docker是什么?
    • 为什么要用Docker?
    • 安装Docker
    • 第一个容器
  • 📦 Docker基础篇

    • Docker镜像详解
    • 容器操作详解
    • 编写Dockerfile
    • 数据卷(Volumes)
    • Docker网络
  • ⚡ Docker进阶篇

    • Docker Compose
    • 多阶段构建
    • Docker性能优化
    • Docker最佳实践
  • 🚀 实战项目

    • 实战:部署Node.js应用
    • 实战:搭建数据库环境
    • 实战:微服务架构
  • 💡 常见问题

    • 常见问题排查
    • 实用技巧

容器操作详解

嘿!长安又来了!上一章咱们聊了镜像,这章咱们深入学习容器操作。准备好了吗?🚀

🎯 容器的生命周期

容器就像一个程序,有它的生命周期:

创建 → 启动 → 运行 → 暂停 → 停止 → 删除
 ↓      ↓      ↓      ↓      ↓      ↓
create start   up   pause  stop  remove

让长安一个一个讲给你听!

🚀 创建和运行容器

docker run(创建+启动)

最常用的命令,一步到位:

docker run [选项] 镜像名 [命令]

常用选项详解

1. -d(后台运行)

# 前台运行(会占用终端)
docker run nginx

# 后台运行(返回容器ID)
docker run -d nginx

2. --name(指定名字)

# 不指定名字,Docker会随机生成
docker run -d nginx
# 名字可能是:silly_einstein

# 指定名字
docker run -d --name my-web nginx
# 名字就是:my-web

💡 长安建议:生产环境一定要指定名字,方便管理!

3. -p(端口映射)

# 格式:-p 宿主机端口:容器端口
docker run -d -p 8080:80 nginx

# 多个端口映射
docker run -d \
  -p 8080:80 \
  -p 8443:443 \
  nginx

# 随机端口(Docker自动分配宿主机端口)
docker run -d -p 80 nginx

查看端口映射:

docker port <容器名>

4. -v(数据卷挂载)

# 挂载目录
docker run -d \
  -v /path/on/host:/path/in/container \
  nginx

# 挂载数据卷
docker run -d \
  -v mydata:/data \
  nginx

稍后会详细讲数据卷!

5. -e(环境变量)

# 设置一个环境变量
docker run -d \
  -e MYSQL_ROOT_PASSWORD=123456 \
  mysql

# 设置多个环境变量
docker run -d \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -e MYSQL_DATABASE=mydb \
  -e MYSQL_USER=myuser \
  mysql

6. --rm(退出后自动删除)

# 容器退出后自动删除(临时容器)
docker run --rm -it ubuntu bash

什么时候用? 测试、一次性任务

7. -it(交互式)

# -i:保持STDIN打开
# -t:分配一个伪终端

# 交互式运行
docker run -it ubuntu bash

8. --restart(重启策略)

# 不自动重启(默认)
docker run -d --restart=no nginx

# 总是重启
docker run -d --restart=always nginx

# 失败时重启
docker run -d --restart=on-failure nginx

# 失败时重启(最多3次)
docker run -d --restart=on-failure:3 nginx

# 除非手动停止,否则总是重启
docker run -d --restart=unless-stopped nginx

💡 长安建议:生产环境用--restart=unless-stopped

docker create(只创建不启动)

# 创建但不启动
docker create --name my-nginx nginx

# 查看状态(Created)
docker ps -a

# 手动启动
docker start my-nginx

什么时候用? 不常用,大多数时候直接用docker run

🎮 管理容器

启动和停止

# 启动容器
docker start <容器>

# 停止容器(优雅停止,给容器10秒时间清理)
docker stop <容器>

# 强制停止(立即kill)
docker kill <容器>

# 重启容器
docker restart <容器>

暂停和恢复

# 暂停容器(冻结进程)
docker pause <容器>

# 恢复容器
docker unpause <容器>

什么时候用? 临时释放资源,但不想停止容器

📊 查看容器信息

docker ps(查看运行中的容器)

# 查看运行中的容器
docker ps

# 查看所有容器(包括已停止的)
docker ps -a

# 只显示容器ID
docker ps -q

# 查看最近创建的容器
docker ps -l

# 显示容器大小
docker ps -s

docker stats(资源使用情况)

# 实时显示资源使用
docker stats

# 只显示一次
docker stats --no-stream

# 只看指定容器
docker stats my-nginx

输出:

CONTAINER ID   NAME       CPU %     MEM USAGE / LIMIT   MEM %     NET I/O       BLOCK I/O
abc123def456   my-nginx   0.01%     2.5MiB / 7.68GiB    0.03%     1.2kB / 0B    0B / 0B

docker top(容器内的进程)

docker top my-nginx

输出:

UID    PID     PPID    C   STIME   TTY   TIME       CMD
root   12345   12320   0   10:30   ?     00:00:00   nginx: master process
nginx  12346   12345   0   10:30   ?     00:00:00   nginx: worker process

docker inspect(详细信息)

docker inspect my-nginx

会输出一大堆JSON信息,包括:

  • 容器配置
  • 网络设置
  • 挂载点
  • 环境变量
  • 等等...

查看特定字段:

# 查看IP地址
docker inspect -f '{{.NetworkSettings.IPAddress}}' my-nginx

# 查看状态
docker inspect -f '{{.State.Status}}' my-nginx

# 查看启动时间
docker inspect -f '{{.State.StartedAt}}' my-nginx

📝 查看和操作容器日志

docker logs(查看日志)

# 查看日志
docker logs my-nginx

# 实时查看日志(类似tail -f)
docker logs -f my-nginx

# 查看最后100行
docker logs --tail 100 my-nginx

# 显示时间戳
docker logs -t my-nginx

# 从某个时间开始
docker logs --since 2024-12-01T10:00:00 my-nginx

# 最近1小时
docker logs --since 1h my-nginx

实战技巧:

# 查看错误日志
docker logs my-nginx 2>&1 | grep -i error

# 导出日志到文件
docker logs my-nginx > nginx.log

🔧 进入容器

docker exec(在运行中的容器执行命令)

# 进入容器bash
docker exec -it my-nginx bash

# 执行单个命令
docker exec my-nginx ls -l /etc/nginx

# 以root用户执行
docker exec -u root my-nginx whoami

常用场景:

# 1. 查看配置文件
docker exec my-nginx cat /etc/nginx/nginx.conf

# 2. 查看日志
docker exec my-nginx tail -f /var/log/nginx/access.log

# 3. 安装工具(临时)
docker exec -it my-nginx bash
apt update && apt install vim

⚠️ 注意:在容器内安装的东西,容器重启后还在,但容器删除后就没了!

docker attach(附加到容器)

docker attach my-nginx

和exec有什么区别?

exec:新开一个进程,退出不影响容器
attach:附加到主进程,退出会停止容器

💡 长安建议:大多数情况用exec,更安全!

📦 容器和宿主机之间传输文件

docker cp(复制文件)

# 从容器复制到宿主机
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf

# 从宿主机复制到容器
docker cp ./index.html my-nginx:/usr/share/nginx/html/

# 复制整个目录
docker cp my-nginx:/var/log ./logs

实战场景:

# 备份容器内的数据
docker cp my-mysql:/var/lib/mysql ./mysql-backup

# 替换配置文件
docker cp ./my-config.conf my-nginx:/etc/nginx/conf.d/
docker restart my-nginx

🗑️ 删除容器

docker rm(删除容器)

# 删除已停止的容器
docker rm my-nginx

# 强制删除运行中的容器
docker rm -f my-nginx

# 删除多个容器
docker rm container1 container2 container3

# 删除所有已停止的容器
docker rm $(docker ps -aq -f status=exited)

# 删除所有容器(危险!)
docker rm -f $(docker ps -aq)

docker container prune(清理)

# 删除所有已停止的容器
docker container prune

# 不要确认,直接删
docker container prune -f

🎯 实战案例

案例1:运行一个完整的Web应用

# 运行nginx,挂载自定义网页
docker run -d \
  --name my-web \
  --restart=unless-stopped \
  -p 80:80 \
  -v /path/to/html:/usr/share/nginx/html:ro \
  nginx:alpine

解释:

  • -d:后台运行
  • --name my-web:容器名
  • --restart=unless-stopped:自动重启
  • -p 80:80:端口映射
  • -v:挂载网页目录(:ro表示只读)
  • nginx:alpine:使用Alpine版本(更小)

案例2:运行MySQL数据库

# 运行MySQL
docker run -d \
  --name my-mysql \
  --restart=unless-stopped \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=my-secret-pw \
  -e MYSQL_DATABASE=mydb \
  -e MYSQL_USER=myuser \
  -e MYSQL_PASSWORD=mypassword \
  -v mysql-data:/var/lib/mysql \
  mysql:8.0

解释:

  • -e:设置环境变量
  • -v mysql-data:/var/lib/mysql:数据持久化

连接测试:

docker exec -it my-mysql mysql -uroot -pmy-secret-pw

案例3:一次性任务容器

# 运行一次性任务,完成后自动删除
docker run --rm \
  -v $(pwd):/data \
  alpine:latest \
  sh -c "tar -czf /data/backup.tar.gz /data"

💡 容器操作最佳实践

1. 命名规范

# ✅ 好的命名
docker run --name web-nginx-prod nginx
docker run --name db-mysql-dev mysql
docker run --name cache-redis-test redis

# ❌ 不好的命名
docker run --name container1 nginx
docker run --name test nginx

2. 使用标签管理容器

# 添加标签
docker run -d \
  --name web1 \
  --label env=prod \
  --label team=backend \
  nginx

# 根据标签查找
docker ps --filter "label=env=prod"

3. 资源限制

# 限制内存
docker run -d --memory="512m" nginx

# 限制CPU
docker run -d --cpus="1.5" nginx

# 限制内存+CPU
docker run -d \
  --memory="1g" \
  --memory-swap="2g" \
  --cpus="2" \
  nginx

4. 健康检查

# 添加健康检查
docker run -d \
  --name web \
  --health-cmd="curl -f http://localhost/ || exit 1" \
  --health-interval=30s \
  --health-timeout=3s \
  --health-retries=3 \
  nginx

# 查看健康状态
docker inspect --format='{{.State.Health.Status}}' web

5. 日志管理

# 限制日志大小
docker run -d \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  nginx

🎨 容器命令速查表

# 生命周期管理
docker run          # 创建并运行容器
docker create       # 创建容器(不启动)
docker start        # 启动容器
docker stop         # 停止容器
docker restart      # 重启容器
docker rm           # 删除容器
docker kill         # 强制停止容器
docker pause        # 暂停容器
docker unpause      # 恢复容器

# 信息查看
docker ps           # 列出容器
docker stats        # 资源使用情况
docker top          # 容器内进程
docker inspect      # 详细信息
docker logs         # 查看日志

# 容器操作
docker exec         # 在容器内执行命令
docker attach       # 附加到容器
docker cp           # 复制文件

# 批量操作
docker ps -aq              # 所有容器ID
docker stop $(docker ps -q)  # 停止所有运行中的容器
docker rm $(docker ps -aq)   # 删除所有容器
docker container prune     # 清理已停止的容器

💡 小结

今天长安教你精通了容器操作:

核心知识点

  1. 生命周期:创建→启动→运行→停止→删除
  2. 常用选项:-d、-p、-v、-e、--name、--restart
  3. 日志管理:docker logs
  4. 进入容器:docker exec
  5. 资源监控:docker stats
  6. 文件传输:docker cp

记住这些命令

docker run -d --name <名字> -p <端口> <镜像>  # 运行容器
docker ps -a                                # 查看容器
docker logs -f <容器>                       # 查看日志
docker exec -it <容器> bash                 # 进入容器
docker stop/start/restart <容器>            # 控制容器
docker rm <容器>                            # 删除容器

🚀 下一步

容器操作搞定了!但是你可能在想:

"我怎么制作自己的镜像?"

别急,下一章长安教你 编写Dockerfile,打造专属镜像!


💬 长安的实战经验:

刚开始用Docker的时候,我经常忘记加-d参数,然后终端就被占用了😂

还有一次,我忘了加--restart=always,服务器重启后所有容器都没了,老板差点把我炒了...

所以记住:生产环境一定要加--restart参数!

还有,定期清理停止的容器,不然会占用很多空间。

docker container prune这个命令,我每周都会运行一次!

下一章见!💪

在 GitHub 上编辑此页
Prev
Docker镜像详解
Next
编写Dockerfile