1. Docker部署与核心概念解析
Docker作为当前最流行的容器化技术,已经彻底改变了应用的打包、分发和运行方式。我第一次接触Docker是在2015年一个微服务项目中,当时被它"一次构建,处处运行"的特性所震撼。与传统虚拟机相比,Docker容器更加轻量级,启动速度更快,资源占用更少,这使得它成为开发者和运维人员的首选工具。
核心优势主要体现在三个方面:首先,环境一致性,解决了"在我机器上能跑"的经典问题;其次,隔离性,每个容器拥有独立的文件系统、网络和进程空间;最后,可移植性,容器镜像可以在任何支持Docker的平台上运行。根据2023年的行业调查,超过78%的企业在生产环境中使用容器技术,其中Docker占比高达92%。
重要提示:虽然Docker在大多数Linux发行版上运行良好,但在Windows和macOS上需要通过Docker Desktop实现,这可能会遇到虚拟化支持问题,后文会专门讲解解决方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Docker安装与部署实战
2.1 不同系统的安装方法
Linux系统(以Ubuntu 22.04为例)
bash复制# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
# 安装依赖
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
# 添加Docker官方GPG密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 设置仓库
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 验证安装
sudo docker run hello-world
Windows系统注意事项
- 需要Windows 10/11 Pro/Enterprise版本,家庭版需升级
- BIOS中开启虚拟化支持(VT-x/AMD-V)
- 安装WSL2作为后端(命令:
wsl --install) - 下载Docker Desktop安装包直接安装
常见安装问题解决
- "Virtualization support not detected"错误:
- 进入BIOS启用虚拟化技术
- Windows中关闭Hyper-V相关功能
- 执行命令:
bcdedit /set hypervisorlaunchtype off后重启
2.2 国内镜像加速配置
创建或修改/etc/docker/daemon.json:
json复制{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
重启服务:sudo systemctl restart docker
3. Docker核心操作全解析
3.1 镜像管理实战
镜像搜索与获取
bash复制# 搜索镜像(支持通配符)
docker search nginx --filter "is-official=true"
# 拉取镜像(指定版本)
docker pull nginx:1.23-alpine
# 查看本地镜像
docker images
# 或者使用新语法
docker image ls
镜像构建实践
Dockerfile示例:
dockerfile复制FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
构建命令:docker build -t myapp:v1 .
3.2 容器生命周期管理
基本操作命令
bash复制# 启动容器(-d后台运行,-p端口映射,-v卷挂载)
docker run -d -p 8080:80 --name mynginx nginx
# 查看运行中的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
# 停止/启动/重启容器
docker stop mynginx
docker start mynginx
docker restart mynginx
# 进入容器shell
docker exec -it mynginx /bin/bash
# 删除容器(必须先停止)
docker rm mynginx
资源限制与监控
bash复制# 限制CPU和内存
docker run -it --cpus="1.5" --memory="512m" ubuntu
# 查看资源使用情况
docker stats
4. Docker高级应用场景
4.1 微服务部署实践
使用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:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
启动命令:docker compose up -d
4.2 持久化数据管理
数据卷操作
bash复制# 创建命名卷
docker volume create myvol
# 使用数据卷
docker run -d --name db -v myvol:/var/lib/mysql mysql:5.7
# 备份数据卷
docker run --rm -v myvol:/source -v $(pwd):/backup busybox \
tar czf /backup/backup.tar.gz -C /source .
4.3 网络配置详解
自定义网络创建
bash复制# 创建桥接网络
docker network create --driver bridge mynet
# 容器使用自定义网络
docker run -d --network=mynet --name web nginx
docker run -it --network=mynet busybox ping web
端口映射类型
-p 8080:80:主机8080映射容器80-p 80:随机主机端口映射容器80-p 127.0.0.1:8080:80:仅本地访问
5. 生产环境最佳实践
5.1 安全加固措施
-
非root用户运行容器:
dockerfile复制FROM alpine RUN adduser -D myuser USER myuser -
只读文件系统:
bash复制
docker run --read-only -d nginx -
资源限制:
bash复制docker run --memory="512m" --cpus="1" -d nginx
5.2 日志管理方案
查看容器日志
bash复制# 查看实时日志
docker logs -f container_name
# 显示最后100行
docker logs --tail 100 container_name
# 带时间戳查看
docker logs -t container_name
日志驱动配置
修改/etc/docker/daemon.json:
json复制{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
6. 常见问题排错指南
6.1 启动故障排查
容器立即退出
- 查看退出码:
docker ps -a - 检查日志:
docker logs container_id - 常见原因:
- 应用崩溃(检查应用日志)
- 端口冲突(
netstat -tulnp | grep 端口号) - 资源不足(
docker stats)
网络连接问题
- 检查容器网络:
bash复制
docker network inspect bridge - 测试容器间连通性:
bash复制docker exec -it container1 ping container2
6.2 性能优化技巧
-
多阶段构建减小镜像体积:
dockerfile复制FROM golang:1.19 as builder WORKDIR /app COPY . . RUN go build -o myapp FROM alpine:latest COPY --from=builder /app/myapp . CMD ["./myapp"] -
使用.dockerignore文件:
code复制node_modules *.log .git -
镜像层优化:
- 合并RUN指令
- 按修改频率排序COPY
- 清理临时文件
7. 企业级扩展方案
7.1 私有镜像仓库搭建
使用Harbor部署私有仓库:
bash复制docker run -d -p 80:80 -p 443:443 \
--name harbor --restart always \
-v /data/harbor:/data \
goharbor/harbor:latest
7.2 容器编排入门
Kubernetes基础对象:
- Pod:最小部署单元
- Deployment:声明式更新
- Service:网络访问抽象
- Ingress:外部访问管理
简单部署示例:
yaml复制apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
8. 监控与维护实战
8.1 监控方案实施
使用cAdvisor+Prometheus+Grafana:
bash复制# 启动cAdvisor
docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest
Prometheus配置示例:
yaml复制scrape_configs:
- job_name: 'docker'
static_configs:
- targets: ['cadvisor:8080']
8.2 日常维护命令
磁盘空间清理
bash复制# 删除所有停止的容器
docker container prune
# 删除未被使用的镜像
docker image prune -a
# 删除所有未被使用的资源
docker system prune
批量操作技巧
bash复制# 停止所有容器
docker stop $(docker ps -aq)
# 删除所有容器
docker rm $(docker ps -aq)
# 更新所有容器
for c in $(docker ps --format '{{.Names}}'); do
docker pull $(docker inspect --format '{{.Config.Image}}' $c)
docker restart $c
done
9. 典型应用场景实现
9.1 数据库容器化
MySQL部署示例:
bash复制docker run -d \
--name mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=myapp \
-e MYSQL_USER=user \
-e MYSQL_PASSWORD=pass \
-v mysql_data:/var/lib/mysql \
-p 3306:3306 \
mysql:8.0 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
9.2 CI/CD流水线集成
GitLab Runner Docker执行器配置:
toml复制[[runners]]
name = "docker-runner"
url = "https://gitlab.com/"
token = "TOKEN"
executor = "docker"
[runners.docker]
tls_verify = false
image = "alpine:latest"
privileged = false
disable_cache = false
volumes = ["/cache"]
shm_size = 0
10. 新兴技术整合
10.1 大模型本地部署
使用Ollama运行LLM:
bash复制docker run -d \
--gpus all \
-p 11434:11434 \
-v ollama:/root/.ollama \
--name ollama \
ollama/ollama
下载运行模型:
bash复制docker exec -it ollama ollama pull llama2
docker exec -it ollama ollama run llama2
10.2 边缘计算方案
轻量级K3s部署:
bash复制docker run -d \
--name k3s-server \
--privileged \
--network host \
-v /var/lib/rancher/k3s:/var/lib/rancher/k3s \
-v /etc/rancher:/etc/rancher \
rancher/k3s:latest \
server
在长期使用Docker的过程中,我发现最容易被忽视的是资源限制配置。曾经有一个生产事故就是因为容器无限制占用内存导致主机OOM。建议即使是开发环境也养成设置--memory和--cpus参数的习惯,这能提前发现潜在的性能问题。另外,定期执行docker system prune可以避免磁盘空间被旧镜像占满,特别是CI/CD环境中这个操作非常必要。
