手動創建Docker鏡像
Docker 鏡像是通過 Dockerfile 文件來構建的。該文件沒有任何擴展名,文件名固定為 Dockerfile。
從本質上來説,Dockerfile 可以看作是一份用於自動化構建鏡像的腳本文件。我們在日常使用 Linux 系統時,在終端中執行的各種安裝、配置命令(例如安裝軟件、修改環境變量等),都可以按照一定的語法規則寫入到 Dockerfile 中。
不過,這些普通的 Shell 命令需要配合 Docker 提供的特定指令(如 RUN、COPY、ENV 等)一起使用,Docker 才能夠正確解析並執行這些步驟。構建鏡像的過程,本質上就是按照 Dockerfile 中定義的指令,從上到下一步步執行,最終生成一個可用的鏡像。
通過這種方式,我們可以將環境配置過程標準化、自動化,從而實現環境的一致性與可復現性。
下面列出了一些常用的 Dockerfile 指令及其作用:
DockerFile常用命令
| 指令 | 説明 | 示例 |
|---|---|---|
| FROM | 指定基礎鏡像,是 Dockerfile 的起點 | FROM ubuntu:22.04 |
| LABEL | 添加元數據(如作者、版本等) | LABEL maintainer="you@example.com" |
| ENV | 設置環境變量 | ENV PORT=8080 |
| ARG | 構建參數,只在構建期間可用 | ARG VERSION=1.0 |
| RUN | 構建鏡像時運行命令 | RUN apt-get update && apt-get install -y curl |
| COPY | 複製文件到鏡像中 | COPY . /app |
| ADD | 類似 COPY,額外支持解壓 .tar 文件或遠程 URL(不推薦用於 URL) | ADD archive.tar.gz /data/ |
| WORKDIR | 設置工作目錄 | WORKDIR /opt |
| CMD | 設置容器啓動時默認命令(可被 docker run 覆蓋) | CMD "node", "index.js" |
| ENTRYPOINT | 設置容器啓動時固定命令(通常用於 CLI 工具等) | ENTRYPOINT "python3" |
| EXPOSE | 聲明鏡像內服務監聽的端口(不會自動映射) | EXPOSE 80 |
| VOLUME | 聲明數據卷掛載點 | VOLUME "/data" |
| USER | 設置後續命令執行的用户 | USER appuser |
| ONBUILD | 當鏡像作為其他鏡像基礎鏡像時觸發的構建指令 | ONBUILD COPY . /src |
| SHELL | 更改默認 shell,比如將 sh -c 改為 bash -c | SHELL "/bin/bash", "-c" |
| HEALTHCHECK | 定義容器運行時的健康檢查命令 | HEALTHCHECK CMD curl --fail http://localhost:8080 |
| STOPSIGNAL | 容器停止時發送的信號 | STOPSIGNAL SIGKILL |
自己創建容器
手動創建
首先創建一個文件夾來存放你的Dockerfile
比如我在~/UserFolder/MySource/下創建了一個MyDocker文件夾.
創建好後,在個文件夾下打開vscode.
cd ~/UserFolder/MySource/MyDocker
code .
在VScode插件中安裝Dev Containers,Container Tools這倆插件.

- 插件1:微軟Docker工具

docker擴展插件已經進化為container tools了,請安裝container tools。

- 插件2:微軟Docker遠程開發工具
下面這是遠程開發的插件。

接下來創建Dockerfile文件:

我們創建一個最簡單的X86架構的鏡像,這個鏡像的內容是:
- 基於Ubuntu24.04系統的鏡像
- 自帶CUDA和CuDNN
- 默認Shell環境為bash
- 換源為國內鏡像源
- Shell添加上豐富的顏色
# 基于NVIDIA官方CUDA 12.6和CuDNN基础镜像
FROM nvidia/cuda:12.6.0-cudnn-devel-ubuntu24.04
# 设置环境变量以防止交互安装
ENV DEBIAN_FRONTEND=noninteractive
# 强制使用 Bash 作为默认 Shell
SHELL ["/bin/bash", "-c"]
# 先更新包列表并安装CA证书
RUN apt-get update && apt-get install -y ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# 替换为清华大学的DEB822格式镜像源
RUN sed -i 's|http://archive.ubuntu.com/ubuntu/|https://mirrors.tuna.tsinghua.edu.cn/ubuntu/|g' /etc/apt/sources.list.d/ubuntu.sources
# 配置终端颜色和提示符
RUN sed -i 's/#force_color_prompt=yes/force_color_prompt=yes/g' /root/.bashrc && \
# 自定义PS1(带颜色的提示符)
echo 'export PS1="\[\033[1;36m\]\u@\h\[\033[00m\]:\[\033[1;34m\]\w\[\033[00m\]\$ "' >> /root/.bashrc && \
# 给ls、grep等命令添加别名
echo "alias ls='ls --color=auto'" >> /root/.bashrc && \
echo "alias grep='grep --color=auto'" >> /root/.bashrc && \
echo "alias ll='ls -alFh --color=auto'" >> /root/.bashrc && \
# 清理临时文件
rm -rf /tmp/LS_COLORS

在x86電腦上編譯x86的鏡像(一定要有科學的網絡環境,不然拉取不了英偉達的鏡像):
命令格式為docker build -t 镜像名称 .
比如:
docker build -t ubuntu24_cuda126_cudnn:latest .

然後使用docker images命令查看編譯好的鏡像.

運行此鏡像
使用run命令的參數非常重要裏的run命令來運行創建好的鏡像.
應該把--name修改為你要創建的容器的名字,比如ubuntu24cuda126,然後最底下那行應該寫你剛才創建的鏡像的名字,比如ubuntu24_cuda126_cudnn:latest.
對應本教程的命令應該為:
sudo docker run --name=ubuntu24cuda126 \
--gpus all \
-e NVIDIA_DRIVER_CAPABILITIES=all \
-e DISPLAY=$DISPLAY \
-dit \
--privileged \
--net=host \
--group-add audio \
--group-add video \
--group-add dialout \
-e XAUTHORITY=$HOME/.Xauthority \
-e WAYLAND_DISPLAY=$WAYLAND_DISPLAY \
-e XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR \
-e QT_QPA_PLATFORM=xcb \
-v /tmp/.X11-unix:/tmp/.X11-unix:rw \
-v /dev/dri:/dev/dri \
-v $HOME/.Xauthority:$HOME/.Xauthority:ro \
-v /run/user/$(id -u)/wayland-0:/run/user/$(id -u)/wayland-0 \
-v /run/user/$(id -u):/run/user/$(id -u) \
-v $HOME:$HOME \
-w $HOME \
ubuntu24_cuda126_cudnn:latest
出現下列這一行,代表成功了.

可以在VScode的插件裏看到容器已經成功運行.

打開容器裏的Ubuntu24系統的終端
命令格式為docker exec -it 容器名称 bash
比如:
docker exec -it ubuntu24cuda126 bash
如下圖你已經進入了容器裏的Ubuntu24系統的終端了.

接下來可以安裝一個neofetch測試一下.
注意,你這裏已經是在root的身份下運行Ubuntu24系統的終端了,所以不需要每條命令前加sudo了,比如sudo apt update可以直接用apt update代替.
apt update
apt install neofetch
neofetch

然後可以順便測試下英偉達驅動和CUDA以及CuDNN的安裝情況:
nvidia-smi
nvcc -V
cat /usr/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
如下圖可知,容器中的Ubuntu24共享了宿主的英偉達驅動,版本為595.80. 自帶CUDA12.6與CuDNN9.3.0

將鏡像推送至Docker Hub
將 Docker 鏡像推送到 Docker Hub 的步驟如下:
- 創建 Docker Hub 賬户
如果你還沒有 Docker Hub 賬户,請前往 Docker Hub 註冊一個免費賬户。
- 登錄 Docker Hub
在終端中使用以下命令登錄到你的 Docker Hub 賬户:
docker login
輸入你的 Docker Hub 用户名和密碼進行驗證。
- 為你的鏡像打標籤
Docker Hub 使用 <用户名>/<镜像名>:<标签> 的格式來標識鏡像。你需要為你的鏡像打上標籤,以便能夠推送到 Docker Hub。使用以下命令:
docker tag 镜像名:标签 <你的用户名>/新镜像名:标签
例如,如果你的 Docker Hub 用户名是 tungchiahui,你應該執行:
docker tag ubuntu24_cuda126_cudnn:latest tungchiahui/ubuntu24_cuda126_cudnn:latest
- 推送鏡像到 Docker Hub
使用以下命令將鏡像推送到 Docker Hub:
docker push <你的用户名>/镜像名:标签
例如:
docker push tungchiahui/ubuntu24_cuda126_cudnn:latest
- 驗證推送成功
你可以通過訪問 Docker Hub 的個人頁面來驗證你的鏡像是否已成功推送。
注意事項
- 確保你的鏡像大小在 Docker Hub 的限制範圍內(一般為 10GB)。
- 如果你打算將鏡像公開,可以設置為公共倉庫;如果希望只有你自己可以訪問,可以設置為私有倉庫。


手動創建(跨平台多架構構建)(高階的,暫時不用學)
如果您想在 x86/x64 電腦上即為本機x86設備構建鏡像,又想為樹莓派、Jetson等ARM64 設備構建 Docker 鏡像 ,需要使用 Docker 的跨平台構建功能 。以下是完整解決方案:
啓用 Docker 跨平台構建
在 x86 主機上模擬 ARM64 環境需要以下工具:
- 啓用 buildx(只需執行一次)
docker buildx create --name multiarch_builder --use
這會創建並啓用一個支持多架構構建的 builder,電腦重啓後也依然存在,所以只用運行一次。
- 安裝 QEMU 支持(一般新版 Docker Desktop 已自帶,但是Linux必須要安裝) 如果你用的是服務器或Linux發行版,確保有 qemu 模擬器:
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
電腦重啓後,就會消失,所以需要你每次電腦重啓後,在buildx命令前,運行一次該命令即可。
- 修改dockerfile為多架構版本
# 支持多架构,使用变量指定架构
ARG TARGETARCH
# 基于NVIDIA官方CUDA 12.6和CuDNN基础镜像
FROM --platform=linux/${TARGETARCH} nvidia/cuda:12.6.0-cudnn-devel-ubuntu24.04
# 设置环境变量以防止交互安装
ENV DEBIAN_FRONTEND=noninteractive
# 强制使用 Bash 作为默认 Shell
SHELL ["/bin/bash", "-c"]
# 先更新包列表并安装CA证书
RUN apt-get update && apt-get install -y ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# 替换为清华大学的DEB822格式镜像源
RUN if [ "$(dpkg --print-architecture)" = "amd64" ]; then \
sed -i 's|http://archive.ubuntu.com/ubuntu/|https://mirrors.tuna.tsinghua.edu.cn/ubuntu/|g' /etc/apt/sources.list.d/ubuntu.sources; \
elif [ "$(dpkg --print-architecture)" = "arm64" ]; then \
sed -i 's|http://ports.ubuntu.com/ubuntu-ports/|https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/|g' /etc/apt/sources.list.d/ubuntu.sources; \
fi
# 配置终端颜色和提示符
RUN sed -i 's/#force_color_prompt=yes/force_color_prompt=yes/g' /root/.bashrc && \
# 自定义PS1(带颜色的提示符)
echo 'export PS1="\[\033[1;36m\]\u@\h\[\033[00m\]:\[\033[1;34m\]\w\[\033[00m\]\$ "' >> /root/.bashrc && \
# 给ls、grep等命令添加别名
echo "alias ls='ls --color=auto'" >> /root/.bashrc && \
echo "alias grep='grep --color=auto'" >> /root/.bashrc && \
echo "alias ll='ls -alFh --color=auto'" >> /root/.bashrc && \
# 清理临时文件
rm -rf /tmp/LS_COLORS
- 構建多架構鏡像 用下面的命令構建 amd64 和 arm64:
docker buildx build --platform linux/amd64,linux/arm64 -t <你的镜像名>:<标签> --push .
例子:
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t tungchiahui/ubuntu24_cuda126_cudnn:latest \
--push \
.
説明: --platform 指定多架構。 --push 是必須的,因為 buildx 的多平台構建默認是不能本地加載的(除非加 --load,但那隻能支持單一架構)。


清除構建緩存
# 清理BuildKit构建缓存
docker builder prune -f
