引言
在云原生时代,Docker就像一艘轻量级的"应用集装箱船"🚢,让软件部署变得前所未有的高效!本文将带你从零开始掌握Docker的核心技术,从基础概念到生产实践,从单容器管理到多服务编排。无论你是开发还是运维,这些Docker技能都将大幅提升你的工作效率!准备好你的Linux主机,让我们一起扬帆起航,探索容器化的奥秘吧~ 🌊
一、Docker 基础概念
1.1 核心组件
- Docker Engine:核心容器运行时
- Images:只读模板,包含应用和运行环境
- Containers:镜像的运行实例
- Dockerfile:构建镜像的指令文件
- Volumes:持久化数据存储
- Networks:容器网络通信
1.2 与传统虚拟化的区别
特性 | Docker容器 | 传统虚拟机 |
---|---|---|
虚拟化级别 | 操作系统级 | 硬件级 |
启动速度 | 秒级 | 分钟级 |
性能损耗 | 低(~1-5%) | 高(~15-20%) |
镜像大小 | MB级 | GB级 |
隔离性 | 进程级 | 完全隔离 |
二、Docker 安装与配置
2.1 安装 Docker Engine
# Ubuntu/Debian
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 gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
# RHEL/CentOS
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
2.2 非root用户权限配置
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker # 刷新组权限
2.3 配置镜像加速器(国内用户)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
三、Docker 基础操作
3.1 镜像管理
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx:1.21-alpine
# 列出镜像
docker images
# 删除镜像
docker rmi nginx:1.21-alpine
# 导出/导入镜像
docker save -o nginx.tar nginx:1.21-alpine
docker load -i nginx.tar
3.2 容器生命周期
# 运行容器
docker run -d --name my_nginx -p 8080:80 nginx:1.21-alpine
# 列出容器
docker ps # 运行中的容器
docker ps -a # 所有容器
# 停止/启动容器
docker stop my_nginx
docker start my_nginx
# 进入容器
docker exec -it my_nginx /bin/sh
# 删除容器
docker rm my_nginx
3.3 日志与监控
# 查看日志
docker logs my_nginx
docker logs -f my_nginx # 实时日志
# 资源监控
docker stats
docker top my_nginx
# 检查容器详情
docker inspect my_nginx
四、Dockerfile 最佳实践
4.1 基础 Dockerfile 示例
# 使用官方轻量级Python镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 复制依赖文件
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 8000
# 定义环境变量
ENV FLASK_APP=app.py
# 运行应用
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]
4.2 多阶段构建示例
# 构建阶段
FROM golang:1.16 AS builder
WORKDIR /src
COPY . .
RUN go build -o /app
# 运行阶段
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app /app
CMD ["/app"]
4.3 构建优化技巧
- 使用
.dockerignore
文件减少构建上下文 - 合理安排指令顺序,利用缓存层
- 多阶段构建减小最终镜像大小
- 使用特定标签(如
-alpine
)而非latest
五、数据管理与持久化
5.1 数据卷(Volumes)
# 创建管理卷
docker volume create my_volume
# 使用数据卷
docker run -d -v my_volume:/data --name vol_container nginx
# 查看卷信息
docker volume inspect my_volume
5.2 绑定挂载(Bind Mounts)
# 挂载主机目录
docker run -d -v /host/path:/container/path nginx
# 只读挂载
docker run -d -v /host/path:/container/path:ro nginx
5.3 数据备份与恢复
# 备份卷数据
docker run --rm -v my_volume:/source -v $(pwd):/backup alpine \
tar cvf /backup/backup.tar /source
# 恢复数据到新卷
docker volume create new_volume
docker run --rm -v new_volume:/target -v $(pwd):/backup alpine \
tar xvf /backup/backup.tar -C /target
六、网络配置
6.1 网络模式
模式 | 描述 |
---|---|
bridge | 默认桥接网络(隔离) |
host | 共享主机网络栈 |
none | 无网络 |
overlay | 多主机容器网络(Swarm) |
6.2 自定义网络
# 创建网络
docker network create my_network
# 使用自定义网络
docker run -d --net=my_network --name container1 nginx
docker run -d --net=my_network --name container2 nginx
# 容器间通信
docker exec -it container1 ping container2
6.3 端口映射
# 随机主机端口
docker run -d -p 80 nginx
# 指定主机端口
docker run -d -p 8080:80 nginx
# 查看端口映射
docker port my_nginx
七、Docker Compose 编排
7.1 基本 compose 文件
version: '3.8'
services:
web:
image: nginx:1.21-alpine
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- mynet
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
volumes:
- db_data:/var/lib/postgresql/data
networks:
- mynet
volumes:
db_data:
networks:
mynet:
7.2 常用命令
# 启动服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 停止服务
docker-compose down
# 查看日志
docker-compose logs -f
# 重建服务
docker-compose up -d --build
7.3 生产环境配置
# docker-compose.prod.yml
version: '3.8'
services:
web:
deploy:
replicas: 3
resources:
limits:
cpus: '0.5'
memory: 512M
restart_policy:
condition: on-failure
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
八、安全最佳实践
8.1 容器安全原则
- 使用非root用户运行容器
RUN groupadd -r appuser && useradd -r -g appuser appuser USER appuser
- 定期更新基础镜像
- 限制容器资源
docker run -d --memory=512m --cpus=1.5 nginx
- 扫描镜像漏洞
docker scan nginx:1.21-alpine
8.2 安全配置
# 禁止特权模式
docker run --privileged=false ...
# 只读文件系统
docker run --read-only ...
# 限制内核能力
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx
九、CI/CD 集成
9.1 GitHub Actions 示例
name: Docker Build and Push
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: username/myapp:latest
9.2 多环境部署
# 使用不同compose文件
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
# 环境变量配置
services:
db:
environment:
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
十、监控与日志管理
10.1 监控工具
# cAdvisor
docker run -d \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
--name=cadvisor \
google/cadvisor:latest
# Prometheus + Grafana
docker-compose -f https://docs.docker.com/compose/monitoring.yml up -d
10.2 集中式日志
# ELK Stack集成
version: '3'
services:
web:
image: nginx
logging:
driver: "syslog"
options:
syslog-address: "tcp://logstash:5000"
tag: "nginx"
logstash:
image: docker.elastic.co/logstash/logstash:7.14.0
ports:
- "5000:5000"
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
总结 🎯
通过本文的系统学习,我们已经掌握了Docker的核心技能:
- 容器基础:镜像/容器/仓库的完整理解 📦
- 生产实践:从开发到部署的全流程 🏗️
- 编排管理:单机到多服务的扩展 🎼
- 安全运维:监控与加固的最佳实践 🔍
容器化黄金法则:
- 不可变基础设施:容器即临时,数据外持久化 💾
- 最小化镜像:只包含必要组件 🏗️
- 声明式配置:版本控制所有定义文件 📜
记住:容器化不是终点,而是云原生的起点! 现在就去Dockerize你的应用吧!🐳✨
PS:如果你在学习过程中遇到问题,别慌!欢迎在评论区留言,我会尽力帮你解决!😄