docker学习
安装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
挂载路径一样,不冲突的,也是方便路径的复用
更多推荐
所有评论(0)