构建通用镜像包
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
评论区