Docker 基础概念

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 或 Windows 机器上。

国内环境配置

  1. 镜像加速

    • 配置国内镜像源加速 Docker Hub 访问:
      {
        "registry-mirrors": [
          "https://mirror.ccs.tencentyun.com",
          "https://registry.docker-cn.com",
          "https://docker.mirrors.ustc.edu.cn"
        ]
      }
      
    • 文件位置:
      • Linux: /etc/docker/daemon.json
      • Windows: %programdata%\docker\config\daemon.json
  2. 常用国内镜像仓库

    • 阿里云容器镜像服务
    • 腾讯云镜像仓库
    • 华为云容器镜像服务

核心概念

  1. 镜像(Image)

    • Docker 镜像是一个只读的模板
    • 包含了运行应用程序所需的所有文件和配置
    • 可以通过 Dockerfile 构建
  2. 容器(Container)

    • 镜像的运行实例
    • 可以被启动、停止、删除
    • 每个容器都是相互隔离的
  3. Dockerfile

    • 用于构建镜像的脚本文件
    • 包含了构建镜像所需的所有命令
    • 示例:
      FROM ubuntu:20.04
      RUN apt-get update && apt-get install -y nginx
      EXPOSE 80
      CMD ["nginx", "-g", "daemon off;"]
      

常用命令

# 构建镜像
docker build -t myapp:1.0 .

# 运行容器
docker run -d -p 80:80 myapp:1.0

# 查看运行中的容器
docker ps

# 停止容器
docker stop <container_id>

Docker Compose

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 docker-compose.yml 文件,可以配置应用程序的服务、网络和卷。

docker-compose.yml 示例

version: '3'
services:
  web:
    build: .
    ports:
      - "8000:80"
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example

国内最佳实践

  1. 网络优化

    • 使用 --network host 模式提升网络性能
    • 在跨云服务商部署时注意网络延迟
    • 配置合适的 DNS 服务器
  2. 镜像管理

    • 搭建私有镜像仓库,推荐使用 Harbor
    • 使用国内云服务商提供的镜像仓库
    • 定期清理未使用的镜像,避免占用存储空间
  3. 依赖管理

    • 将常用的基础镜像推送到私有仓库
    • 在 Dockerfile 中使用国内软件源:
      # Ubuntu 示例
      RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
      
      # CentOS 示例
      RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* && \
          sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://mirrors.aliyun.com|g' /etc/yum.repos.d/CentOS-*
      
  4. 构建优化

    • 使用多阶段构建减小镜像体积
    • 合理使用缓存层,加快构建速度
    • 使用 BuildKit 提升构建性能:
      export DOCKER_BUILDKIT=1
      
  5. 监控和日志

    • 推荐使用阿里云日志服务或腾讯云日志服务
    • 配置容器日志轮转,避免日志占用过多空间:
      {
        "log-driver": "json-file",
        "log-opts": {
          "max-size": "100m",
          "max-file": "3"
        }
      }
      
  6. 安全实践

    • 使用国内漏洞扫描服务
    • 定期更新基础镜像,修复安全漏洞
    • 使用非 root 用户运行应用
    • 合理配置容器资源限制

网络和代理配置

构建时的代理设置

在Windows环境下使用Docker时,如果需要在容器构建过程中使用代理,有以下几点需要注意:

  1. 构建阶段的代理配置

    • 构建阶段(docker build)和运行阶段(docker run)的网络配置是分开的
    • 构建时无法直接使用host网络模式
  2. 正确的代理配置方法

    # 使用build-arg传递代理设置
    docker compose build \
      --build-arg HTTP_PROXY=http://host.docker.internal:7890 \
      --build-arg HTTPS_PROXY=http://host.docker.internal:7890
    

基础镜像选择

使用Alpine Linux替代Debian基础镜像,可以大幅减少镜像大小和网络依赖:

# 使用Alpine替代Debian
FROM python:3.11-alpine

# 设置环境变量
ENV PYTHONUNBUFFERED=1
ENV PYTHONPATH=/app

# 设置 pip 镜像源
ENV PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple
ENV PIP_TRUSTED_HOST=pypi.tuna.tsinghua.edu.cn

# 安装系统依赖
RUN apk add --no-cache gcc musl-dev python3-dev

网络模式配置

在docker-compose.yml中可以配置不同的网络模式:

# 构建时使用host网络
build:
  context: .
  dockerfile: Dockerfile.web
  network: host

# 运行时使用host网络
network_mode: host

常见问题解决

  1. 代理连接问题

    • 如果遇到Could not connect to 127.0.0.1:7890错误,通常是因为容器在尝试直接访问本地代理服务器
    • 解决方案是使用host.docker.internal替代127.0.0.1
  2. 网络访问优化

    • 使用--network=host参数可以让容器使用宿主机网络
    • 如果使用代理,需要确保代理服务器允许Docker容器访问
    • 可以使用--add-host=host.docker.internal:host-gateway参数使容器能够访问宿主机

常见问题解决

  1. 拉取镜像慢

    • 检查镜像加速器配置
    • 考虑使用私有镜像仓库
    • 在构建时使用 --pull=false 避免重复拉取
  2. 构建失败

    • 检查网络连接
    • 确认软件源可用性
    • 使用 --network=host 提升网络性能
  3. 资源占用

    • 定期清理未使用的容器和镜像
    • 配置日志轮转
    • 合理设置容器资源限制

总结

在中国大陆环境下使用 Docker,需要特别注意网络访问、镜像加速和依赖管理等问题。通过合理的配置和最佳实践,可以显著提升 Docker 的使用体验和效率。重点是要充分利用国内的基础设施和服务,如镜像加速器、私有仓库和云服务等。