1. Docker详细介绍

  • 什么是Docker?
    Docker就像一个“轻量级的虚拟机”,但它更高效、更快速。想象一下,您要搬家:传统虚拟机相当于租一整辆卡车(包括引擎和司机),而Docker只用一个标准化的集装箱(容器),里面打包了您的家具(应用程序和依赖),直接放在任何卡车上运行。这样,您的应用能在不同环境(如开发机、测试服务器、云平台)中无缝运行,无需担心兼容性问题。

    • 核心概念
      • 镜像(Image):容器的“蓝图”或模板,包含应用代码、运行环境(如操作系统、库)。例如,一个Python应用的镜像是基于官方Python镜像构建的。
      • 容器(Container):镜像的运行实例。每个容器是隔离的沙箱,共享主机操作系统内核,但拥有独立文件系统和资源。启动容器就像从蓝图造出一个可运行的房子。
      • Dockerfile:一个文本文件,定义如何构建镜像。它包含一系列指令(如FROMRUNCOPY),指导Docker一步步创建镜像。
        • FROM python:3.9-slim
          
          WORKDIR /app
          
          # 安装系统依赖
          RUN apt-get update && apt-get install -y \
              curl \
              && rm -rf /var/lib/apt/lists/*
          
          # 复制依赖文件并安装
          COPY requirements.txt .
          RUN pip install --no-cache-dir -r requirements.txt
          
          # 复制应用代码
          COPY . .
          
          EXPOSE 5003
          
          # 使用单进程模式启动
          CMD ["python", "-c", "import os; from app import app; app.run(host='0.0.0.0', port=5003, threaded=False, processes=1)"]
      • 仓库(Registry):存储和分享镜像的地方,如Docker Hub(公共仓库)或私有仓库。
  • Docker的工作原理
    Docker基于Linux内核的容器技术(如cgroups和namespaces),实现资源隔离:

    • 资源隔离:每个容器有自己的CPU、内存、网络和文件系统。例如,您可以为容器设置内存限制:容器最多使用1GB内存。
    • 高效性:容器共享主机内核,启动速度快(毫秒级),资源占用少(相比虚拟机节省90%资源)。
    • 可移植性:镜像打包所有依赖,在任何支持Docker的系统(Linux、Windows、Mac)上运行一致。
  • Docker的优点

    • 环境一致性:开发、测试、生产环境一致,避免“在我机器上能运行”的问题。
    • 快速部署:一键启动容器,支持自动化(CI/CD)。
    • 资源节省:多个容器共享主机资源,提高利用率。
    • 安全性:容器隔离,漏洞不影响主机(但需注意权限设置)。
  • 基本Docker命令
    安装Docker后(官网下载),常用命令:

    • docker build -t my-image .:基于当前目录的Dockerfile构建镜像,命名为my-image
    • docker run -d --name my-container my-image:运行容器(-d后台运行)。
    • docker ps:查看运行中的容器。
    • docker stop my-container:停止容器。
    • docker rm my-container:删除容器。
    • docker images:列出所有镜像。
2. Docker-Compose详细介绍
  • 什么是Docker-Compose?
    当您的应用需要多个容器(如Web服务器+数据库+缓存),手动管理每个容器很麻烦。Docker-Compose就像一个“管家”,用一个YAML文件定义所有服务,然后一键启动整个应用栈。例如,一个电商应用可能包含前端、后端和数据库容器,Compose让它们协同工作。

  • 核心概念

    • docker-compose.yml文件:YAML格式的配置文件,定义服务(容器)、网络、卷(存储)。它是Compose的核心。
      • version: '3.8'
        
        services:
          # 标注工具服务 - 单进程模式
          annotation-app:
            build:
              context: ./annotation-app
              dockerfile: Dockerfile
            ports:
              - "5003:5003"
            volumes:
              - ./annotation-app/logs:/app/logs
              - ./annotation-app/data:/app/data
            environment:
              - FLASK_ENV=production
              - FLASK_HOST=0.0.0.0
              - FLASK_PORT=5003
              - FLASK_DEBUG=false
              - PYTHONUNBUFFERED=1
              - OMP_NUM_THREADS=1
              - OPENBLAS_NUM_THREADS=1
              - MKL_NUM_THREADS=1
              - VECLIB_MAXIMUM_THREADS=1
              - NUMEXPR_NUM_THREADS=1
              - DB_HOST=
              - DB_PORT=
              - DB_USER=
              - DB_PASSWORD=
              - DB_NAME=store_v7_lite_bi_3
            restart: unless-stopped
            container_name: annotation-app
            deploy:
              resources:
                limits:
                  memory: 1g
                  cpus: '2.0'
            networks:
              - app-network
        
          # 截图采集服务
          capture-service:
            build:
              context: ./capture-service
              dockerfile: Dockerfile
            volumes:
              - ./capture-service/logs:/app/logs
              - ./capture-service/data:/app/data
            environment:
              - IOT_BASE_URL=https://store-hongqi.aibee.cn
              - DB_HOST=
              - DB_PORT=
              - DB_USER=
              - DB_PASSWORD=
              - DB_NAME=store_v7_lite_bi_3
              - PYTHONUNBUFFERED=1
            restart: unless-stopped
            container_name: capture-service
            networks:
              - app-network
        
        networks:
          app-network:
            driver: bridge

    • 服务(Service):一个容器实例的定义,包括镜像、环境变量、端口映射等。
    • 网络(Network):容器间通信的专用网络,隔离外部。
    • 卷(Volume):持久化存储数据,避免容器重启后数据丢失。
  • Docker-Compose的优点

    • 简化管理:一个命令启动/停止所有容器。
    • 环境配置统一:YAML文件版本控制,确保团队一致。
    • 支持复杂应用:定义依赖关系(如数据库先启动),自动处理网络连接。
    • 高效开发:本地测试多容器应用像运行单机程序。
  • 基本Docker-Compose命令
    安装Docker-Compose(通常随Docker安装),常用命令:

    • docker-compose up -d:根据docker-compose.yml启动所有服务(-d后台运行)。
    • docker-compose down:停止并移除所有容器、网络。
    • docker-compose ps:查看服务状态。
    • docker-compose logs:查看日志。
3. 简单应用示例:一个Python Web应用 + PostgreSQL数据库

我将通过一个实际例子展示Docker和Docker-Compose的简单应用。场景:一个基于Flask的Python web应用,连接到PostgreSQL数据库。目标:用Docker打包应用,用Compose一键运行整个栈。

步骤1: 准备项目文件
创建项目目录,例如my-app,包含以下文件:

  • app.py:Flask应用代码。
  • requirements.txt:Python依赖列表。
  • Dockerfile:构建应用镜像。
  • docker-compose.yml:定义所有服务。

步骤2: 编写应用代码

  • 创建app.py(简单Web服务,返回“Hello Docker!”):
    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def home():
        return "Hello Docker!"
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=5000)
    

  • 创建requirements.txt
    flask
    

步骤3: 创建Dockerfile
my-app目录下创建Dockerfile,构建Python应用镜像:

# 使用官方Python镜像作为基础
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 复制依赖文件并安装
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 暴露端口(Flask默认5000)
EXPOSE 5000

# 启动命令
CMD ["python", "app.py"]

步骤4: 创建docker-compose.yml
my-app目录下创建docker-compose.yml,定义两个服务(web应用和数据库):

version: '3.8'  # Compose文件版本

services:
  web:
    build: .  # 使用当前目录的Dockerfile构建镜像
    ports:
      - "5000:5000"  # 主机端口:容器端口映射
    depends_on:
      - db  # 依赖db服务先启动
    environment:
      - FLASK_ENV=development
  
  db:
    image: postgres:13  # 使用官方PostgreSQL镜像
    environment:
      - POSTGRES_USER=myuser
      - POSTGRES_PASSWORD=mypassword
      - POSTGRES_DB=mydb
    volumes:
      - db-data:/var/lib/postgresql/data  # 卷持久化数据

volumes:
  db-data:  # 定义卷,避免数据丢失

步骤5: 运行应用
在终端进入my-app目录,执行:

docker-compose up -d

  • 解释:Compose会根据docker-compose.yml启动web和db服务。web服务构建镜像并运行,db服务直接拉取PostgreSQL镜像。
  • 测试:打开浏览器访问http://localhost:5000,显示“Hello Docker!”。
  • 停止应用:运行docker-compose down,但卷保留数据(下次启动时恢复)。

关键点解析

  • 隔离性:web和db容器在独立网络中通信,外部无法直接访问db。
  • 持久化:卷db-data确保数据库数据不丢失(即使容器重启)。
  • 资源控制:您可以在Compose文件中添加资源限制,例如web服务内存限制为$512\text{MB}$,在YAML中添加:
    web:
      ...
      deploy:
        resources:
          limits:
            memory: 512M
    

4. 总结与最佳实践
  • Docker和Docker-Compose的好处:提高开发效率、确保环境一致性、简化部署。适合微服务、CI/CD流水线等场景。
  • 最佳实践
    • 保持镜像轻量:使用slim基础镜像,删除不必要的文件。
    • 安全设置:避免以root用户运行容器,限制权限。
    • 数据管理:使用卷或绑定挂载(bind mounts)持久化重要数据。
    • 监控:用docker stats查看资源使用,或集成Prometheus。
  • 学习资源:官方文档(docs.docker.com)和Docker Hub社区镜像。

通过这个简单示例,您已经实现了多容器应用的本地运行。Docker和Docker-Compose是现代DevOps的基石,推荐您动手实践(如扩展这个应用添加Redis缓存)。遇到问题,欢迎进一步提问!

更多推荐