当前位置: 首页 > news >正文

Docker 基础命令介绍和常见报错解决

介绍一些 docker 可能用到的基础命令,并解决三个常见报错:

  • 权限被拒绝(Permission Denied)
  • 无法连接到 Docker 仓库(Timeout Exceeded)
  • 磁盘空间不足(No Space Left on Device)

命令以适用于深度学习的 dl 镜像为例进行演示。

Docker 安装见《用两行命令快速搭建深度学习环境(Docker/torch2.5.1+cu118/命令行美化+插件),包含完整的 Docker 安装步骤》

文章目录

  • 镜像管理
    • 查看本地镜像
    • 拉取镜像
    • 删除镜像
  • 创建容器
    • 挂载
    • 在容器中启动 Jupyter Lab
  • 停止容器
    • 在容器终端内
    • 从主机停止容器
  • 重新连接到已存在的容器
    • 查看所有容器
    • 启动已停止的容器
    • 重新连接到运行中的容器
  • 命名容器
    • 使用 `--name` 参数
    • 使用容器名称的命令示例
  • 复制文件
    • 从主机复制文件到容器
    • 从容器复制文件到主机
  • 删除容器
    • 删除指定的容器
    • 删除所有未使用的容器
  • 解决常见报错
    • 报错 1:权限被拒绝(Permission Denied)
      • 方法 1:使用 `sudo`
      • 方法 2:将用户添加到 `docker` 用户组
    • 报错 2:无法连接到 Docker 仓库(Timeout Exceeded)
      • 方法一:配置镜像
      • 方法二:设置 HTTP/HTTPS 代理
    • 报错 3: 磁盘空间不足(No Space Left on Device)
      • 更改 Docker 的数据目录
  • 参考链接

镜像管理

写在前面

如果不想每次运行都使用 sudo 开头,使用以下命令:

sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

查看本地镜像

docker images

列出本地所有的 Docker 镜像,包括仓库名、标签、镜像 ID、创建时间和大小。

image-20241112223609346

拉取镜像

docker pull <image_name>:<tag>

例如:

docker pull hoperj/quickstart:dl-torch2.5.1-cuda11.8-cudnn9-devel

docker pull 可以更新镜像,此时下载数据量较小,不严谨地类比为 git pull 进行理解。

删除镜像

docker rmi <image_id_or_name>

注意: 删除镜像前,确保没有容器正在使用它。

创建容器

以当前使用的命令为例:

docker run --gpus all -it hoperj/quickstart:dl-torch2.5.1-cuda11.8-cudnn9-devel

先来解释一下 --gpus all-it 的作用:

  • --gpus all:允许容器使用主机的所有 GPU 资源。
  • -it:这是两个参数的组合,-i 表示“交互式”(interactive),-t 表示为容器分配一个伪终端(pseudo-TTY)。-it 组合使用可以获得完整的交互式终端体验。

使用 docker run --help 可以查看更多参数的用法。

如果在执行 Docker 命令时遇到权限问题,可以在命令前加上 sudo

挂载

如果需要在容器内访问主机的文件,可以使用 -v 参数。

  1. 卷挂载

    docker run --gpus all -it -v my_volume:container_path hoperj/quickstart:dl-torch2.5.1-cuda11.8-cudnn9-devel
    
    • my_volume:Docker 卷的名称。
    • container_path:容器中的路径。

    这样,保存在该路径的数据在容器删除后仍会保存在 my_volume 中。

  2. 绑定主机目录到容器中

    docker run --gpus all -it -v /home/your_username/data:/workspace/data hoperj/quickstart:dl-torch2.5.1-cuda11.8-cudnn9-devel
    
    • /home/your_username/data:主机上的目录路径。
    • /workspace/data:容器内的挂载点。

在容器中启动 Jupyter Lab

如果需要在容器内启动 Jupyter Lab,并通过主机的浏览器进行访问,可以使用 -p 参数映射端口。Jupyter Lab 默认使用 8888 端口,使用以下命令:

docker run --gpus all -it -p 8888:8888 hoperj/quickstart:dl-torch2.5.1-cuda11.8-cudnn9-devel
  • -p 8888:8888 将容器内的 8888 端口映射到主机的 8888 端口。

然后在容器内运行:

jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root

现在可以在主机浏览器中访问 http://localhost:8888

停止容器

在容器终端内

  • 使用 Ctrl+D 或输入 exit:退出并停止容器(适用于通过 docker run 启动的情况)。
  • 使用 Ctrl+P 然后 Ctrl+Q:仅退出容器的终端(detach),让容器继续在后台运行。

以上的“停止”行为适用于通过 docker run 启动的容器。如果容器是通过 docker start 启动的,Ctrl+Dexit 只会退出终端,而不会停止容器。通过 docker ps 可以察觉到这一点。

从主机停止容器

如果你想从主机停止正在运行的容器,可以使用:

docker stop <container_id_or_name>

替换 <container_id_or_name> 为容器的 ID 或名称。

重新连接到已存在的容器

在使用一段时间后,你可能会发现每次使用 docker run 去“运行”容器时,之前所做的改变都“没有”保存。

这是因为每次运行 docker run 创建了新的容器。

要找回在容器中的更改,需要重新连接到之前创建的容器。

查看所有容器

docker ps -a
  • docker ps:默认只显示正在运行的容器。
  • -a:显示所有容器,包括已停止的。

启动已停止的容器

如果目标容器已停止,可以使用以下命令将其重新启动:

docker start <container_id_or_name>

替换 <container_id_or_name> 为容器的 ID 或名称。

重新连接到运行中的容器

使用 docker exec

docker exec -it <container_id_or_name> /bin/bash
  • /bin/bash:在容器内启动一个 Bash Shell。
  • docker run 命令末尾也可添加 /bin/bash

在之前的命令中,我们使用了 /bin/zsh,这是因为该容器中已安装了 zsh。而在大多数容器中,默认的行为通常是 /bin/bash/bin/sh

命名容器

有没有什么方法可以指定名称呢?每次通过 docker ps -a 复制 id 太不优雅了。

使用 --name 参数

在创建容器时,可以使用 --name 参数为容器指定一个名称。例如:

docker run --gpus all -it --name ai hoperj/quickstart:dl-torch2.5.1-cuda11.8-cudnn9-devel

容器被命名为 ai,以后可通过该名称管理容器,不需要记住容器的 ID。

运行 docker ps -a

image-20241112215358397

使用容器名称的命令示例

  • 启动容器:

    docker start ai
    
  • 停止容器:

    docker stop ai
    
  • 重新连接到容器:

    docker exec -it ai /bin/bash
    

复制文件

从主机复制文件到容器

docker cp /path/on/host <container_id_or_name>:/path/in/container

从容器复制文件到主机

docker cp <container_id_or_name>:/path/in/container /path/on/host

删除容器

删除指定的容器

如果想删除一个容器,可以使用 docker rm 命令:

docker rm <container_id_or_name>

例如,删除名为 ai 的容器:

docker rm ai

注意: 需要先停止容器才能删除。

删除所有未使用的容器

我们可以使用以下命令来删除所有处于“已退出”状态的容器:

docker container prune

这将删除所有已停止的容器(请谨慎使用,因为删除后无法恢复,适用于刚安装 Docker “不小心”创建了一堆容器)。

解决常见报错

介绍在新环境中使用 Docker 时,可能会遇到的报错。

推荐阅读,特别是报错 2

报错 1:权限被拒绝(Permission Denied)

当运行命令:

docker ps

可能会遇到以下报错:

permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get “http://%2Fvar%2Frun%2Fdocker.sock/v1.45/containers/json”: dial unix /var/run/docker.sock: connect: permission denied

解决方法

方法 1:使用 sudo

在 Docker 命令前加上 sudo

sudo docker ps

方法 2:将用户添加到 docker 用户组

  1. 创建 docker 用户组

    sudo groupadd docker
    
  2. 将当前用户添加到 docker

    sudo usermod -aG docker $USER
    
  3. 重新加载用户组设置

    newgrp docker
    
  4. 验证

    运行 Docker 命令,如果不提示权限错误(permission denied),说明配置成功。

    docker ps	
    

报错 2:无法连接到 Docker 仓库(Timeout Exceeded)

Error response from daemon: Get “https://registry-1.docker.io/v2/”: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

原因: 由于国内网络限制,无法直接连接到 Docker Hub。

解决方法

方法一:配置镜像

镜像参考:目前国内可用Docker镜像源汇总(截至2024年11月)

临时使用

直接在原 <image_name>:<tag> 前增加网址,比如:

docker pull dockerpull.org/<image_name>:<tag>

快速测试可用性:

docker pull dockerpull.org/hello-world

永久使用

运行以下命令配置文件,如果有一天突然拉(pull)不动了,说明链接挂了需要更新。

# 创建目录
sudo mkdir -p /etc/docker# 写入配置文件
sudo tee /etc/docker/daemon.json > /dev/null <<-'EOF'
{"registry-mirrors": ["https://docker.unsee.tech","https://dockerpull.org","https://docker.1panel.live","https://dockerhub.icu"]
}
EOF# 重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker

方法二:设置 HTTP/HTTPS 代理

这一项提供给🪜科学上网的同学进行配置。对于本项目来说,所有文件都会提供网盘链接和对应的国内镜像命令。

  1. 创建并编辑 Docker 的系统服务配置文件

    sudo mkdir -p /etc/systemd/system/docker.service.d
    sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
    
  2. 添加代理配置

    http-proxy.conf 文件中添加以下内容(将 http://localhost:7890/ 替换为你自己的代理地址):

    [Service]
    Environment="HTTP_PROXY=http://localhost:7890/"
    Environment="HTTPS_PROXY=http://localhost:7890/"
    

    使用 ESC + :wq 回车保存配置。

    如果不熟悉 vim 的操作,也可以使用直接运行(将 http://localhost:7890/ 替换为你自己的代理地址):

    sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf > /dev/null <<EOF
    [Service]
    Environment="HTTP_PROXY=http://localhost:7890/"
    Environment="HTTPS_PROXY=http://localhost:7890/"
    EOF
    
  3. 重新加载配置并重启 Docker 服务

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    

报错 3: 磁盘空间不足(No Space Left on Device)

write /var/lib/docker/tmp/…: no space left on device

原因: Docker 默认使用 /var/lib/docker 作为数据存储目录,如果该分区空间不足,就会出现此错误。

解决方法:

更改 Docker 的数据目录

  1. 查看当前的磁盘空间

    检查 /var/lib/docker 所在分区的剩余空间:

    sudo df -h /var/lib/docker
    

    image-20241113155339843

    2.3G 显然不够。

  2. 选择具有足够空间的目录

    假设将 Docker 的数据目录移动到 ~/Downloads 下,先看看剩余空间:

    image-20241112100834923

    显示还有 53G,绰绰有余,接着创建文件夹:

    mkdir -p ~/Downloads/Docker && cd ~/Downloads/Docker && pwd
    

    image-20241112105217964

    复制输出。

  3. 修改 Docker 的配置文件

    编辑 /etc/docker/daemon.json 文件(如果不存在会自动创建):

    sudo vim /etc/docker/daemon.json
    

    添加或修改以下内容(将 Path/to/Docker 替换为你的新数据目录的绝对路径,也就是刚刚复制的输出):

    { "data-root": "Path/to/Docker"
    }
    

    ESC + :wq保存并退出。

    image-20241113195541233

  4. 重启 Docker 服务并验证

    sudo systemctl restart docker
    docker info -f '{{ .DockerRootDir}}'
    

    输出image-20241112101614536

参考链接

How to Fix Docker’s No Space Left on Device Error

相关文章:

Docker 基础命令介绍和常见报错解决

介绍一些 docker 可能用到的基础命令&#xff0c;并解决三个常见报错&#xff1a; 权限被拒绝&#xff08;Permission Denied&#xff09;无法连接到 Docker 仓库&#xff08;Timeout Exceeded&#xff09;磁盘空间不足&#xff08;No Space Left on Device&#xff09; 命令以…...

如何轻松导出所有 WordPress URL 为纯文本格式

作为一名多年的 WordPress 使用者&#xff0c;我深知管理一个网站的复杂性。从迁移网站、设置重定向到整理内容结构&#xff0c;每一步都需要精细处理。而拥有所有 URL 的清单&#xff0c;不仅能让这些工作变得更加简单&#xff0c;还能为后续的管理提供极大的便利。其实&#…...

【进程概念精讲】

Susan,在那命运月台前面&#xff0c;再上车&#xff0c;春天开始落叶.................................................................. 文章目录 前言 一、【认识进程】 1、【进程基本概念引入】 2、【进程的描述与组织——进程控制块&#xff08;PCB&#xff09;与进程…...

帽子矩阵--记录

帽子矩阵 H是一个重要的统计工具&#xff0c;用于评估数据点对模型拟合结果的影响。通过计算帽子矩阵的对角线元素&#xff08;杠杆值&#xff09;&#xff0c;我们可以识别出高杠杆点&#xff0c;这些点对模型的影响较大&#xff0c;可能需要特别关注。...

MySQL深入:B+树的演化、索引和索引结构

提示&#xff1a;内容是读《MySQL技术内幕&#xff1a;InnoDB存储引擎》&#xff0c;笔记摘要 文章目录 二叉查找树平衡二叉树(AVL) B树(BTree)B树(BTree)InnoDB B树索引索引结构&#xff08;InnoDB B树&#xff09;B树存放的数据量 二叉查找树 在二叉查找树中&#xff0c;左子…...

axios 实现 无感刷新方案

实现思路 首次登录前端通过接口获取到两个 token&#xff1b;分别是 accessToken、refreshToken; accessToken&#xff1a;正常请求需要传递的 token &#xff1b;refreshToken&#xff1a;当某个请求 401 &#xff0c;就可以通过 refreshToken 获取到新的 accessToken 特殊场…...

Python 三种方式实现自动化任务

在这篇文章中&#xff0c;我们将介绍一些用Python实现机器人过程自动化的包。机器人流程自动化&#xff08;Robotic process automation&#xff0c;简称RPA&#xff09;是指将鼠标点击和键盘按压自动化的过程&#xff0c;即模拟人类用户的操作。RPA用于各种应用程序&#xff0…...

新型创业模式:退休创业。没有工资,不用投资,有时间就干,不强制做,赚钱按贡献分。

这种“退休创业”的创业模式具有独特的吸引力和灵活性&#xff0c;适合那些已退休但希望继续贡献社会价值、赚取额外收入且无需承担太多责任的群体。以下是一个详细的设计思路&#xff1a; 模式概述 目标人群&#xff1a;退休人员&#xff0c;具有一定技能或经验&#xff0c;但…...

Android 项目依赖库无法找到的解决方案

目录 错误信息解析 解决方案 1. 检查依赖版本 2. 检查 Maven 仓库配置 3. 强制刷新 Gradle 缓存 4. 检查网络连接 5. 手动下载依赖 总结 相关推荐 最近&#xff0c;我在编译一个 Android 老项目时遇到了一个问题&#xff0c;错误信息显示无法找到 com.gyf.immersionba…...

在Node.js中如何使用TypeScript

第一步&#xff1a;创建一个Node.js项目的package.json文件 npm init -y第二步&#xff1a;添加TypeScript、添加node.d.ts npm install typescript -D npm install types/node -D第三步&#xff1a;初始化一个tsconfig.json文件 npx tsc --init --rootDir src --outDir lib…...

链表两数加python

一、问题描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个…...

免费的可以薅羊毛的cloudflare反向代理教程

cloudflare-reverse-proxy 项目代码: https://github.com/EASTCATV/cloudflare-reverse-proxy 本项目是cloudflare反向代理。在cloudflare网站中新建worker&#xff0c;把worker.js文件中的内容复制进去即可使用。 使用方法为在任意url前面加上https://你的域名/proxy/ 即可…...

【每日刷题】Day155

【每日刷题】Day155 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCR 108. 单词接龙 - 力扣&#xff08;LeetCode&#xff09; 2. 675. 为高尔夫球比赛砍树 - 力扣(…...

EXCEL延迟退休公式

如图&#xff1a; A B为手工输入 C2EOMONTH(A2,B2*12) D2EOMONTH(C2,IF(C2>DATEVALUE("2025-1-1"),INT((DATEDIF(DATEVALUE("2025-1-1"),C2,"m")4)/4),0)) E2EOMONTH(A2,B2*12IF(EOMONTH(A2,B2*12)>DATEVALUE("2025-1-1"),INT(…...

开源对象存储新选择:在Docker上部署MinIO并实现远程管理

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器&#xff0c;可以在各种环境中运行&#xff0c;例如本地、Docker容器、Kubernetes集群等。它兼…...

Spring Cloud生态圈

目录 Spring Cloud生态圈 核心组件 其他组件 总结 Spring Cloud Alibaba生态圈 核心组件 其他特性 Spring Cloud生态圈 Spring Cloud生态圈是一个为微服务架构提供全方位支持的解决方案集合。它涵盖了多个关键组件和服务&#xff0c;旨在帮助开发者快速构建、部署和管理…...

AI视觉小车基础--4.舵机控制(云台控制)

一、实验准备 控制连接在扩展板上的舵机。如下图所示&#xff0c;按键KEY1为板载元器件&#xff0c;所以不需要外接其他设备。 二、运行代码 # Import the Raspbot library import time from Raspbot_Lib import Raspbot from ipywidgets import interact import ipywidgets a…...

【Rust中的项目管理】

Rust中的项目管理 前言Package&#xff0c;Crate&#xff0c;Module &use &#xff0c;Path通过代码示例解释 Crate&#xff0c;Module &#xff0c;use&#xff0c;Path创建一个package&#xff1a;代码组织化skin.rs 中的代码struct & enum 相对路径和绝对路径引用同…...

【原创】如何备份和还原Ubuntu系统,非常详细!!

前言 我在虚拟机装了一个xfce4的Ubuntu桌面版&#xff0c;外加输入法、IDEA等&#xff0c;我想将这个虚拟机里的系统直接搬到物理机中&#xff0c;那我可以省的再重新装一遍、配置xfce4桌面、修改一堆快捷键还有配置idea了&#xff0c;那直接说干就干。 本教程基于Ubuntu24.0…...

成都栩熙酷网络科技抖音小店是真的

近年来&#xff0c;随着短视频平台的崛起&#xff0c;抖音小店作为一种新兴的购物模式&#xff0c;迅速吸引了大量消费者和商家的关注。在这一潮流中&#xff0c;成都栩熙酷网络科技有限公司&#xff08;以下简称“栩熙酷”&#xff09;凭借其敏锐的市场洞察力和强大的技术实力…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...