当前位置: 首页 > news >正文

以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/driGPU 渲染支持(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参考的教程

http://www.dtcms.com/a/306964.html

相关文章:

  • 力扣刷题日常(7-8)
  • 【Arch-Linux,hyprland】常用配置-已实验成功指令大全(自用)(持续更新)
  • 如何保证数据库的持久性与一致性:从 Linux 磁盘缓存策略到 MySQL 的设计
  • 执业药师证识别技术:医药健康生态中发挥愈发关键的作用
  • 微软:科技领域的创新巨头
  • Sleeping Cup 论坛:连接开发者与创新的桥梁
  • 隧道COVI检测器的用处
  • [SKE]使用OpenSSL库实现AES、SM4、DES、RSA、3DES_EDE和3DES_EEE算法的加解密验证
  • SringBoot入门
  • Linux启动防火墙提示提示 Active: failed (Result: timeout)
  • Golang 指针与引用深度解析:对比 C/C++ 的内存管理哲学
  • Jupyter Notebook安装使用
  • Javascript对象合并
  • Centos7 | 防火墙(firewalld)使用ipset管理ip地址的集合
  • MySQL 读写分离(含示例代码)
  • 新注册企业信息查询“数据大集网”:驱动企业增长的源头活水
  • 10 卷积神经网络
  • LLMs之Agent:GLM-4.5的简介、安装和使用方法、案例应用之详细攻略
  • 51单片机入门:数码管原理介绍及C代码实现
  • 【硬件】元器件选型
  • 【ESP32设备通信】-LAN8720与ESP32集成
  • 订阅区块,部署合约,加载合约
  • Akamai CloudTest before 60 2025.06.02 XXE注入导致文件包含漏洞(CVE-2025-49493)
  • MOEA/DD(多目标进化算法基于分解)简介
  • AAAI‘26 | 聚焦人工智能前沿:西工大李学龙教授荣任赞助主席,论文取号逼近三万,精彩不容错过!
  • Javaweb———HTTP响应头属性讲解
  • Redis实现数据传输简介
  • 【AI落地应用实战】利用 Amazon Bedrock Claude3 打造个性化 AI Character 应用
  • C++反射
  • JVM 性能调优实战:让系统性能 “飞” 起来的核心策略