一、 容器与镜像查询

1. 查看正在运行的容器名称

docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Image}}"

2. 确认镜像 ID

docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"

3. 根据容器名称查看镜像 ID

docker ps -f "name=docker_name" --format "{{.ID}}"

4. 根据容器名称或者标签查看镜像 ID

docker images -f "reference=image_name:tag" --format "{{.ID}}"

二、 Docker Run 启动参数详解

参数 说明
-d, --detach 后台运行容器并打印容器 ID
-p, --publish 发布容器端口到宿主机(格式:宿主机端口:容器端口
--name 为容器指定名称(不指定则随机生成)
-e, --env 设置环境变量(格式:KEY=VALUE
-w, --workdir 指定容器内工作目录
-v, --volume 挂载卷(格式:宿主机路径:容器路径
--network 指定网络模式(bridge / host / none)
-it -i 保持 stdin 开放 + -t 分配伪终端
--restart 重启策略(always / on-failure / unless-stopped)
--privileged 给予容器完全的主机设备访问权限
--memory 设置容器内存上限
--shm-size 设置共享内存大小
--device 映射主机设备到容器
--group-add 添加额外的用户组

启动示例

docker run -it \
  -v /public/home/llama3_pytorch/module_path:/public/home/llama3_pytorch/module_path \
  -v /opt/:/opt/:ro \
  --shm-size=80G \
  --privileged=true \
  --device=/dev/kfd \
  --device=/dev/dri/ \
  --group-add video \
  --name 2.1.0-centos7.6-dtk24.04-py310 \
  c85ed27005f2 bash
docker run -it \
  -v `pwd`:/app/ \
  -v /opt/:/opt/:ro \
  --shm-size=80G \
  --privileged=true \
  --device=/dev/kfd \
  --device=/dev/dri/ \
  --group-add video \
  --name my_new2 \
  22a64bebb32e bash

三、 镜像管理

1. 镜像导出

docker save -o your_env.tar docker_repository
# 示例
docker save -o torch2.1-dtk24.04.tar my_new

2. 镜像导入

docker load -i new.tar

3. 固化镜像(Commit)

# 1. 停止容器以避免数据不一致
docker stop mycontainer
# 2. 提交为镜像
docker commit mycontainer myapp:snapshot

4. 标记镜像名称和标签

docker tag 0291c26699b0 vllm0.62-dtk24.04:nginx

5. 构建镜像

docker build -t my-new-image .

6. 清空无效镜像

# 查看所有悬空镜像
docker images -f dangling=true
# 删除所有悬空镜像、无用容器、网络和卷
docker system prune

7. 强制删除被占用的镜像

问题:删除镜像时容器正在进行,需强制删除 -f
Error response from daemon: conflict: unable to delete 792b29f4daac (must be forced)

docker rmi -f 792b29f4daac

四、 Dockerfile 示例

FROM docker.new
WORKDIR /app
COPY llama3_pytorch /app/llama3_pytorch
RUN ls -l llama3_pytorch
RUN cd /app/llama3_pytorch/ && pip install -e .
RUN cd /app/llama3_pytorch/xtuner && pip install -e '.[all]'

五、 Ubuntu 镜像中添加 SSH 和 Sudo

  1. 加载或拉取镜像
    docker load 镜像包
    # 或
    docker pull 原始镜像
    
  2. 运行镜像
    docker run -it 镜像名 /bin/bash
    
  3. 添加 sudo
    sudo -V || /usr/bin/sudo -V || /usr/local/bin/sudo -V; \
    if [ $? -ne 0 ]; then \
      cd /tmp && dpkg --configure -a && \
      dpkg -i sudo_1.8.16-0ubuntu1.9_amd64.deb || \
      apt-get update && apt-get install -y sudo; \
    fi
    
  4. 添加 SSH
    /usr/sbin/sshd -p 22; \
    if [ $? -ne 0 ]; then \
      apt-get update && apt-get dist-upgrade -y && \
      apt-get install -y openssh-server; \
    fi
    mkdir -p /var/run/sshd /root/.ssh
    
  5. 不使用 DNS
    sed -i "s/#UseDNS ./UseDNS no/" /etc/ssh/sshd_config
    sed -i -r "s/^(.*pam_nologin.so)/#\1/" /etc/pam.d/sshd
    ssh-keygen -A
    
  6. 上传制作好的镜像至 GV 镜像管理加载使用(登录 Harbor)

六、 Docker 离线安装(无网络计算节点)

📖 参考教程:docker 离线安装_docker离线安装-CSDN博客

第一步:下载离线二进制文件

# 下载地址:https://download.docker.com/linux/static/stable/x86_64/
wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.22.tgz
tar -zxvf docker-20.10.22.tgz
sudo cp docker/* /usr/bin/
# 后台运行
sudo nohup dockerd &
docker run hello-world

第二步:下载 docker-compose

# 官网下载 docker-compose v2.20.0
# https://github.com/docker/compose/releases
mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose -v

第三步:添加 systemd 服务

创建 /etc/systemd/system/docker.service

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
chmod +x /etc/systemd/system/docker.service
systemctl daemon-reload
systemctl start docker

七、 GPU 相关问题排查

问题:Docker 不能在 GPU 上使用

docker: Error response from daemon: could not select device driver "" with capabilities:

前置检查:

  • 确保离线机器 CentOS 版本与下载安装包的机器一致
  • 提前安装与 CUDA 版本兼容的 NVIDIA GPU 驱动
  • Docker 版本 ≥ 19.03(支持 --gpus 参数)
  • 所有依赖包已下载并安装
1. 配置 NVIDIA 仓库(有网机器)
sudo yum install -y yum-utils
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo \
| sudo tee /etc/yum.repos.d/nvidia-docker.repo
sudo yum makecache
2. 下载 nvidia-container-toolkit 及依赖
sudo yum install --downloadonly --downloaddir=./nvidia-container-toolkit-rpms nvidia-container-toolkit
tar -czvf nvidia-container-toolkit-rpms.tar.gz -C ./nvidia-container-toolkit-rpms .
3. 传输到离线机器并安装
scp nvidia-container-toolkit-rpms.tar.gz user@offline-machine:/path/to/destination/
# 离线机器上解压
tar -xzvf nvidia-container-toolkit-rpms.tar.gz -C /path/to/extract/
# 安装
sudo yum install -y /path/to/extract/*.rpm
# 或手动 rpm 安装
sudo rpm -ivh /path/to/extract/*.rpm
4. 配置 Docker 使用 NVIDIA 运行时
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
5. 验证安装
docker run --rm --gpus all nvidia/cuda:11.8-base nvidia-smi

八、 其他常见问题

问题1:运行容器报错 Open mkfd failed

解决:建立容器时加入 --device=/dev/mkfd

问题2:OOM monitoring failed - cgroups memory not supported

"cgroups: memory cgroup not supported on this system"

概念:内存控制组(cgroup)是 Linux 内核功能,允许将进程分组并限制资源使用。Docker 利用 cgroup 管理容器的 CPU、内存和磁盘 I/O。

可能原因

  • 内存限制设置过低
  • 应用程序内存泄漏
  • 并发请求过多
  • 基础镜像性能问题
  • 系统不支持(如 Rocky 9.3 cgroup/memory 未挂载)

排查命令

docker info | grep Cgroup
docker run --rm -it --memory 100m alpine free -m  # 测试内存限制

尝试解决(修改 GRUB):

# 修改 /etc/default/grub 后执行
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

问题3:bw1000 测试报 XGMI 和 NCCL 错误

bw1000 设备除 DCU 驱动外是否需要类似 NVIDIA fabric-manager 的组件?

解决方案

  1. 打开 NCCL_DEBUG=INFO,导出日志
  2. 临时 workaround:设置 NCCL_TOPO_FILE=null 环境变量
  3. 删除 /opt/dtk-25.04/rccl/lib/ 下的 XML 文件后可正常运行

Nginx 前台运行

nginx -g "daemon off;"

九、 Docker 常用命令速查表(补充)

容器生命周期管理

命令 说明
docker run 创建并启动新容器
docker start <容器> 启动已停止的容器
docker stop <容器> 优雅停止容器(SIGTERM)
docker kill <容器> 强制停止容器(SIGKILL)
docker restart <容器> 重启容器
docker rm <容器> 删除容器(加 -f 强制删除运行中容器)
docker exec -it <容器> bash 进入运行中的容器
docker attach <容器> 附加到容器终端(退出可能导致容器停止)
docker pause / unpause 暂停 / 恢复容器内所有进程
docker wait <容器> 阻塞等待容器退出并返回退出码

镜像管理

命令 说明
docker pull <镜像> 从仓库拉取镜像
docker push <镜像> 推送镜像到仓库
docker rmi <镜像> 删除本地镜像
docker tag <源> <目标> 给镜像打标签
docker build -t <名称> . 从 Dockerfile 构建镜像
docker history <镜像> 查看镜像构建历史
docker import <tar> 从 tar 包导入为镜像
docker export <容器> > file.tar 将容器文件系统导出为 tar

信息查看与调试

命令 说明
docker ps -a 查看所有容器(含已停止)
docker images -a 查看所有镜像(含中间层)
docker inspect <对象> 查看详细信息(JSON 格式)
docker logs <容器> 查看容器日志(-f 实时跟踪)
docker stats 实时显示容器资源使用情况
docker top <容器> 查看容器内进程
docker diff <容器> 查看容器文件系统变更
docker info 查看 Docker 系统信息
docker version 查看 Docker 版本

网络与数据卷

命令 说明
docker network ls 列出所有网络
docker network create <名称> 创建自定义网络
docker network connect/disconnect 连接/断开容器与网络
docker volume ls 列出所有数据卷
docker volume create <名称> 创建命名数据卷
docker volume inspect <名称> 查看数据卷详情
docker volume rm <名称> 删除数据卷

系统清理

命令 说明
docker system prune 清理未使用的容器、网络、悬空镜像
docker system prune -a 同上 + 清理未被任何容器引用的镜像
docker system df 查看 Docker 磁盘占用情况
docker container prune 仅清理已停止的容器
docker image prune 仅清理悬空镜像
docker volume prune 仅清理未使用的数据卷

Compose 常用命令

命令 说明
docker-compose up -d 后台启动所有服务
docker-compose down 停止并删除容器、网络
docker-compose ps 查看服务状态
docker-compose logs -f 实时查看所有服务日志
docker-compose restart <服务> 重启指定服务
docker-compose exec <服务> bash 进入指定服务容器
docker-compose pull 拉取最新镜像
docker-compose build 重新构建镜像

💡 提示:以上命令速查表为补充内容,原始笔记中的所有命令、配置和问题解决方案均已完整保留在对应章节中。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐