1. Docker基础概念与核心价值
Docker作为现代应用开发和部署的标准工具,已经彻底改变了软件交付的方式。简单来说,Docker通过容器化技术将应用程序及其所有依赖项打包在一起,形成一个轻量级、可移植的单元。与传统的虚拟机相比,Docker容器共享主机操作系统内核,不需要为每个应用加载完整的操作系统,这使得容器启动更快、资源占用更少。
在实际工作中,Docker带来的最直接价值体现在三个方面:环境一致性(从开发到生产保持完全相同的运行环境)、快速部署(秒级启动容器)和资源隔离(多个容器互不干扰)。我经历过太多"在我机器上能跑"的尴尬场景,而Docker从根本上解决了这个问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 容器生命周期管理命令
2.1 容器创建与启动
docker run 是最核心的启动命令,其基本格式为:
bash复制docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
几个必须掌握的实用组合:
bash复制# 启动一个交互式Ubuntu容器
docker run -it ubuntu /bin/bash
# 后台运行Nginx并映射端口
docker run -d -p 8080:80 --name my_nginx nginx
# 挂载主机目录到容器
docker run -v /host/path:/container/path mysql
经验提示:总是使用
--name给容器命名,比依赖随机生成的ID更易管理。我曾因为依赖容器ID导致误删生产环境容器,教训深刻。
2.2 容器状态监控
查看运行中的容器:
bash复制docker ps
查看所有容器(包括已停止的):
bash复制docker ps -a
显示容器资源使用统计(类似Linux的top命令):
bash复制docker stats
查看容器日志:
bash复制docker logs -f container_name
排查技巧:当容器异常退出时,先看日志再重启。有次我们的服务崩溃,直接重启导致丢失了关键错误信息,后来通过
docker logs --since 30m才找到根因。
3. 镜像管理实战技巧
3.1 镜像获取与查找
从仓库拉取镜像:
bash复制docker pull ubuntu:20.04
搜索Docker Hub上的镜像:
bash复制docker search mysql
查看本地镜像列表:
bash复制docker images
3.2 镜像构建与推送
构建镜像的黄金标准是使用Dockerfile:
dockerfile复制FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
构建命令:
bash复制docker build -t myapp:v1 .
给镜像打标签并推送到私有仓库:
bash复制docker tag myapp:v1 registry.example.com/myapp:v1
docker push registry.example.com/myapp:v1
版本控制建议:镜像标签不要只用latest,应该包含版本号和构建时间,如
v1.2.3-20230715。我们曾因latest标签回滚错版本导致线上事故。
4. 网络与存储配置
4.1 网络管理
创建自定义网络:
bash复制docker network create my_network
查看网络详情:
bash复制docker network inspect my_network
连接容器到网络:
bash复制docker network connect my_network container_name
4.2 数据持久化
创建数据卷:
bash复制docker volume create db_data
使用数据卷:
bash复制docker run -v db_data:/var/lib/mysql mysql
数据安全警告:生产环境一定要用命名卷而非主机目录挂载。有团队直接挂载
/home/user/data导致目录权限混乱,整个主机无法登录。
5. 日常维护与问题排查
5.1 资源清理
删除停止的容器:
bash复制docker container prune
删除未被使用的镜像:
bash复制docker image prune
一键清理所有无用资源:
bash复制docker system prune
5.2 进入容器调试
进入运行中的容器:
bash复制docker exec -it container_name /bin/bash
拷贝文件到容器:
bash复制docker cp file.txt container_name:/path/
调试经验:尽量使用
exec而非attach,后者会直接连接到主进程,意外退出可能导致容器停止。有次我误用attach导致生产容器退出,不得不紧急处理。
6. 生产环境最佳实践
6.1 资源限制
限制容器内存使用:
bash复制docker run -m 512m --memory-swap=1g myapp
限制CPU份额:
bash复制docker run --cpus=1.5 myapp
6.2 健康检查
在Dockerfile中定义健康检查:
dockerfile复制HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/health || exit 1
运行时查看健康状态:
bash复制docker inspect --format='{{json .State.Health}}' container_name
6.3 日志管理
配置日志驱动和大小限制:
bash复制docker run --log-driver=json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx
运维教训:一定要设置日志轮转。我们的一个服务日志暴涨,没设限制直接撑爆了磁盘,导致整个Docker守护进程崩溃。
7. 组合命令与实用脚本
7.1 常用组合命令
批量停止所有运行中的容器:
bash复制docker stop $(docker ps -q)
删除所有已退出的容器:
bash复制docker rm $(docker ps -aq --filter status=exited)
7.2 实用Shell脚本
自动清理30天前的镜像:
bash复制#!/bin/bash
docker image prune -a --force --filter "until=720h"
备份所有数据卷:
bash复制#!/bin/bash
for volume in $(docker volume ls -q); do
docker run --rm -v $volume:/data -v $(pwd):/backup \
alpine tar czf /backup/$volume.tar.gz -C /data .
done
这些命令和技巧都是我多年容器化实践中积累的精华,特别是那些用血泪教训换来的经验提示。建议读者先掌握基础命令,然后逐步深入网络、存储等高级主题,最后形成适合自己的命令组合和工作流程。
