安装docker

sudo apt update

sudo apt install docker.io -y

docker Tips

1)在docker容器apt安装的包存储在/var/lib/docker ,这个目录默认在系统盘(通常是固态硬盘 SSD)

而容器产生的大量数据(如数据库文件、应用日志、代码仓库)通过类似 -v /mnt/hd/tina:/workspace 这种方式,挂载到大容量的机械硬盘

2)执行start(启动)的那个会话结束,其他exec(进入)容器的会话都会退出(留坑:目前不确定如果是vscode启动的容器,直接退出vscode,容器是会停止还是挂着,有空看看

用户加入docker群组

起因:(1)执行任何docker操作都要sudo,否则:

tina@tina-Inspiron-5580:~$ docker exec -it humble /bin/bash permission denied while trying to connect to the docker API at unix:///var/run/docker.soc

(2)在vscode终端又不能使用sudo:

tina@tina-Inspiron-5580:~$ sudo docker exec -it humble /bin/bash
sudo: The "no new privileges" flag is set, which prevents sudo from running as root.
sudo: If sudo is running in a container, you may need to adjust the container configuration to disable the flag.

解决:将当前用户加到docker 组

sudo usermod -aG docker $USER    (把用户加入 docker 组)

newgrp docker                                  (在当前终端立刻生效)

sudo usermod -aG docker $USER && newgrp docker

验证:groups 有没有docker

这时在同一终端打开vscode直接执行docker exec -it humble /bin/bash就可以进入容器了

拉取镜像

示例,拉取某个镜像并存储压缩包,传到无法pull的机器上使用

找一个存放镜像压缩包的目录 终端打开,依次执行(下面的tag其实不存在,这里做示例)

拉取镜像

docker pull nvidia/cuda:10.1-devel-ubuntu20.04

打包.tar
docker save -o cuda101-ubuntu2004.tar nvidia/cuda:10.1-devel-ubuntu20.04

在别的机器导入镜像

docker load -i cuda101-ubuntu2004.tar

报错与解决

Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded (Client.Timeout exceeded while awaiting headers)

原因

国内访问官方地址可能不稳,改成国内的几个镜像源

方法一

1.1 修改配置

sudo gedit /etc/docker/daemon.json  写入:

{
  "registry-mirrors": [
    "https://docker.1ms.run",
    "https://docker.xuanyuan.me",
    "https://docker.m.daocloud.io"
  ]
}

接着执行以下指令

1.2 重启docker 

sudo  systemctl daemon-reload
sudo systemctl restart docker

1.3 验证配置

sudo docker info | grep -A 10 "Registry Mirrors"

若执行仍报错,说明还是走的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)

方法二

直接指定国内镜像源拉取(亲测最有效)

检查三个国内的镜像源是否能访问

curl -I https://docker.1ms.run/v2/
curl -I https://docker.xuanyuan.me/v2/
curl -I https://docker.m.daocloud.io/v2/

正常会有类似HTTP/2 401 的输出,说明是通的,再指定一个拉镜像,如

sudo docker pull docker.1ms.run/nvidia/cuda:10.1-devel-ubuntu18.04

但发现这个tag不存在

尝试拉一个较新的,可以下载了

sudo docker pull docker.1ms.run/nvidia/cuda:12.4.1-devel-ubuntu22.04

中止下载与清理缓存

如果下载一半需要中止(发现不是自己想要的版本等原因)直接ctrl + c,并清理缓存

sudo docker system prune  或  sudo docker system prune -a   (加-a更彻底)
检查内存
sudo docker system df

查看镜像

docker images

我的树莓派板子 执行后
REPOSITORY是ros
TAG是humble
IMAGE ID是48xxx
CREATED是22 months ago
SIZE是11.6GB

查看容器

docker ps -a

我执行后有两个容器,一个Exited,一个运行中,"tail -f /dev/null"确保退出后不会关闭容器
CONTAINER ID   IMAGE        COMMAND               CREATED         STATUS                       PORTS     NAMES
f8xxx   ros:humble   "/bin/bash"           17 months ago   Exited (130) 17 months ago             objective_dhawan
adxxx   ros:humble   "tail -f /dev/null"   19 months ago   Up 24 minutes                          ArmPiUltra

运行中的容器为ArmPiUltra

进入容器

docker exec -it -u ubuntu -w /home/ubuntu ArmPiUltra /bin/bash

以 ubuntu 用户身份进入 ArmPiUltra 容器的 /home/ubuntu 目录,并打开一个可交互的 bash 终端(当然也可以用zsh终端,最后/bin/bash改/bin/zsh)

然后就可以在容器执行各种操作了,容器的东西都存在镜像里,当然可以将宿主机的目录挂载到容器,使得容器可以操作宿主机的目录。

退出容器

exit

停止容器

方式一:使用容器名称(推荐) docker stop <容器名>

方式二:使用容器 ID(前几位即可) docker stop abc123def456

清理容器

确定不再需要某个容器时

docker rm -f -v <容器名>:彻底铲除某个容器及其产生的“临时数据”(匿名卷)

 VSCode使用Docker

方式一 Docker扩展(我推荐这个,简单)

安装 Docker 插件,点击集装箱图标,[左图] 可以看到已有镜像以及运行中的容器,[中间图] 鼠标右键再点击Attach Visual Studio Code 即可打开新窗口并进入容器中,如 [右图]

退出不停止容器

直接关闭vscode当前窗口

停止容器

扩展页面鼠标右键 再选择stop

或者 命令行停止 docker stop <容器名/ID>

方式二 Dev Containers 扩展

安装Dev Containers 插件,VS Code 会使用.devcontainer/devcontainer.json这个配置基于当前目录的容器配置 重新创建容器

我在容器挂载的宿主机目录 /mnt/hd/tina 创建配置文件.devcontainer/devcontainer.json,这个文件在容器中的目录是/workspace/.devcontainer/devcontainer.json

{
    "name": "ROS2 Dev Container",
    "image": "docker.1ms.run/osrf/ros:humble-desktop-full",  // 使用的 ROS2 镜像
    "workspaceFolder": "/workspace",
    "workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind",
    "customizations": {
        "vscode": {
            "extensions": [
                "ms-python.python",
                "ms-vscode.cpptools"
            ]
        }
    }
}

确保vscode当前窗口打开的根目录对于这个json相对目录是这样的:.devcontainer/devcontainer.json,然后 ctrl+shift+p 输入Reopen in Container回车,即可进入容器,这里sad_hertz是随机生成的名称

退出不停止容器

直接关闭vscode当前窗口

停止并退出容器

F1 然后选择 Dev Containers: Reopen Folder Locally,即可停止退出容器,当前窗口变更为宿主机窗口

将已有容器复刻镜像

背景:宿主USB口,按已有容器humble的启动方式无法享有使用权

sudo docker run -it   --name humble   --network=host   -v /tmp/.X11-unix:/tmp/.X11-unix   -v /mnt/hd/tina:/workspace   -e DISPLAY=${DISPLAY}   docker.1ms.run/osrf/ros:humble-desktop-full   /bin/bash

但容器已经适配了许多环境,想新建容器的时候复用,将容器humble生成镜像humble_ros2_custom

sudo docker commit humble humble_ros2_custom

根据新镜像,再创建一个容器

sudo docker run -it --name humble2 --network=host --privileged -v /dev:/dev -v /tmp/.X11-unix:/tmp/.X11-unix -v /mnt/hd/tina:/workspace -e DISPLAY=${DISPLAY} humble_ros2_custom /bin/bash

挂载路径一样,不冲突的,也是方便路径的复用

更多推荐