什么是 Docker

  • 容器化技术的核心概念
    容器是一种轻量级的虚拟化技术,将应用及其依赖打包成标准化的单元,与主机共享操作系统内核
    示例:可以将一个Python Web应用及其依赖(如Flask、Redis)打包到一个容器中

  • Docker 与传统虚拟机的区别

    • 虚拟机需要完整的操作系统(Guest OS),而容器共享主机OS内核
    • 虚拟机启动慢(分钟级),容器启动快(秒级)
    • 虚拟机资源占用高,容器资源占用低
  • 核心组件

    • 镜像(Image):只读模板,包含创建容器所需的所有文件和配置
    • 容器(Container):镜像的运行实例,具有可写层
    • 仓库(Repository):存储和分发镜像的集中位置,如Docker Hub

安装与配置 Docker

  • 不同操作系统的安装方法

    • Windows:通过Docker Desktop安装(需要WSL 2)
    • macOS:下载Docker.dmg安装包
    • Linux(Ubuntu示例):
      sudo apt-get update
      sudo apt-get install docker-ce docker-ce-cli containerd.io
      

  • 验证安装是否成功

    docker --version  # 查看版本
    docker run hello-world  # 运行测试容器
    

  • 配置国内镜像加速
    修改/etc/docker/daemon.json(Linux示例):

    {
      "registry-mirrors": ["https://your-mirror.mirror.aliyuncs.com"]
    }
    

    然后重启服务:sudo systemctl restart docker

Docker 基础命令实战

镜像管理

  • 拉取镜像:docker pull nginx:latest(指定版本标签)
  • 查看本地镜像:docker images(显示REPOSITORY, TAG, IMAGE ID等)
  • 删除镜像:docker rmi nginx(先确保没有运行中的容器使用该镜像)

容器管理

  • 运行容器:
    docker run -d -p 8080:80 --name my_nginx nginx
    # -d: 后台运行
    # -p: 端口映射(主机端口:容器端口)
    

  • 查看容器:
    docker ps(运行中的容器)
    docker ps -a(所有容器)
  • 容器生命周期管理:
    docker stop/start/restart my_nginx
  • 进入容器终端:
    docker exec -it my_nginx bash(交互式终端)

自定义 Docker 镜像(Dockerfile)

  • 编写简单 Dockerfile(示例构建Python应用镜像):

    FROM python:3.9-slim
    WORKDIR /app
    COPY requirements.txt .
    RUN pip install -r requirements.txt
    COPY . .
    CMD ["python", "app.py"]
    

  • 构建镜像:
    docker build -t my-python-app .
    (注意最后的小点表示当前目录是构建上下文)

  • 运行验证:
    docker run -p 5000:5000 my-python-app

数据管理与网络配置

  • 数据卷挂载:
    docker run -v /host/data:/container/data mysql
    (即使容器删除,/host/data中的数据仍会保留)

  • 容器网络:

    • 默认bridge网络:容器获得独立IP,通过端口映射访问
    • host网络:容器直接使用主机网络栈
      示例:docker run --network=host nginx

实战案例

  • 部署Nginx Web服务:

    docker run -d -p 80:80 -v $(pwd)/html:/usr/share/nginx/html nginx
    

    (将主机当前目录下的html文件夹映射到容器)

  • 运行MySQL并持久化数据:

    docker run -d -p 3306:3306 \
      -v mysql_data:/var/lib/mysql \
      -e MYSQL_ROOT_PASSWORD=123456 \
      mysql:5.7
    

  • Docker Compose初步:
    编写docker-compose.yml定义多容器应用(如Web+DB)

常见问题与调试技巧

  • 查看日志:docker logs -f my_container(-f持续输出)
  • 清理资源:
    docker system prune(删除停止的容器、未使用的网络和悬空镜像)
    docker system prune -a(额外删除未被任何容器引用的镜像)
  • 常见问题解决:
    • 端口冲突:netstat -tulnp | grep 8080查找占用端口的进程
    • 权限问题:使用--privileged或调整Linux权限

进阶学习方向

示例配置:

version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
    depends_on:
      - redis
  redis:
    image: "redis:alpine"

Docker Swarm/Kubernetes集群管理

Docker Swarm

Docker原生的集群管理工具,适合中小规模部署:

Kubernetes

更强大的容器编排平台,适合大规模生产环境:

集群管理要点:

镜像优化技术

多阶段构建

# 构建阶段
FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .

# 最终阶段
FROM alpine:latest  
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]

减小镜像体积的方法

CI/CD中的Docker应用

GitLab CI集成示例:

stages:
  - build
  - test
  - deploy

build_image:
  stage: build
  script:
    - docker build -t myapp:$CI_COMMIT_SHA .
    - docker push myapp:$CI_COMMIT_SHA

test_image:
  stage: test
  script:
    - docker run myapp:$CI_COMMIT_SHA npm test

deploy_prod:
  stage: deploy
  script:
    - kubectl set image deployment/myapp myapp=myapp:$CI_COMMIT_SHA
  when: manual

CI/CD最佳实践:

安全最佳实践

  • Docker高级应用与最佳实践

    Docker Compose多容器编排

    Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。通过一个YAML文件(通常命名为docker-compose.yml)来配置应用程序的服务,然后使用单个命令即可创建并启动所有服务。

    典型应用场景:

  • 开发环境标准化配置
  • 微服务架构的本地测试
  • 包含数据库、缓存、消息队列等的复合应用部署
  • 使用docker swarm init初始化Swarm集群
  • 通过docker service create部署服务
  • 支持服务发现、负载均衡和滚动更新
  • 自动故障转移和节点管理
  • Pod作为最小部署单元
  • 通过Deployment管理应用生命周期
  • Service提供稳定的网络端点
  • Ingress处理外部访问路由
  • 节点角色管理(master/worker)
  • 资源配额和限制
  • 网络插件选择(Calico、Flannel等)
  • 存储卷管理
  • 监控和日志收集方案
  • 使用Alpine等轻量级基础镜像
  • 合并RUN指令减少镜像层
  • 及时清理不需要的中间文件
  • 使用.dockerignore排除非必要文件
  • 考虑使用Distroless镜像
  • 为每次提交构建唯一标签的镜像
  • 实现自动化测试流水线
  • 蓝绿部署或金丝雀发布策略
  • 镜像签名验证
  • 制品仓库管理(Nexus、Harbor等)
  • 非root用户运行容器

    FROM alpine
    RUN adduser -D myuser
    USER myuser
    

  • 镜像扫描

    • 使用Trivy、Clair等工具扫描漏洞
    • CI流程中加入扫描环节
    • 定期更新基础镜像
  • 其他安全措施

    • 限制容器资源使用
    • 配置只读文件系统
    • 最小化容器权限
    • 使用安全上下文(Kubernetes)
    • 网络隔离策略
    • 密钥管理(Vault或Kubernetes Secrets)
  • 运行时保护

    • 启用seccomp和AppArmor
    • 禁止特权模式运行
    • 监控异常行为

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐