目 录CONTENT

文章目录

AI 开发通用 Docker 镜像包

解小风
2025-05-08 / 0 评论 / 1 点赞 / 14 阅读 / 15019 字

构建通用镜像包

1、构建镜像

# 0、环境需求
Docker_v20+
Docker-Compose_v2.0+

# 1、按需编辑 Dockerfile 文件
# 将 miniconda3_v20240529-Linux-x86_64.sh 文件放至 Faramita_AI_DEV_Build 文件夹内
# Dockerfile 示例内容如下:
######### Dockerfile #########
# Dockerfile
FROM nvidia/cuda:12.4.1-cudnn-devel-ubuntu22.04

# 配置环境变量
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 \
    TZ=Asia/Shanghai \
    DEBIAN_FRONTEND=noninteractive \
    PATH=/opt/conda/bin:$PATH

# 配置系统基础
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
    echo $TZ > /etc/timezone && \
    rm -rf /etc/apt/sources.list.d/* && \
    apt-get update --fix-missing

# 安装核心工具集
# 1. 基础运维工具
RUN apt-get install -y --no-install-recommends \
    ca-certificates \
    wget \
    curl \
    git \
    gnupg \
    apt-transport-https \
    software-properties-common \
    lsb-release \
    && apt-get clean

# 2. 开发编译工具链
# build-essential 包含 gcc/g++/make
RUN apt-get install -y --no-install-recommends \
    build-essential \
    cmake \
    ninja-build \
    pkg-config \
    zlib1g-dev \
    libssl-dev \
    libffi-dev \
    libsqlite3-dev \
    libbz2-dev \
    liblzma-dev \
    libreadline-dev \
    && apt-get clean

# 3. 系统调试工具
RUN apt-get install -y --no-install-recommends \
    htop \
    lsof \
    strace \
    ltrace \
    gdb \
    valgrind \
    sysstat \
    && apt-get clean

# 4. 网络工具
RUN apt-get install -y --no-install-recommends \
    net-tools \
    iputils-ping \
    traceroute \
    dnsutils \
    tcpdump \
    && apt-get clean

# 5. 文本/终端工具
RUN apt-get install -y --no-install-recommends \
    vim \
    tmux \
    tree \
    jq \
    rsync \
    zip \
    unzip \
    && apt-get clean

# 安装 FFmpeg 全家桶
RUN apt-get install -y --no-install-recommends \
    ffmpeg \
    libavcodec-dev \
    libavformat-dev \
    libswscale-dev \
    libavutil-dev \
    libpostproc-dev \
    libx264-dev \
    libx265-dev \
    && apt-get clean

# 安装 Miniconda
# 复制本地 Miniconda 安装脚本到镜像中
COPY ./miniconda3_v20240529-Linux-x86_64.sh /tmp/miniconda.sh
# 运行安装脚本
RUN /bin/bash /tmp/miniconda.sh -b -p /opt/conda && \
    rm /tmp/miniconda.sh && \
    /opt/conda/bin/conda clean -y --all
# 初始化(设置 .bashrc 文件,在 shell 启动时自动激活 conda 的基础环境)
# 解决非交互式 shell 的问题
RUN echo "source /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \
    echo "conda activate base" >> ~/.bashrc && \
    echo "source /opt/conda/etc/profile.d/conda.sh" >> /etc/profile.d/conda.sh

# 安装 Supervisor
RUN apt-get install -y --no-install-recommends \
    supervisor \
    && apt-get clean
# 初始化主配置文件
RUN echo_supervisord_conf > /etc/supervisor/supervisord.conf && \
    echo "\n[include]\nfiles = /etc/supervisor/conf.d/*.conf" >> /etc/supervisor/supervisord.conf
# 初始化子配置文件
RUN mkdir -p /etc/supervisor/conf.d && \
    echo "; [program:myitem]\n\
; directory=/path/to/my_item\n\
; command=/path/to/my_item/python --arg1 value1\n\
; stopsignal=TERM\n\
; autostart=true\n\
; autorestart=true\n\
; startsecs=5\n\
; user=root\n\
; redirect_stderr=true\n\
; stdout_logfile=/path/to/my_item.log\n\
; stdout_logfile_maxbytes=20MB\n\
; stdout_logfile_backups=50\n\
; stderr_logfile=/path/to/my_item_error.log\n\
; stderr_logfile_maxbytes=20MB\n\
; stderr_logfile_backups=50\n\
; environment=CUDA_VISIBLE_DEVICES='0'\n" > /etc/supervisor/conf.d/ai_dev.conf

# 最后统一清理
RUN apt-get autoremove -y && \
    apt-get clean

# 工作目录设置
WORKDIR /app

# 启动命令(Supervisor 随容器启动)
CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisor/supervisord.conf"]
##############################
# 2、按需编辑 docker-compose.yml 文件
# docker-compose.yml 示例内容如下:
######### docker-compose.yml #########
version: '3.8'
services:
  ai-dev:
    # 构建镜像
    build: .
    # 自行起一个镜像名
    image: faramita/ai-dev:x86-ubuntu2204-cuda12.4.1-cudnn-ffmpeg
    # 分配给容器的共享内存
    shm_size: 4g
    # 工作目录
    working_dir: /app
    # 开启 TTY(终端)
    tty: true
    # 保持标准输入(stdin)对容器开放
    stdin_open: true
##############################
# 3、构建镜像
docker-compose build --no-cache

2、验证镜像

# 启动交互式终端容器进行镜像验证
# 无 GPU 环境
docker run -it --rm --shm-size=4g faramita/ai-dev:x86-ubuntu2204-cuda12.4.1-cudnn-ffmpeg /bin/bash

# 有 GPU 环境(已正确安装配置 NVIDIA 驱动 和 NVIDIA Container Toolkit)
docker run -it --rm --gpus all --shm-size=4g faramita/ai-dev:x86-ubuntu2204-cuda12.4.1-cudnn-ffmpeg /bin/bash
# 验证各个工具(参考 Dockerfile 中安装的工具和软件)

# 验证 CUDA(需正确安装配置 NVIDIA 驱动 和 NVIDIA Container Toolkit)
nvcc --version

# 验证 FFmpeg
ffmpeg -version

# 验证 Conda
conda --version

# 验证 Tmux
tmux -V

# 验证 Supervisor
supervisorctl status
# 若出现以下报错为正常情况:
unix:///tmp/supervisor.sock no such file
# 因为 docker run ... /bin/bash 启动会覆盖 CMD 命令,导致 supervisor 不会随之启动
# 正常启动容器后,再进入容器验证 supervisor,不会存在此情况

3、导出镜像

# 保存通用镜像包到 tar 文件并传输到目标服务器
sudo docker save -o docker-image-faramita-ai-dev_x86-ubuntu2204-cuda12.4.1-cudnn-ffmpeg.tar faramita/ai-dev:x86-ubuntu2204-cuda12.4.1-cudnn-ffmpeg

使用通用镜像包

宿主机不需要安装 CUDA12.4,但需确保:

1、正确安装 NVIDIA 驱动并确保驱动版本支持 CUDA12.4

2、正确安装和配置 NVIDIA Container Toolkit

1、安装 NVIDIA Container Toolkit

在线安装

# 验证显卡驱动,如果驱动不存在需要先安装显卡驱动
nvidia-smi

# 配置包
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
 | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
 | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
 | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

# 更新包列表
sudo apt-get update

# 安装 NVIDIA Container Toolkit
sudo apt-get install -y nvidia-container-toolkit

# 验证是否安装成功
nvidia-ctk --version

# 重启 Docker 服务
sudo systemctl restart docker

离线安装

# 验证显卡驱动,如果驱动不存在需要先安装显卡驱动
nvidia-smi

# 前往 NVIDIA 的 GitHub 主页找到 Ubuntu 系统对应的 NVIDIA Container Toolkit 安装包
https://github.com/NVIDIA/libnvidia-container/tree/gh-pages/stable/deb/amd64
# 本文示例版本为 1.17.0,下载后的文件如下

# 基础库包,提供了最基本的功能,其他包都依赖于它
libnvidia-container1_1.17.0-1_amd64.deb
# 基础工具包,依赖于 libnvidia-container1
libnvidia-container-tools_1.17.0-1_amd64.deb
# 基础组件包,依赖于前面的包
nvidia-container-toolkit-base_1.17.0-1_amd64.deb
# 主要的工具包,依赖于以上所有包
nvidia-container-toolkit_1.17.0-1_amd64.deb
# 调试符号包,只在调试问题时使用
libnvidia-container1-dbg_1.17.0-1_amd64.deb
# 开发包,只在进行开发时使用
libnvidia-container-dev_1.17.0-1_amd64.deb
# 最后两个安装包(调试包和开发包)可以选择不下载和不安装
# 按顺序执行安装
sudo dpkg -i libnvidia-container1_1.17.0-1_amd64.deb
sudo dpkg -i libnvidia-container-tools_1.17.0-1_amd64.deb
sudo dpkg -i nvidia-container-toolkit-base_1.17.0-1_amd64.deb
sudo dpkg -i nvidia-container-toolkit_1.17.0-1_amd64.deb

# 验证是否安装成功
nvidia-ctk --version

# 重启 Docker 服务
sudo systemctl restart docker

2、导入镜像

# 导入镜像
sudo docker load --input docker-image-faramita-ai-dev_x86-ubuntu2204-cuda12.4.1-cudnn-ffmpeg.tar

# 验证镜像
docker images

3、运行镜像

# 0、环境需求
Docker_v20+
Docker-Compose_v2.0+

# 1、文件目录准备
mkdir -p ./Faramita_AI_DEV_Run/my_supervisor
mkdir -p ./Faramita_AI_DEV_Run/my_item
mkdir -p ./Faramita_AI_DEV_Run/my_cache
cd ./Faramita_AI_DEV_Run
# 2、按需编辑 docker-compose.yml 文件
# docker-compose.yml 示例内容如下:
######### docker-compose.yml #########
version: '3.8'
services:
  ai-dev:
    image: faramita/ai-dev:x86-ubuntu2204-cuda12.4.1-cudnn-ffmpeg
    container_name: AI-DEV-X86-CUDA1241
    restart: always
    privileged: true
    volumes:
      # 容器内 supervisor 配置文件夹 映射到 宿主机配置文件夹
      - ./my_supervisor:/etc/supervisor/conf.d
      # 容器内 /app 文件夹 映射到 宿主机项目文件夹
      - ./my_item:/app
      # 容器内 /root/.cache 缓存文件夹 映射到 宿主机缓存文件夹
      - ./my_cache:/root/.cache
    environment:
      # 指定了 NVIDIA GPU 驱动在容器中可以使用的功能
      #     compute:允许容器使用GPU进行计算操作
      #     utility:提供一些工具和库的支持,如 nvidia-smi
      - NVIDIA_DRIVER_CAPABILITIES=compute,utility
      # 控制物理设备可见性(指定可见的 GPU 设备)
      - NVIDIA_VISIBLE_DEVICES=0
      # 指定 CUDA 运行时可见设备
      - CUDA_VISIBLE_DEVICES=0
    # deploy.resources.reservations.devices 用于指定 GPU 相关配置
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              capabilities: [gpu]
    # 分配给容器的共享内存
    shm_size: 8g
    # 工作目录
    working_dir: /app
    # 开启 TTY(终端)
    tty: true
    # 保持标准输入(stdin)对容器开放
    stdin_open: true
##############################
# 3、一键启动
sudo docker-compose up -d

定制项目镜像包

同上,先确保宿主机:

1、正确安装 NVIDIA 驱动并确保驱动版本支持 CUDA12.4

2、正确安装和配置 NVIDIA Container Toolkit

1、导入通用镜像

# 导入镜像
sudo docker load --input docker-image-faramita-ai-dev_x86-ubuntu2204-cuda12.4.1-cudnn-ffmpeg.tar

# 验证镜像
docker images

2、运行通用镜像

# 0、环境需求
Docker_v20+
Docker-Compose_v2.0+

# 1、项目文件准备
# 将所有需要打包进镜像的文件,放入 my_files 文件夹
mkdir -p ./DIY_Run/my_files
cd ./DIY_Run
# 2、按需编辑 docker-compose.yml 文件
# docker-compose.yml 示例内容如下:
######### docker-compose.yml #########
version: '3.8'
services:
  ai-dev:
    image: faramita/ai-dev:x86-ubuntu2204-cuda12.4.1-cudnn-ffmpeg
    container_name: AI-DEV-X86-CUDA1241
    restart: always
    privileged: true
    volumes:
      # 容器内 /home 文件夹 映射到 宿主机文件夹
      - ./my_files:/home
    environment:
      # 指定了 NVIDIA GPU 驱动在容器中可以使用的功能
      #     compute:允许容器使用GPU进行计算操作
      #     utility:提供一些工具和库的支持,如 nvidia-smi
      - NVIDIA_DRIVER_CAPABILITIES=compute,utility
      # 控制物理设备可见性(指定可见的 GPU 设备)
      - NVIDIA_VISIBLE_DEVICES=0
      # 指定 CUDA 运行时可见设备
      - CUDA_VISIBLE_DEVICES=0
    # deploy.resources.reservations.devices 用于指定 GPU 相关配置
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              capabilities: [gpu]
    # 分配给容器的共享内存
    shm_size: 8g
    # 工作目录
    working_dir: /app
    # 开启 TTY(终端)
    tty: true
    # 保持标准输入(stdin)对容器开放
    stdin_open: true
##############################
# 3、一键启动通用镜像
sudo docker-compose up -d

3、生成定制镜像

# 1、进入通用镜像容器内部
# sudo docker exec -it {容器ID} /bin/bash
sudo docker exec -it 69248e8a38da /bin/bash

# 2、使用容器内部工具进行项目部署,如:
# conda/pip 下载/安装 环境依赖
# supervisor 启动/管理 项目
# 确保项目部署所需一切资源准备完毕

# 3、停止镜像运行
# sudo docker stop {容器ID}
sudo docker stop 69248e8a38da

# 4、提交容器更改以创建新镜像
# sudo docker commit {容器ID} {自定义镜像名:Tag}
sudo docker commit 69248e8a38da ai/voice-clone:v1.0-x86-cuda12.4.1

# 5、导出定制镜像包到 tar 文件并传输到目标服务器
sudo docker save -o docker-image-ai-voice-clone_v1.0-x86-cuda12.4.1.tar ai/voice-clone:v1.0-x86-cuda12.4.1

4、使用定制镜像

# 导入镜像
sudo docker load --input docker-image-ai-voice-clone_v1.0-x86-cuda12.4.1.tar

# 验证镜像
docker images
# 0、环境需求
Docker_v20+
Docker-Compose_v2.0+

# 1、按需准备项目相关目录文件夹
mkdir -p ./My_Item/my_supervisor
mkdir -p ./My_Item/my_item
mkdir -p ./My_Item/my_cache
cd ./My_Item
# 2、按需编辑 docker-compose.yml 文件
# docker-compose.yml 示例内容如下:
######### docker-compose.yml #########
version: '3.8'
services:
  my-item:
    image: ai/voice-clone:v1.0-x86-cuda12.4.1
    container_name: My-Item-X86-CUDA1241
    restart: always
    ports:
      # 按需映射端口
      - "12221:12221"
      - "12225:12225"
    privileged: true
    volumes:
      # 按需映射文件夹
      # 容器内 supervisor 配置文件夹 映射到 宿主机配置文件夹
      - ./my_supervisor:/etc/supervisor/conf.d
      # 容器内 /app 文件夹 映射到 宿主机项目文件夹
      - ./my_item:/app
      # 容器内 /root/.cache 缓存文件夹 映射到 宿主机缓存文件夹
      - ./my_cache:/root/.cache
    environment:
      # 指定了 NVIDIA GPU 驱动在容器中可以使用的功能
      #     compute:允许容器使用GPU进行计算操作
      #     utility:提供一些工具和库的支持,如 nvidia-smi
      - NVIDIA_DRIVER_CAPABILITIES=compute,utility
      # 控制物理设备可见性(指定可见的 GPU 设备)
      - NVIDIA_VISIBLE_DEVICES=0
      # 指定 CUDA 运行时可见设备
      - CUDA_VISIBLE_DEVICES=0
    # deploy.resources.reservations.devices 用于指定 GPU 相关配置
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              capabilities: [gpu]
    # 分配给容器的共享内存
    shm_size: 8g
    # 工作目录
    working_dir: /app
    # 开启 TTY(终端)
    tty: true
    # 保持标准输入(stdin)对容器开放
    stdin_open: true
##############################
# 3、一键启动定制镜像
sudo docker-compose up -d

1

评论区