1. Docker 基础概念与核心价值
Docker 作为现代应用开发和部署的基础设施,已经成为开发者工具箱中不可或缺的一部分。它通过容器化技术解决了"在我机器上能跑"的经典难题,让应用运行环境真正实现了可移植性和一致性。
容器与虚拟机的本质区别在于:虚拟机模拟整个操作系统,而容器共享主机内核,只是对进程进行隔离。这种架构使得 Docker 容器启动速度极快(毫秒级),资源占用极小(MB级),同时保持了良好的隔离性。我在实际工作中发现,同样的服务器资源,使用容器可以部署的应用数量通常是虚拟机的5-10倍。
Docker 的核心组件包括:
- Docker 守护进程(dockerd):管理容器的后台服务
- Docker 客户端(docker):用户交互的命令行工具
- Docker 镜像(image):包含应用及其依赖的只读模板
- Docker 容器(container):镜像的运行实例
- Docker 仓库(registry):存储和分发镜像的服务
提示:初学者常混淆镜像和容器的关系。可以理解为:镜像是菜谱,容器是按照菜谱做出来的菜。你可以用同一份菜谱(镜像)做出多道菜(容器)。
2. Docker 环境安装与配置
2.1 主流平台安装指南
在 Ubuntu 20.04 LTS 上安装 Docker 的最简命令序列:
bash复制sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
sudo apt update
sudo apt install docker-ce
对于 Windows/macOS 用户,推荐直接安装 Docker Desktop。但要注意:
- Windows 10 需要开启 Hyper-V 功能
- macOS 需要至少 4GB 内存
- 两者都需要在 BIOS 中启用虚拟化支持
2.2 安装后关键配置
修改 Docker 守护进程配置(/etc/docker/daemon.json)以优化性能:
json复制{
"registry-mirrors": ["https://<your-mirror>.mirror.aliyuncs.com"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"storage-driver": "overlay2"
}
配置完成后需要重启服务:
bash复制sudo systemctl restart docker
注意:生产环境务必配置日志轮转,否则容器日志可能占满磁盘。我曾遇到过因为未配置日志限制,导致一个高流量应用的容器在3天内产生了47GB的日志文件。
3. 镜像操作全指南
3.1 镜像生命周期管理
从仓库拉取镜像(以Nginx为例):
bash复制docker pull nginx:1.21-alpine
查看本地镜像列表:
bash复制docker images
# 更详细的显示方式
docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}"
删除无用镜像:
bash复制# 删除指定镜像
docker rmi nginx:1.21-alpine
# 删除所有悬空镜像(未被任何容器引用的中间层镜像)
docker image prune
# 强制删除所有未被使用的镜像
docker image prune -a
3.2 镜像构建高级技巧
Dockerfile 最佳实践示例:
dockerfile复制# 多阶段构建显著减小最终镜像体积
FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .
FROM alpine:3.14
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]
构建镜像并打标签:
bash复制docker build -t myapp:1.0 -t myapp:latest .
经验:总是为镜像打上语义化版本标签,同时维护一个latest标签。但在生产环境部署时,应该明确使用版本标签而非latest,避免意外更新。
4. 容器操作完全手册
4.1 容器基础操作
启动一个新容器:
bash复制docker run -d --name my-nginx -p 8080:80 nginx:alpine
参数解析:
-d: 后台运行(detached模式)--name: 为容器指定名称-p: 端口映射(主机端口:容器端口)
查看运行中的容器:
bash复制docker ps
# 查看所有容器(包括已停止的)
docker ps -a
进入运行中的容器:
bash复制docker exec -it my-nginx sh
停止和删除容器:
bash复制docker stop my-nginx
docker rm my-nginx
# 强制删除运行中的容器
docker rm -f my-nginx
4.2 容器数据持久化
创建并挂载数据卷:
bash复制docker volume create my-data
docker run -d --name db -v my-data:/var/lib/mysql mysql:8.0
挂载主机目录:
bash复制docker run -d --name nginx -v /host/path:/container/path nginx
关键点:数据卷(volume)是Docker管理的持久化存储,适合生产环境;绑定挂载(bind mount)直接使用主机目录,适合开发环境。我曾因混淆两者导致开发环境配置意外覆盖生产数据。
5. 网络与多容器编排
5.1 Docker 网络模式
查看网络列表:
bash复制docker network ls
创建自定义网络:
bash复制docker network create my-network
在自定义网络中运行互联的容器:
bash复制docker run -d --name web --network my-network nginx
docker run -it --network my-network alpine ping web
5.2 Docker Compose 实战
docker-compose.yml 示例:
yaml复制version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
volumes:
- pg-data:/var/lib/postgresql/data
volumes:
pg-data:
常用命令:
bash复制# 启动服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 停止服务
docker-compose down
技巧:在开发环境可以添加
--build参数确保每次都能重建镜像,但在生产环境应该明确指定镜像版本避免意外变更。
6. 生产环境最佳实践
6.1 资源限制与监控
限制容器资源使用:
bash复制docker run -d --name limited \
--memory=512m \
--cpus=1.5 \
--pids-limit=100 \
nginx
查看容器资源使用情况:
bash复制docker stats
6.2 日志管理策略
查看容器日志:
bash复制# 查看最新日志
docker logs my-nginx
# 实时跟踪日志
docker logs -f my-nginx
# 显示时间戳
docker logs -t my-nginx
重要提醒:生产环境应该配置集中式日志收集(如ELK栈),避免依赖本地日志。我曾参与处理过一个事故,因为容器崩溃导致关键日志丢失,最终不得不从备份恢复整个服务。
7. 安全加固指南
7.1 最小权限原则
以非root用户运行容器:
dockerfile复制FROM alpine
RUN adduser -D myuser
USER myuser
CMD ["myapp"]
禁用容器特权:
bash复制docker run --security-opt=no-new-privileges myimage
7.2 镜像扫描与漏洞管理
使用内置扫描功能(需Docker Desktop或Docker Hub):
bash复制docker scan myimage
定期基础镜像更新策略:
dockerfile复制# 使用具体版本号而非latest
FROM debian:10.10-slim
8. 高级调试技巧
8.1 容器故障排查
检查容器元数据:
bash复制docker inspect my-nginx
查看容器进程:
bash复制docker top my-nginx
复制文件进出容器:
bash复制# 从容器复制到主机
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf.bak
# 从主机复制到容器
docker cp ./config.json my-nginx:/app/config.json
8.2 性能问题诊断
分析容器性能瓶颈:
bash复制docker stats --no-stream
docker run --rm -it --pid=host alpine top
检查网络延迟:
bash复制docker run --rm -it alpine ping google.com
9. 常用工具链集成
9.1 开发调试工具
使用 dive 分析镜像层:
bash复制dive myimage:latest
使用 ctop 监控容器:
bash复制ctop
9.2 CI/CD 集成示例
GitLab CI 示例:
yaml复制build_image:
stage: build
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
10. 实战问题解决方案
10.1 常见错误处理
"端口已占用"错误:
bash复制# 找出占用端口的进程
sudo lsof -i :8080
# 或者直接强制停止使用该端口的容器
docker stop $(docker ps -q --filter "publish=8080")
"磁盘空间不足"问题:
bash复制# 清理无用资源
docker system prune -a --volumes
10.2 性能优化案例
某电商网站优化前后对比:
- 原始方案:单个大容器(2GB内存)运行所有服务
- 优化后:微服务架构,每个容器限制200MB内存
- 结果:同一台服务器容器密度从3个提升到15个,资源利用率提高400%