以ros的docker镜像为例,探讨docker镜像的使用
标题以ros的docker镜像为例,探讨docker镜像的使用(待完善)
1. docker介绍(以ros工程距离)
(1)个人理解:docker就是一个容器,主要的作用就是将环境打包好,方便在迁移板子的时候一行指令导入原来的开发环境。让用户专心代码开发,而不是重复的安装环境。
(2)注意:docker环境的迁移,是需要平台架构一致的情况下,才可以进行对应的迁移,如果架构不同则需要重新搭建环境。举个例子:在x86上面安装的ros的docker镜像,如果切换一台x86电脑进行开发则可以将原有的环境一键加载到新的电脑里面; 如果是在arm架构(jetson、rk等的ubutnu下)开发,只能迁移到新的arm架构的板子上。
2. docker安装
docker安装其实很简单,按照官网教程一步一步安装即可,也可以参考csdn上面的相关连接(放在文末)。
3. docker配置
为什么需要进行配置,是因国内网络访问不到docker hub镜像网站。这个网站上存放着很多官方的docker镜像,方便用户在基础上进行开发。然后用户直接docker pull 镜像名
的时候会出错,所以需要对此进行配置。
配置的原理大致就是需要写入一些国内的镜像源,然后进行docker等服务的重新启动即可。
(1)首先确定自己的可以正常联网
ping www.baidu.com
(2)检查Docker服务状态
systemctl status docker
没问题就ctrl+c退出即可。
(3)创建daemon.json文件
sudo mkdir -p /etc/docker
sudo touch /etc/docker/daemon.json
sudo gedit /etc/docker/daemon.json
上面的命令,依次是创建文件夹,创建json文件,编辑json文件(个人习惯喜欢gedit,如果用的话需要 sudo apt-get install gedit
进行安装,也可以用其他的编辑器)
然后将下面的内容粘贴进去,保存并退出。(下面的链接可能会存在更新,后期可能是需要进行修改的)
{"registry-mirrors" : ["https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc",
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://dockerproxy.com",
"https://gst6rzl9.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"http://mirrors.ustc.edu.cn/",
"https://mirrors.tuna.tsinghua.edu.cn/",
"http://mirrors.sohu.com/"
],"insecure-registries" : ["registry.docker-cn.com","docker.mirrors.ustc.edu.cn"],
"debug": true,
"experimental": false
}
填写好之后,需要对daemon的服务进行重启
sudo systemctl daemon-reload
然后对docker 进行重启
sudo systemctl restart docker
然后看看配置好了吗
docker info
4. ros的docker镜像拉取、查看、进入及配置等操作
(1)镜像拉取
以ros镜像为例,打开docker hub网站搜索ros,并查看对应的指令,以下面的照片为例,输入指令
docker pull ros:melodic
因为经过了上面步骤的配置,这个步骤只要你网络正常正常的情况下都是可以pull成功的。
(2)镜像信息查看
然后运行下面的指令查看所有镜像的相关信息。
docker images
出现如下信息,镜像 tag,id,创建时间和大小等。
其实还有一个指令docker ps
也可以查看镜像的容器的信息,这个是需要镜像运行时查看的,这个后面会用到。
(3)进入镜像
为了方便进入镜像,本文提供一个sh文件,方便进入,再次进入镜像以及相关的配置等
如果是初次进入镜像,使用下面的命令行即可。
docker run -it --rm \--net=host \--privileged \--env="DISPLAY=$DISPLAY" \--env="QT_X11_NO_MITSHM=1" \--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \--device /dev/dri \--device /dev/video0 \--volume="$HOME/ros_ws:/root/ros_ws" \--name ros_melodic_gpu \arm64v8/ros:melodic
参数 | 说明 |
---|---|
--net=host | 使用主机网络,方便 ROS 多节点通信 |
--privileged | 授权容器访问所有硬件设备(例如 USB、CAN) |
--env="DISPLAY=$DISPLAY" | 将主机的 GUI 显示传递给容器 |
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" | X11 的 socket 共享 |
--device /dev/dri | GPU 渲染支持(RK3588 支持 OpenGL) |
--device /dev/video0 | 摄像头(可根据你实际设备更改) |
--volume="$HOME/ros_ws:/root/ros_ws" | 文件挂载,把你的工作区同步进容器中 |
二次进行镜像
docker exec -it ros_melodic_gpu bash
5. 更新docker镜像的操作
为什么需要更新docker镜像的操作呢?是因为随着开发的深入,环境是不断的变化的,这个时候是需要对docker的镜像进行更新的(即将新的环境也打包到镜像内)。
对镜像进行更新,需要保持进入镜像的操作,如果退出了镜像则刚刚安装的环境需要重新进行安装哦!
(1)在保持一个命令行是在镜像内,然后把需要的环境安装好之后。
(2)另开一个命令行窗口docker images
查看当前镜像的大小。
然后使用docker ps
查看镜像的容器的id(此id和docker images显示的id一般是不一样的)。
(3)然后对镜像进行更新
docker commit <容器ID或名字> <新镜像名>:<tag>
6.导出和导入docker等的操作
为什么需要导入和导出,是为了跨设备部署一样的环境
一般重新部署环境有两种方法,方法1:一个是在docker hub(可以自己上传镜像的)上进行拉取镜像,方法2:另一个是docker load -i tar文件(适合不想把镜像开源的个人和企业)。
(2)以第2种方法为例,首先有一个完整的docker镜像,我现在将docker 镜像打包成tar压缩包
docker save -o <保存路径/文件名.tar> <镜像名>:<tag>
然后跨设备环境部署时,在装好docker后的同平台下,我将tar拷贝到主机上,然后运行下面的指令,即可导入此前建好的环境
docker load -i <镜像tar路径>
这样就可以完整对docker进行使用了。
一下是写此博客参考的链接,侵权删。
ubuntu安装docker的csdn教程
ubuntu安装docker 的官网教程
配置docker的daemon.json参考的教程