Docker 实战:从容器化到编排部署 Docker 核心概念 镜像(Image) 只读模板,包含应用运行所需的一切。 容器(Container) 镜像的运行实例,隔离的运行环境。 仓库(Registry) 存储和分发镜像的服务(Docker Hub, 私有仓库)。 基础操作 镜像管理 容器管理 Dockerfile 最佳实践 多阶段构建 层缓存优化 安全最佳实践 Docker Compose 多容器编排 常用命令 网络与存储 网络模式 bridge:默认隔离网络 host:使用宿主机网络 overlay:跨主机通信(Swarm/K8s) none:无网络 持久化存储 性能优化 镜像瘦身 使用 alpine 基础镜像 多阶段构建 清理不必要的文件 合并 RUN 指令 资源限制 日志管理
只读模板,包含应用运行所需的一切。
镜像的运行实例,隔离的运行环境。
存储和分发镜像的服务(Docker Hub, 私有仓库)。
# 拉取镜像 docker pull nginx:latest # 查看本地镜像 docker images # 构建镜像 docker build -t myapp:1.0 . # 推送镜像 docker push myrepo/myapp:1.0
# 运行容器 docker run -d -p 8080:80 --name web nginx # 查看运行容器 docker ps # 查看容器日志 docker logs -f web # 进入容器 docker exec -it web bash # 停止容器 docker stop web # 删除容器 docker rm web
# 构建阶段 FROM maven:3.9-openjdk-21 AS builder WORKDIR /app COPY pom.xml . COPY src ./src RUN mvn clean package # 运行阶段 FROM openjdk:21-slim WORKDIR /app COPY --from=builder /app/target/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]
# 先复制依赖,利用缓存 COPY pom.xml . RUN mvn dependency:go-offline # 再复制源码 COPY src ./src RUN mvn clean package
# 使用非 root 用户 FROM openjdk:21-slim RUN groupadd -r appuser && useradd -r -g appuser appuser USER appuser # 最小化镜像 FROM alpine:3.19 # 扫描漏洞 RUN trivy image --severity HIGH,CRITICAL myapp:1.0
version: '3.8' services: web: image: nginx:alpine ports: - "80:80" volumes: - ./html:/usr/share/nginx/html depends_on: - api api: build: ./api ports: - "8080:8080" environment: - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/mydb depends_on: - db db: image: postgres:16-alpine volumes: - db-data:/var/lib/postgresql/data environment: - POSTGRES_DB=mydb - POSTGRES_PASSWORD=secret volumes: db-data:
# 启动所有服务 docker-compose up -d # 查看服务状态 docker-compose ps # 查看服务日志 docker-compose logs -f api # 停止所有服务 docker-compose down # 重启服务 docker-compose restart api
# 创建自定义网络 docker network create myapp-net # 连接容器到网络 docker network connect myapp-net web
# 数据卷 docker volume create mydata docker run -v mydata:/data nginx # 绑定挂载 docker run -v /host/path:/container/path nginx
# 限制内存和 CPU docker run -m 512m --cpus="1.5" nginx
# docker-compose.yaml services: api: logging: driver: "json-file" options: max-size: "10m" max-file: "3"
# 使用 Trivy 扫描漏洞 trivy image myapp:1.0 # 使用 Docker Scout docker scout quickview myapp:1.0 docker scout cves myapp:1.0
# 只读根文件系统 docker run --read-only nginx # 丢弃特权 docker run --security-opt=no-new-privileges nginx # 用户命名空间隔离 docker run --userns-remap=default nginx
apiVersion: v1 kind: Pod metadata: name: web-pod spec: containers: - name: nginx image: nginx:1.25 ports: - containerPort: 80 resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m"
apiVersion: apps/v1 kind: Deployment metadata: name: web-deployment spec: replicas: 3 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: nginx image: nginx:1.25 ports: - containerPort: 80
apiVersion: v1 kind: Service metadata: name: web-service spec: selector: app: web ports: - port: 80 targetPort: 80 type: LoadBalancer
Docker 简化了应用部署,提高了开发效率。掌握 Docker 是现代云原生开发的基础,建议从简单应用开始实践,逐步深入 Kubernetes 编排。