浅试docker:为 AI 项目构建高可维护的开发环境
我的需求是一个带cuda驱动的python容器,redis容器、psql容器、minio容器,因此,我指定docker-compose和dockerfile,他们之间的区别如下表:
| 方面 | Dockerfile | Docker Compose | 
| 核心作用 | 定义单个镜像的构建过程,描述从基础镜像开始,安装软件、拷贝文件、配置环境等步骤,生成自定义镜像。 | 定义多个容器的编排和运行,指定哪些镜像或 Dockerfile 要启动,容器之间如何连接、挂载卷、端口映射等。 | 
| 工作方式 | 通过 docker build 从 Dockerfile 构建镜像。 | 通过 docker-compose up 根据配置启动一个或多个容器。 | 
| 是否拉取镜像 | 可以基于已有镜像(FROM xxx),也可以从头开始构建。 | 可以使用已有镜像(image: xxx)或基于 Dockerfile 构建镜像(build: xxx)。 | 
| 功能范围 | 只负责镜像构建(静态),镜像里包含运行环境和文件。 | 负责多容器应用的启动与管理(动态),包括网络、依赖关系、环境变量等。 | 
| 示例 | 写一个 Python 镜像,安装依赖,拷贝代码。 | 启动数据库、缓存、Python 服务容器,并让它们协同工作。 | 
编写Docker-compose:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 
 | version: '3.8'
 services:
 app:
 build: .
 runtime: nvidia
 container_name: labsecurity_app
 depends_on:
 - redis
 - postgres
 - minio
 volumes:
 - ./app:/app
 working_dir: /app
 ports:
 - "8888:8888"
 command: ["tail", "-f", "/dev/null"]
 
 redis:
 image: redis:7
 container_name: labsecurity_redis
 ports:
 - "6379:6379"
 restart: always
 
 minio:
 image: minio/minio
 container_name: labsecurity_minio
 ports:
 - "9000:9000"
 - "9001:9001"
 environment:
 MINIO_ROOT_USER: minioadmin
 MINIO_ROOT_PASSWORD: minioadmin
 command: server /data --console-address ":9001"
 volumes:
 - minio_data:/data
 restart: always
 
 postgres:
 image: postgres:17
 container_name: labsecurity_postgres
 environment:
 POSTGRES_DB: labdb
 POSTGRES_USER: labuser
 POSTGRES_PASSWORD: labpass
 ports:
 - "5432:5432"
 volumes:
 - pgdata:/var/lib/postgresql/data
 restart: always
 
 volumes:
 pgdata:
 minio_data:
 
 | 
编写Dockerfile:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | FROM nvidia/cuda:12.8.0-cudnn-runtime-ubuntu22.04
 RUN apt-get update && apt-get install -y python3 python3-pip
 
 WORKDIR /app
 
 COPY requirements.txt .
 
 RUN pip install torch==2.6.0 torchvision==0.21.0 torchaudio==2.6.0
 RUN pip install
 
 COPY ./app /app
 
 CMD ["python3", "main.py"]
 
 | 
例如,在python中通过minio:9000,在本机中可以通过http://localhost:9001/访问。
 docker快速构建
- 下载docker desktop,对于分盘的windows电脑,建议迁移一下docker位置
- 换源,我这里修改配置文件为:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | {"builder": {
 "gc": {
 "defaultKeepStorage": "20GB",
 "enabled": true
 }
 },
 "experimental": false,
 "registry-mirrors": [
 "https://docker.xuanyuan.me"
 ]
 }
 
 | 
- 
构建镜像:docker compose build
 
- 
启动容器服务:docker compose up -d没有下载过dockert-compose中的容器的会先下载
 
- 
查看服务状态:docker ps-a
  
 
- 
进入python容器:docker exec -it labsecurity_app bash
 
- 
测试一下cuda环境是否可用,运行脚本: 
| 12
 3
 
 | import torchprint(torch.cuda.is_available())
 print(torch.cuda.get_device_name(0))
 
 | 
- 结束所有服务: docker-compose stop开始所有服务:docker-compose start
- 我在docker-compose里面挂载了:
容器能看到本机的 ./app 目录,点击vscode左下方的><,选择Attach to Running Container,进入python容器,就可以愉快的开发了