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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/917755.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

js识别二维码

需要下载的js文件&#xff1a;https://download.csdn.net/download/impossible1994727/90001718https://download.csdn.net/download/impossible1994727/90001718 或者直接复制也行&#xff1a; var _aa {}; _aa._ab function (f, e) { var d qrcode.width; var b qrcode…

Uniapp踩坑input自动获取焦点ref动态获取实例不可用

前言 大家好我是没钱的君子下流坯&#xff0c;用自己的话解释自己的知识。很久很更新了&#xff0c;这几个月一直在加班&#xff0c;今天记录一个uniapp关于input中focus()方法自动获取焦点的坑。 案例 为了实现一个手机验证码的页面&#xff0c;验证码是五个输入框&#xf…

GA/T1400视图库平台EasyCVR视频融合平台HLS视频协议是什么?

在数字化时代&#xff0c;视频监控系统已成为保障安全、提升效率的关键技术。EasyCVR视频融合云平台&#xff0c;作为TSINGSEE青犀视频在“云边端”架构体系中的重要一环&#xff0c;专为大中型项目设计&#xff0c;提供了一个跨区域、网络化的视频监控综合管理系统平台。它不仅…

文献解读-DNAscope: High accuracy small variant calling using machine learning

关键词&#xff1a;基准与方法研究&#xff1b;基因测序&#xff1b;变异检测&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;DNAscope: High accuracy small variant calling using machine learning标题&#xff08;中文&#xff09;&#xff1a;DNAsc…

每日一博 - Java的Shallow Copy和Deep Copy

文章目录 概述创建对象的5种方式1. 通过new关键字2. 通过Class类的newInstance()方法3. 通过Constructor类的newInstance方法4. 利用Clone方法5. 反序列化 Clone方法基本类型和引用类型浅拷贝深拷贝如何实现深拷贝1. 让每个引用类型属性内部都重写clone()方法2. 利用序列化 概述…

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-25

文件下载与邀请翻译者 学习英特尔开发手册&#xff0c;最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册&#xff0c;会是一件耗时费力的工作。如果有愿意和我一起来做这件事的&#xff0c;那么&#xff…

Odoo :一款免费开源的日化行业ERP管理系统

文 / 开源智造Odoo亚太金牌服务 概述 构建以 IPD 体系作为核心的产品创新研发管控体系&#xff0c;增进企业跨部门业务协同的效率&#xff0c;支撑研发管控、智慧供应链、智能制造以及全渠道营销等行业的场景化&#xff0c;构筑行业的研产供销财一体化管理平台。 行业的最新…

【Golang】——Gin 框架中间件详解:从基础到实战

中间件是 Web 应用开发中常见的功能模块&#xff0c;Gin 框架支持自定义和使用内置的中间件&#xff0c;让你在请求到达路由处理函数前进行一系列预处理操作。这篇博客将涵盖中间件的概念、内置中间件的用法、如何编写自定义中间件&#xff0c;以及在实际应用中的一些最佳实践。…

计算机网络 (3)计算机网络的性能

一、计算机网络性能指标 速率&#xff1a; 速率是计算机网络中最重要的性能指标之一&#xff0c;它指的是数据的传送速率&#xff0c;也称为数据率&#xff08;Data Rate&#xff09;或比特率&#xff08;Bit Rate&#xff09;。速率的单位是比特/秒&#xff08;bit/s&#xff…

云原生之运维监控实践-使用Telegraf、Prometheus与Grafana实现对InfluxDB服务的监测

背景 如果你要为应用程序构建规范或用户故事&#xff0c;那么务必先把应用程序每个组件的监控指标考虑进来&#xff0c;千万不要等到项目结束或部署之前再做这件事情。——《Prometheus监控实战》 去年写了一篇在Docker环境下部署若依微服务ruoyi-cloud项目的文章&#xff0c;当…

【C++】类中的“默认成员函数“--构造函数出现的意义?拷贝构造时“无穷递归”和“双重释放”出现的原因?

目录 "默认"成员函数 概念引入&#xff1a; 一、构造函数 问题引入&#xff1a; 1&#xff09;构造函数的概念 2&#xff09;构造函数实例 3&#xff09;构造函数的特性 4)关于默认生成的构造函数 (默认构造函数) 默认构造函数未完成初始化工作实例: 二…

fastapi 调用ollama之下的sqlcoder模式进行对话操作数据库

from fastapi import FastAPI, HTTPException, Request from pydantic import BaseModel import ollama import mysql.connector from mysql.connector.cursor import MySQLCursor import jsonapp FastAPI()# 数据库连接配置 DB_CONFIG {"database": "web&quo…

基于微信小程序的乡村研学游平台设计与实现,LW+源码+讲解

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自…

基于Java Springboot城市交通管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数…

手机直连卫星NTN通信初步研究

目录 1、手机直连卫星之序幕 2、卫星NTN及其网络架构 2.1 NTN 2.2 NTN网络架构 3、NTN的3GPP标准化进程 3.1 NTN需要适应的特性 3.2 NTN频段 3.3 NTN的3GPP标准化进程概况 3.4 NTN的3GPP标准化进程的详情 3.4.1 NR-NTN 3.4.1.1 NTN 的无线相关 SI/WI 3.4.1.2…

基本数据类型和包装类型的区别、缓存池、自动拆箱装箱(面试题)

目录 1. 八种基本类型及对应包装类型 2. 基本类型和包装类型 区别 3. 自动拆箱装箱 3.1 自动装箱 3.2 自动拆箱 3.3 缓存池 4. 高频面试案例分析 1. 八种基本类型及对应包装类型 基本数据类型类型描述范围&#xff08;指数形式&#xff09;位数包装类型byte整型&#x…

Aria2-CVE-2023-39141漏洞分析

前言&#xff1a; 在偶然一次的渗透靶机的时候&#xff0c;上网查询Aria2的历史漏洞&#xff0c;发现了这个漏洞&#xff0c;但是网上并没有对应的漏洞解释&#xff0c;于是我就就源代码进行分析&#xff0c;发现这是一个非常简单的漏洞&#xff0c;于是发这篇文章跟大家分享一…

androidstudio入门到放弃配置

b站视频讲解传送门 android_studio安装包&#xff1a;https://developer.android.google.cn/studio?hlzh-cn 下载安装 开始创建hello-world 1.删除缓存 文件 下载gradle文件压缩&#xff1a;gradle-8.9用自己创建项目时自动生成的版本即可&#xff0c;不用和我一样 https://…

河道无人机雷达测流监测系统由哪几部分组成?

在现代水利管理中&#xff0c;河道无人机雷达监测系统正逐渐成为一种重要的工具&#xff0c;为河道的安全和管理提供了强大的技术支持。那么&#xff0c;这个先进的监测系统究竟由哪几部分组成呢&#xff1f; 河道无人机雷达监测系统工作原理 雷达传感器通过发射电磁波或激光束…

Mac上详细配置java开发环境和软件(更新中)

文章目录 概要JDK的配置JDK下载安装配置JDK环境变量文件 Idea的安装Mysql安装和配置Navicat Premium16.1安装安装Vscode安装和配置Maven配置本地仓库配置阿里云私服Idea集成Maven 概要 这里使用的是M3型片 14.6版本的Mac 用到的资源放在网盘 链接: https://pan.baidu.com/s/17…