Ubuntu 安装 docker及基础使用教程(包含显卡驱动设置)——小白专属避坑指南

前言:
  此教程为小白入门教程,包括安装和一些基础的使用指令。如果需要深度使用的话(例如多容器Docker Compose等),还有很多东西没有涉及到,需要找一些专业的教程进一步学习,后续可能更新一下打包镜像的相关内容。教程参考了很多已有的教程并且结合了很多自己踩过的坑和一些需求(这个教程主要是我发布的另一个用Docker安装ROS的帖子的前置教程,用来了解和入门docker),有任何问题欢迎指正。

目录

一、安装

1.1 添加Docker安装源

① 安装必要的证书并允许 apt 包管理器使用以下命令通过 HTTPS 使用存储库:

sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release

② 添加 Docker 的官方 GPG 密钥:

# 1. 默认使用国外源
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 2. 国内源(不一定能用)
sudo curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

说明: docker的相关国内镜像这段时间都“下架”了,所以国内源目前是无法使用的,会显示:curl: (22) The requested URL returned error: 404 gpg: 找不到有效的 OpenPGP 数据。

③ 添加 Docker 官方库:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

④ 更新 Ubuntu 源列表:

sudo apt update

1.2 安装 Docker

sudo apt install docker-ce docker-ce-cli containerd.io

1.3 安装后相关基础指令

  • 检查已安装的 Docker 版本:sudo docker version
  • 验证 Docker 服务是否在运行:systemctl status docker
    (如果没有运行,运行以下命令运行 Docker 服务:sudo systemctl start docker
  • 设置 Docker 服务在每次重启时自动启动:sudo systemctl enable docker
  • 测试 Docker 是否运行正常:sudo docker run hello-world
    ((正常输出:Hello from Docker!..)
  • 卸载:sudo apt-get purge docker-ce docker-ce-cli containerd.io
    sudo rm -rf /var/lib/docker
    sudo rm -rf /etc/docker
    sudo rm -rf /var/run/docker.sock

1.4 可能遇到的问题:换源(大坑)

  • 在拉取镜像时出现报错:docker: 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).
      在网上搜这个报错,解决办法要么是让改dns域名要么是换主流镜像源(阿里云中科大等等),但是都无法解决这个问题。
  • 实际原因:docker的官方源国内封了,导致无法拉取到镜像。前段时间docker官方源解封了,但是最近(24年.9月)好像又封了。
      当更换国内的主流镜像源后会发现还是有这样的问题,是因为很多常见的国内镜像源,例如阿里云中科大等等的docker镜像都关闭了。
      所以只能从网上找别人搭的或者自己搭镜像源(建议先试试docker官方源和主流镜像还能不能用,指不定什么时候又解封了,都不行只能找别人的第三方源了)。找到之后,换源方法如下:
① 编辑配置文件:
sudo nano /etc/docker/daemon.json
② 添加镜像源

输入:

{
    "registry-mirrors": [
        "https://xxxxx.cn",    # 请替换为自己找的镜像源
        "https://xxxxx.cn",    # 请替换为自己找的镜像源
        "https://xxxxx.cn"     # 请替换为自己找的镜像源
    ]
}

给一个目前(24年9月份)还能用的第三方源的帖子链接:
从Docker拉取镜像一直失败超时?这些解决方案帮你解决烦恼

③ 重启docker
systemctl restart docker

PS :对小白来说这也算是个巨坑了,一般来说不关注行业资讯的话确实想不到是因为国内各大镜像源把docker给下架了(毕竟镜像本身就是为了方便国内下载国外资源的),找了好久才解决这个问题。

1.5 安装 Docker 显卡驱动(确保宿主机已经安装好显卡驱动)

  安装NVIDIA Container Runtimenvidia-docker2使得容器能够访问和使用宿主机的GPU资源

① 配置存储库 并 更新

(全部复制输入即可)

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list \
&& \
sudo apt-get update

② 安装nvidia-docker2

sudo apt-get install -y nvidia-docker2

③ 使用nvidia-ctk命令配置container runtime

sudo nvidia-ctk runtime configure --runtime=docker

④ 重启docker系统

sudo systemctl restart docker

⑤ 测试

# Ubuntu22.04
sudo docker run --rm --gpus all nvidia/cuda:12.4.1-base-ubuntu22.04 nvidia-smi

# Ubuntu20.04
sudo docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi

正常输出显卡驱动信息说明安装成功。(–rm表示运行一次就删除的容器)
失败会显示:
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].

1.6 安装 Docker 可视化界面(非必要)

   如果觉着docker的命令行操作太麻烦或者想更直观的管理docker,可以选择安装docker可视化界面工具,这里推荐安装Portainer,详见:Docker可视化工具Portainer的具体使用

二、使用

Docker用户权限问题:
  默认情况下,需要使用sudo权限来运行Docker命令,通过将用户添加到Docker用户组,可以在无需sudo的情况下运行Docker命令。
(如果当前用户没有加入Docker用户组并且没有sudo权限的话,会报错:permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock:

添加方法如下:

# Way1:将指定用户username加入到docker组
sudo gpasswd -a username docker  

# Way2:将当前用户加入到docker组
sudo gpasswd -a $USER docker  

newgrp docker  #切换到docker组

2.1 镜像

  镜像是用于创建容器的静态模板或快照。它包含了用于运行应用程序所需的文件系统、工具、库以及配置等。镜像可以看作是一个只读的模板,可以用于创建多个相同配置的容器。镜像是构建容器的基础,可以通过 Dockerfile 或者从 Docker Hub 等镜像仓库中获取。

2.1.1. 获取镜像:docker pull

sudo docker pull XXX(需要的镜像)

2.1.2. 查看已下载的镜像

sudo docker images

2.1.3. 删除镜像 docker rmi

sudo docker rmi -f 镜像id # 删除指定镜像, -f表示强制删除
sudo docker rmi -f 镜像id 镜像id 镜像id # 同时删除多个镜像
# linux下有效:
sudo docker rmi -f $(docker images -aq) # 全部删除

2.2 容器

  容器是从镜像创建的运行实例。当你创建一个容器时,Docker 会根据镜像的内容在其上建立一个可运行的环境。容器是一个独立、隔离的运行单元,包含了应用程序及其所有运行时所需的文件系统、环境变量、进程、网络配置等。容器可以被启动、停止、删除,可以与其他容器或主机进行通信。一个容器通常只能运行一个镜像。
(Docker Compose 工具: 是一个用于管理和运行多个 Docker 容器的工具。它允许你以声明性的方式定义和配置多个容器,并协调它们的运行。Docker Compose 可以自动处理容器之间的网络连接、环境变量的传递、卷的挂载等。使得在一个命令下同时启动、停止、重启和管理多个容器变得更加方便)

2.2.1. 创建&运行容器(使用现有镜像创建容器)

① 创建并启动容器:docker run
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

[COMMAND]:在容器启动后你想要运行的命令。如果镜像中已经有一个默认的启动命令,你可以用这个来替换它。如果不提供 [COMMAND],Docker 将使用镜像中的默认命令。
[ARG…]:传递给 [COMMAND] 的参数列表。这些参数可以是任何你需要传递给命令的选项或值。

[OPTIONS]:
-d: 后台运行容器并返回容器 ID。
-it: 交互式运行容器,分配一个伪终端。
--name xxx: 给容器指定一个名称xxx。
-p: 端口映射,格式为 host_port:container_port。
-v: 挂载卷,格式为 host_dir:container_dir。
--rm: 容器停止后自动删除容器。
--env 或 -e: 设置环境变量。
--network: 指定容器的网络模式。
--restart=xxx:
    `no`:默认策略,在容器退出时不重启容器
    `on-failure`:在容器非正常退出时,才会重启容器
    `on-failure:n`:容器非正常退出时重启容器,并指定重启次数(不指定次数会一直重启直到启动成功)
    `always`:只要容器退出就重启容器
    `unless-stopped`:在容器退出时总是重启容器,除非它被手动停止或 Docker 本身被停止
-u: 指定用户。
--device=[]:添加一个主机硬件设备到容器。
-w 或 --workdir:设置容器内部的工作目录,即容器启动后执行命令的目录

--gpus all \   # 允许docker使用宿主机的显卡资源
-e NVIDIA_DRIVER_CAPABILITIES=all \
② 创建但不启动容器:docker create

 创建完后配合启动容器使用,和docker run使用基本类似。
详见:菜鸟教程-Docker create 命令

2.2.2. 查看容器

sudo docker ps     # 列出当前正在运行的容器信息
sudo docker ps -a  # 列出当前正在运行的容器和历史运行过的所有容器信息
sudo docker ps -q  # 只显示容器id
sudo docker logs -f 容器id # 查看容器日志(-f: 滚动查看日志的最后几行)

2.2.3. 启动和停止容器

sudo docker start 容器id/名称   # 启动容器
sudo docker restart 容器id/名称 # 重启容器
sudo docker stop 容器id/名称    # 停止当前正在运行的容器
sudo docker kill 容器id/名称    # 强制停止当前容器

2.2.4. 删除容器

sudo docker rm <容器ID 或 容器名称>  # 删除指定容器
sudo docker rm $(docker ps -qa)    # 删除全部容器

2.2.5. 进入/退出容器

  进入容器:

docker exec -it <容器ID 或 容器名称> /bin/bash

  在这个命令中,-it 参数用于指定使用交互式终端,并且 /bin/bash 是要在容器内执行的 Shell。你也可以使用其他 Shell,如 /bin/sh 或 /bin/zsh。

  退出容器:

exit        # 容器直接停止,并退出
ctrl+P+Q    # 容器不停止,退出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值