Docker及Docker-Compose详细介绍及简单应用
1. Docker详细介绍
-
什么是Docker?
Docker就像一个“轻量级的虚拟机”,但它更高效、更快速。想象一下,您要搬家:传统虚拟机相当于租一整辆卡车(包括引擎和司机),而Docker只用一个标准化的集装箱(容器),里面打包了您的家具(应用程序和依赖),直接放在任何卡车上运行。这样,您的应用能在不同环境(如开发机、测试服务器、云平台)中无缝运行,无需担心兼容性问题。- 核心概念:
- 镜像(Image):容器的“蓝图”或模板,包含应用代码、运行环境(如操作系统、库)。例如,一个Python应用的镜像是基于官方Python镜像构建的。
- 容器(Container):镜像的运行实例。每个容器是隔离的沙箱,共享主机操作系统内核,但拥有独立文件系统和资源。启动容器就像从蓝图造出一个可运行的房子。
- Dockerfile:一个文本文件,定义如何构建镜像。它包含一系列指令(如
FROM、RUN、COPY),指导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.yml文件:YAML格式的配置文件,定义服务(容器)、网络、卷(存储)。它是Compose的核心。
-
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缓存)。遇到问题,欢迎进一步提问!
更多推荐



所有评论(0)