Docker 基本概念
核心概念
- 镜像 (Image): 只读的模板,包含运行应用所需的所有内容
- 容器 (Container): 镜像的运行实例,可以启动、停止、删除
- 仓库 (Registry): 存储和分发镜像的服务(如 Docker Hub)
- Dockerfile: 用于构建 Docker 镜像的文本文件
Docker 架构
客户端 (Client) ←→ 守护进程 (Daemon) ←→ 镜像/容器
安装 Docker
Ubuntu/Debian
# 更新包索引
sudo apt update
# 安装 Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# 添加用户到 docker 组
sudo usermod -aG docker $USER
# 重启或重新登录
newgrp docker
# 验证安装
docker --version
docker run hello-world
CentOS/RHEL
# 安装 Docker
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
# 启动 Docker
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
docker --version
docker run hello-world
macOS
# 使用 Homebrew
brew install --cask docker
# 或下载 Docker Desktop for Mac
# https://www.docker.com/products/docker-desktop
镜像操作
搜索和下载镜像
# 搜索镜像
docker search nginx
docker search python
# 下载镜像
docker pull nginx:latest
docker pull python:3.9
# 查看本地镜像
docker images
docker image ls
# 删除镜像
docker rmi nginx
docker image rm python:3.9
构建镜像
# 构建镜像
docker build -t myapp:1.0 .
# 构建时指定 Dockerfile
docker build -f Dockerfile.prod -t myapp:prod .
# 查看镜像详情
docker inspect nginx
# 导出/导入镜像
docker save -o nginx.tar nginx:latest
docker load -i nginx.tar
容器操作
运行容器
# 基本运行
docker run nginx
# 后台运行
docker run -d nginx
# 指定端口映射
docker run -p 8080:80 nginx
# 指定名称
docker run --name mynginx nginx
# 指定环境变量
docker run -e ENV=production nginx
# 挂载卷
docker run -v /host/path:/container/path nginx
# 交互式运行
docker run -it ubuntu bash
docker run -it --rm alpine sh
管理容器
# 查看运行中的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
# 查看容器日志
docker logs mynginx
docker logs -f mynginx
# 查看容器详细信息
docker inspect mynginx
# 进入运行中的容器
docker exec -it mynginx bash
# 停止容器
docker stop mynginx
# 启动容器
docker start mynginx
# 重启容器
docker restart mynginx
# 删除容器
docker rm mynginx
# 强制删除运行中的容器
docker rm -f mynginx
容器资源管理
# 限制内存
docker run -m 512m nginx
# 限制 CPU
docker run --cpus=2 nginx
# 查看容器资源使用
docker stats
# 查看容器进程
docker top mynginx
Dockerfile 编写
基础 Dockerfile
# 基础镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 复制依赖文件
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 设置环境变量
ENV PYTHONUNBUFFERED=1
# 暴露端口
EXPOSE 8000
# 启动命令
CMD ["python", "app.py"]
常用指令
# FROM: 指定基础镜像
FROM ubuntu:20.04
# WORKDIR: 设置工作目录
WORKDIR /app
# COPY: 复制文件到容器
COPY . /app
COPY --from=builder /app/dist /app
# ADD: 复制文件(支持 URL 和解压)
ADD https://example.com/file.tar.gz /app/
# RUN: 执行命令
RUN apt-get update && apt-get install -y python3
RUN pip install -r requirements.txt
# CMD: 容器启动时执行的命令
CMD ["python", "app.py"]
CMD python app.py
# ENTRYPOINT: 容器启动时执行的命令(可被 CMD 覆盖)
ENTRYPOINT ["python"]
CMD ["app.py"]
# ENV: 设置环境变量
ENV APP_ENV=production
ENV PORT=8000
# ARG: 构建时的变量
ARG VERSION=1.0
ENV VERSION=$ARG
# EXPOSE: 暴露端口
EXPOSE 8000
# VOLUME: 声明挂载点
VOLUME /data
多阶段构建
# 构建阶段
FROM node:16 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 运行阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Docker Compose
基础使用
# docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "8000:8000"
volumes:
- .:/app
environment:
- DEBUG=true
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: password
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
常用命令
# 启动所有服务
docker-compose up
# 后台启动
docker-compose up -d
# 停止所有服务
docker-compose down
# 查看日志
docker-compose logs
# 查看特定服务的日志
docker-compose logs -f web
# 重启服务
docker-compose restart web
# 构建服务
docker-compose build
# 构建并启动
docker-compose up -d --build
# 进入容器
docker-compose exec web bash
# 执行命令
docker-compose exec web python manage.py migrate
网络管理
查看和管理网络
# 查看网络
docker network ls
# 创建网络
docker network create mynetwork
# 连接容器到网络
docker network connect mynetwork mycontainer
# 断开容器连接
docker network disconnect mynetwork mycontainer
# 删除网络
docker network rm mynetwork
创建自定义网络
# 创建桥接网络
docker network create --driver bridge mynetwork
# 创建 overlay 网络(用于 Swarm)
docker network create --driver overlay mynetwork
# 指定子网
docker network create --subnet 192.168.0.0/16 mynetwork
实用示例
Python Web 应用
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]
Node.js 应用
FROM node:16-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
Nginx 反向代理
FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
数据管理
数据卷
# 创建数据卷
docker volume create mydata
# 查看数据卷
docker volume ls
# 查看数据卷详情
docker volume inspect mydata
# 删除数据卷
docker volume rm mydata
# 删除未使用的数据卷
docker volume prune
绑定挂载
# 挂载主机目录
docker run -v /host/path:/container/path nginx
# 只读挂载
docker run -v /host/path:/container/path:ro nginx
# 挂载数据卷
docker run -v mydata:/data nginx
最佳实践
1. 镜像优化
# 使用多阶段构建减小镜像大小
FROM node:16 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:16-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm ci --production
EXPOSE 3000
CMD ["npm", "start"]
2. 缓存优化
# 先复制依赖文件,再复制代码
FROM python:3.9
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
3. 安全实践
# 使用非 root 用户
FROM python:3.9
RUN useradd -m myuser
USER myuser
# 使用最小的基础镜像
FROM alpine:3.14
# 定期更新基础镜像
docker pull python:3.9
故障排查
常见问题
# 查看容器日志
docker logs <container_id>
# 查看容器详细信息
docker inspect <container_id>
# 进入容器调试
docker exec -it <container_id> sh
# 查看容器资源使用
docker stats <container_id>
# 重新构建镜像
docker build --no-cache -t myapp .
清理系统
# 清理停止的容器
docker container prune
# 清理未使用的镜像
docker image prune
# 清理未使用的网络
docker network prune
# 清理所有未使用的资源
docker system prune -a