Docker 学习笔记与常用命令手册
·
一、 容器与镜像查询
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. 强制删除被占用的镜像
问题:删除镜像时容器正在进行,需强制删除
-fError 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
- 加载或拉取镜像
docker load 镜像包 # 或 docker pull 原始镜像 - 运行镜像
docker run -it 镜像名 /bin/bash - 添加 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 - 添加 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 - 不使用 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 - 上传制作好的镜像至 GV 镜像管理加载使用(登录 Harbor)
六、 Docker 离线安装(无网络计算节点)
第一步:下载离线二进制文件
# 下载地址: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 的组件?
解决方案:
- 打开
NCCL_DEBUG=INFO,导出日志 - 临时 workaround:设置
NCCL_TOPO_FILE=null环境变量 - 删除
/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 |
重新构建镜像 |
💡 提示:以上命令速查表为补充内容,原始笔记中的所有命令、配置和问题解决方案均已完整保留在对应章节中。
更多推荐




所有评论(0)