前言:
此教程为小白入门教程,包括安装和一些基础的使用指令。如果需要深度使用的话(例如多容器Docker Compose等),还有很多东西没有涉及到,需要找一些专业的教程进一步学习,后续可能更新一下打包镜像的相关内容。教程参考了很多已有的教程并且结合了很多自己踩过的坑和一些需求(这个教程主要是我发布的另一个用Docker安装ROS的帖子的前置教程,用来了解和入门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
sudo apt install docker-ce docker-ce-cli containerd.io
【Docker的源最近乱七八糟的,上面的源和密钥什么的也有可能失效了,可以试一下一键安装:小鱼的一键安装系列】
sudo docker version
systemctl status docker
sudo systemctl start docker
)sudo systemctl enable docker
sudo docker run hello-world
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
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).
sudo nano /etc/docker/daemon.json
输入:
{
"registry-mirrors": [
"https://xxxxx.cn", # 请替换为自己找的镜像源
"https://xxxxx.cn", # 请替换为自己找的镜像源
"https://xxxxx.cn" # 请替换为自己找的镜像源
]
}
给一个目前(24年9月份)还能用的第三方源的帖子链接:
从Docker拉取镜像一直失败超时?这些解决方案帮你解决烦恼
systemctl restart docker
PS :对小白来说这也算是个巨坑了,一般来说不关注行业资讯的话确实想不到是因为国内各大镜像源把docker给下架了(毕竟镜像本身就是为了方便国内下载国外资源的),找了好久才解决这个问题。
安装NVIDIA Container Runtime
和nvidia-docker2
使得容器能够访问和使用宿主机的GPU资源
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
&& curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
nvidia-docker2
sudo apt-get update
sudo apt-get install -y nvidia-docker2
nvidia-ctk
命令配置container runtime
sudo nvidia-ctk runtime configure --runtime=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]].
如果觉着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组
镜像是用于创建容器的静态模板或快照。它包含了用于运行应用程序所需的文件系统、工具、库以及配置等。镜像可以看作是一个只读的模板,可以用于创建多个相同配置的容器。镜像是构建容器的基础,可以通过 Dockerfile 或者从 Docker Hub 等镜像仓库中获取。
sudo docker pull XXX(需要的镜像)
sudo docker images
sudo docker rmi -f 镜像id # 删除指定镜像, -f表示强制删除
sudo docker rmi -f 镜像id 镜像id 镜像id # 同时删除多个镜像
# linux下有效:
sudo docker rmi -f $(docker images -aq) # 全部删除
容器是从镜像创建的运行实例。当你创建一个容器时,Docker 会根据镜像的内容在其上建立一个可运行的环境。容器是一个独立、隔离的运行单元,包含了应用程序及其所有运行时所需的文件系统、环境变量、进程、网络配置等。容器可以被启动、停止、删除,可以与其他容器或主机进行通信。一个容器通常只能运行一个镜像。
(Docker Compose 工具: 是一个用于管理和运行多个 Docker 容器的工具。它允许你以声明性的方式定义和配置多个容器,并协调它们的运行。Docker Compose 可以自动处理容器之间的网络连接、环境变量的传递、卷的挂载等。使得在一个命令下同时启动、停止、重启和管理多个容器变得更加方便)
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 run使用基本类似。
详见:菜鸟教程-Docker create 命令
sudo docker ps # 列出当前正在运行的容器信息
sudo docker ps -a # 列出当前正在运行的容器和历史运行过的所有容器信息
sudo docker ps -q # 只显示容器id
sudo docker logs -f 容器id # 查看容器日志(-f: 滚动查看日志的最后几行)
sudo docker start 容器id/名称 # 启动容器
sudo docker restart 容器id/名称 # 重启容器
sudo docker stop 容器id/名称 # 停止当前正在运行的容器
sudo docker kill 容器id/名称 # 强制停止当前容器
sudo docker rm <容器ID 或 容器名称> # 删除指定容器
sudo docker rm $(docker ps -qa) # 删除全部容器
进入容器:
docker exec -it <容器ID 或 容器名称> /bin/bash
在这个命令中,-it 参数用于指定使用交互式终端,并且 /bin/bash 是要在容器内执行的 Shell。你也可以使用其他 Shell,如 /bin/sh 或 /bin/zsh。
退出容器:
exit # 容器直接停止,并退出
ctrl+P+Q # 容器不停止,退出