ROS从入门到精通4-1:Docker安装与常用命令总结

目录

  • 0 专栏介绍
  • 1 Docker与机器人应用
  • 2 Docker安装步骤
  • 3 Docker常用命令
    • 3.1 创建与启动容器
    • 3.2 暂停与删除容器
    • 3.3 容器文件拷贝
    • 3.4 构建镜像与上下文

0 专栏介绍

本专栏旨在通过对ROS的系统学习,掌握ROS底层基本分布式原理,并具有机器人建模和应用ROS进行实际项目的开发和调试的工程能力。

🚀详情:《ROS从入门到精通》


1 Docker与机器人应用

Docker是一个开源的容器化平台,用于构建、发布和运行应用程序。它允许开发人员将应用程序及其依赖项打包为一个轻量级、可移植的容器中,并在不同的环境中运行。Docker容器提供了一种隔离机制,使得应用程序能够在相同的硬件上以相同的方式运行,而不需要担心环境依赖问题。此外,Docker还提供了一组工具,用于管理、部署和扩展容器化应用程序。由于Docker的便捷性和灵活性,它已经成为现代应用程序开发和部署的标准之一。

Docker的核心概念包括以下几个方面:

  • 镜像(Image):Docker镜像是一个只读文件,其中包含了应用程序运行所需的所有依赖关系和配置信息。开发人员可以使用Dockerfile文件来定义镜像,然后使用Docker构建工具来生成镜像。

  • 容器(Container):Docker容器是基于镜像创建的可运行实例。容器提供了一个独立的运行环境,可以在其中运行应用程序,并与其他容器和主机操作系统隔离开来。容器在启动时会复制镜像,然后根据镜像中定义的配置信息启动应用程序。

  • 仓库(Repository):Docker仓库用于存储和管理Docker镜像。开发人员可以将自己创建的镜像上传到公共或私有仓库中,以供其他人使用或共享。

  • Dockerfile:Dockerfile是一个文本文件,其中包含了定义Docker镜像的指令。例如,它可以定义镜像的基础操作系统、安装软件包、设置环境变量等。

  • Docker Compose:Docker Compose是一个工具,可以定义和运行多个Docker容器组成的应用程序。使用Docker Compose,开发人员可以轻松地定义和部署复杂的应用程序,而无需手动管理每个容器。

  • Docker Swarm:Docker Swarm是一个原生的Docker集群管理工具,用于在多个Docker主机之间分配和管理容器。使用Docker Swarm,开发人员可以轻松地扩展应用程序,并提高其可用性和可靠性。

在这里插入图片描述

在机器人应用中,Docker具有重要的意义和作用。以下是几个方面:

  • 隔离性:由于机器人应用涉及到许多组件,例如操作系统、软件包、库、驱动程序等,这些组件之间可能存在依赖关系和冲突。使用Docker可以将这些组件打包到一个容器中,使其与其他容器和主机操作系统隔离开来,从而避免了这些依赖关系和冲突。

  • 可移植性:在机器人应用中,通常需要在不同的设备上运行应用程序,例如在不同的机器人、云服务器或本地计算机上运行。使用Docker可以将应用程序及其依赖项打包为一个可移植的容器,在不同的设备上以相同的方式运行,从而提高了应用程序的可移植性和可靠性。

  • 简化部署:机器人应用通常需要部署到多个设备上,例如在不同的机器人、云服务器或本地计算机上运行。使用Docker可以轻松地部署应用程序,并确保每个设备上运行的应用程序都一致。

  • 提高效率:在机器人应用中,通常需要频繁地测试和部署应用程序。使用Docker可以快速创建和销毁容器,从而提高了测试和部署的效率。

2 Docker安装步骤

首先,更新软件包索引,并且安装必要的依赖

sudo apt update
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

由于Docker的官方源下载比较慢,需要更换为国内源,例如腾讯源

  • 添加Docker使用的GPG公钥
    curl -fsSL https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    
  • 添加Docker远程仓库并再次更新软件包索引
    sudo add-apt-repository "deb [arch=amd64] https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
    sudo apt-get update
    

接着安装最新版本的Docker

sudo apt install docker-ce docker-ce-cli containerd.io

更换Docker的镜像源为国内源,否则部署Docker内部应用时安装依赖的速度很慢

sudo gedit /etc/docker/daemon.json

复制以下代码

{"registry-mirrors": ["https://mirror.ccs.tencentyun.com","https://docker.mirrors.ustc.edu.cn"]
}

重启Docker完成安装

sudo systemctl restart docker

测试Docker是否安装成功

sudo docker run hello-world

在这里插入图片描述
安装完成后只有root用户可以使用Docker命令,非root用户会显示拒绝访问

winter@winter:~$ docker imagespermission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/json": dial unix /var/run/docker.sock: connect: permission denied

为了使普通用户也能访问Docker,需要进行用户组配置

  • 添加Docker group
    sudo groupadd docker
    
  • 将当前非root用户添加到Dockergroup
    sudo gpasswd -a ${USER} docker
    
  • 增加docker.sock文件的权限
    sudo chmod a+rw /var/run/docker.sock
    
  • 重启服务
    sudo service docker restart
    
  • 新开一个终端以普通用户测试Docker命令
    winter@winter:~$ docker imagesREPOSITORY    TAG       IMAGE ID       CREATED        SIZE
    hello-world   latest    d2c94e258dcb   8 months ago   13.3kB
    

Docker的版本卸载则采用以下命令

sudo apt remove docker docker-engine docker.io containerd runc

3 Docker常用命令

3.1 创建与启动容器

create命令从Docker镜像创建一个全新的容器,但不会立即运行它

docker create IMAGE[:TAG]

start命令将启动任何已停止的容器

docker start IMAGE[:TAG]

run命令式上述两种命令的结合,用于创建并启动容器

docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]

Docker提供了非常丰富的命令参数

-d, --detach=false         指定容器运行于前台还是后台,默认为false     
-i, --interactive=false   打开STDIN,用于控制台交互    
-t, --tty=false            分配tty设备,该可以支持终端登录,默认为false    
-u, --user=""              指定容器的用户    
-a, --attach=[]            登录容器(必须是以docker run -d启动的容器)  
-w, --workdir=""           指定容器的工作目录   
-c, --cpu-shares=0        设置容器CPU权重,在CPU共享场景使用    
-e, --env=[]               指定环境变量,容器中可以使用该环境变量    
-m, --memory=""            指定容器的内存上限    
-P, --publish-all=false    指定容器暴露的端口    
-p, --publish=[]           指定容器暴露的端口   
-h, --hostname=""          指定容器的主机名    
-v, --volume=[]            给容器挂载存储卷,挂载到容器的某个目录    
--volumes-from=[]          给容器挂载其他容器上的卷,挂载到容器的某个目录  
--cap-add=[]               添加权限    
--cap-drop=[]              删除权限    
--cidfile=""               运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法    
--cpuset=""                设置容器可以使用哪些CPU,此参数可以用来容器独占CPU    
--device=[]                添加主机设备给容器,相当于设备直通    
--dns=[]                   指定容器的dns服务器    
--dns-search=[]            指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件    
--entrypoint=""            覆盖image的入口点    
--env-file=[]              指定环境变量文件,文件格式为每行一个环境变量    
--expose=[]                指定容器暴露的端口,即修改镜像的暴露端口    
--link=[]                  指定容器间的关联,使用其他容器的IP、env等信息    
--lxc-conf=[]              指定容器的配置文件,只有在指定--exec-driver=lxc时使用    
--name=""                  指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字    
--net="bridge"             容器网络设置:  bridge 使用docker daemon指定的网桥       host   //容器使用主机的网络    container:NAME_or_ID >//使用其他容器的网络,共享IP和PORT等网络资源    none 容器使用自己的网络(类似--net=bridge),但是不进行配置   
--privileged=false         指定容器是否为特权容器,特权容器拥有所有的capabilities    
--restart="no"             指定容器停止后的重启策略:  no:容器退出时不重启    on-failure:容器故障退出(返回值非零)时重启   always:容器退出时总是重启    
--rm=false                 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)    
--sig-proxy=true           设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理

在容器启动后,可以在其他终端通过

docker exec -it <container ID> /bin/bash

进入该容器

3.2 暂停与删除容器

使用

docker ps -a

查看所有容器的运行状态,对于不需要使用的容器可以使用

  • 删除
    docker rm <container ID>
    
  • 暂停
    docker stop <container ID>
    
  • 清除所有处于终止状态的容器
    docker container prune
    

对于不需要的镜像则可以使用

docker rmi <image ID>

删除。注意,删除某个镜像前需要删除所有使用该镜像的容器

3.3 容器文件拷贝

主要分为两种

  • 从容器内拷出
    docker cp <container ID>:path_in_container path_out_container
    
  • 从外部拷贝文件到容器内
    docker cp path_out_container <container ID>:path_in_container
    

3.4 构建镜像与上下文

通过Dockerfile来制作镜像

docker build -f ./Dockerfile -t IMAGE:Tag /opt

参数如下

-f		  #指定Dockerfile文件,不指定默认为当前路径的Dockerfile
-t		  #指定新生成的镜像名:Tag
/opt	  #代表构建镜像的上下文,通常使用点(.)表示在当前路径

其工作原理是

  1. 客户端执行build构建命令
  2. 客户端将构建命令后面指定的路径/opt下的所有文件打包发送给Docker服务端,缺省则为当前目录
  3. 服务端收到并解压客户端发送的包,根据Dockerfile里的指令进行镜像的分层构建

这里的/opt称为Docker的上下文路径


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《机器人原理与技术》
  • 《机器学习强基计划》
  • 《计算机视觉教程》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/668608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【文件增量备份系统】前端项目构建

文章目录 创建项目安装项目依赖引入element plus组件下载组件在main.js中使用组件测试 整合路由router下载组件创建路由管理器index.js使用路由App.vue上面使用 <router-view />测试 整合axios下载组件工具类axiosRequest.js工具类使用 创建项目 damwangrunqindeMBP dev…

车载测试中:如何处理 bug

一&#xff1a;Jira 提交 bug 包含那些内容 二&#xff1a;如何处理现上 bug 三&#xff1a;车载相关的 bug 如何定位 四&#xff1a;遇到 bug &#xff0c;复现不出来怎么办 五&#xff1a;bug 的处理流程 一&#xff1a;Jira 提交 bug 包含那些内容二&#xff1a;如何处理现上…

Java设计模式-模板方法模式(14)

行为型模式 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对…

uniapp android和微信小程序如何实现PDF在线预览

Hello大家好&#xff01;我是咕噜铁蛋&#xff0c;UniApp在开发移动应用时提供了跨平台的解决方案&#xff0c;能够同时支持Android和iOS系统&#xff0c;而微信小程序则是一种轻量级的应用形式&#xff0c;可以在微信内直接运行。本文将探讨如何利用UniApp和微信小程序实现PDF…

k8s学习-Kubernetes的网络

Kubernetes作为编排引擎管理着分布在不同节点上的容器和Pod。Pod、Service、外部组件之间需要⼀种可靠的方找到彼此并进行通信&#xff0c;Kubernetes网络则负责提供这个保障。 1.1 Kubernetes网络模型 Container-to-Container的网络 当Pod被调度到某个节点&#xff0c;Pod中…

java数组学习

目录 1.数组概念 2.数组的定义 3.数组的静态初始化 4.地址值 5.数组元素访问 6.索引 7.数组的遍历 8.数组的动态初始化 9.数组两种初始化方式的区别 10.数组常见问题 1.数组概念 数组是一种容器&#xff0c;可以同来存储同种数据类型的多个值。但是数组容器在存储数据…

Redis核心技术与实战【学习笔记】 - 24.Redis 脑裂

简述 所谓脑裂&#xff0c;就是指在主从集群中&#xff0c;同时有两个主节点&#xff0c;它们都能接收写请求。而脑裂最直接的影响就是客户端不知道该往哪个主节点写入数据&#xff0c;结果就是不同的客户端会往不同的主机诶点上写入数据。而且&#xff0c;严重的话&#xff0…

从零开始手写mmo游戏从框架到爆炸(三)— 服务启动接口与网络事件监听器

上一章我们完成了netty服务启动的相关抽象&#xff08;https://blog.csdn.net/money9sun/article/details/136025471&#xff09;&#xff0c;这一章我们再新增一个全局的服务启动类&#xff0c;方便后续扩展。 服务启动 新增的两个类如下&#xff1a; 定义一个接口IServer …

Elasticsearch:使用 Inference API 进行语义搜索

在我之前的文章 “Elastic Search 8.12&#xff1a;让 Lucene 更快&#xff0c;让开发人员更快”&#xff0c;我有提到 Inference API。这些功能的核心部分始终是灵活的第三方模型管理&#xff0c;使客户能够利用当今市场上下载最多的向量数据库及其选择的转换器模型。在今天的…

框架学习Maven

声明&#xff1a;本文来源于黑马程序员PDF讲义 做为一名Java开发工程师&#xff0c;后端 Web开发技术是我们学习的重点&#xff0c;后端Web开发技术的学习&#xff0c;我们会先学习Java项目的构建工具&#xff1a;Maven 初识Maven Maven是Apache旗下的一个开源项目&#xff…

Verilog实现2进制码与BCD码的互相转换

1、什么是BCD码&#xff1f; BCD码是一种2进制的数字编码形式&#xff0c;用4位2进制数来表示1位10进制中的0~9这10个数。这种编码技术&#xff0c;最常用于会计系统的设计里&#xff0c;因为会计制度经常需要对很长的数字做准确的计算。相对于一般的浮点式记数法&#xff0c;…

2019年江苏省职教高考计算机技能考试——一道程序改错题的分析

题目&#xff1a;函数将str字符串中的5个数字字符串转换为整数&#xff0c;并保存在二维数组m的最后一行&#xff0c;各元素为3、-4、16、18、6。并经函数move处理后&#xff0c;运行结果如下&#xff1a; 18 6 3 -4 16 16 18 6 3 -4 -4 16 …

香港倾斜模型3DTiles数据漫游

谷歌地球全香港地区倾斜摄影数据&#xff0c;通过工具转换成3DTiles格式&#xff0c;将这份数据完美加载到三维数字地球Cesium上进行完美呈现&#xff0c;打造香港地区三维倾斜数据覆盖&#xff0c;完美呈现香港城市壮美以及维多利亚港繁荣景象。再由12.5米高分辨率地形数据&am…

【开源】JAVA+Vue+SpringBoot实现二手车交易系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 二手车档案管理模块2.3 车辆预约管理模块2.4 车辆预定管理模块2.5 车辆留言板管理模块2.6 车辆资讯管理模块 三、系统设计3.1 E-R图设计3.2 可行性分析3.2.1 技术可行性分析3.2.2 操作可行性3.2.3 经济…

02.05

1.单链表 main #include "1list_head.h" int main(int argc, const char *argv[]) { //创建链表之前链表为空Linklist headNULL;int n;datatype element;printf("please enter n:");scanf("%d",&n);for(int i0;i<n;i){printf("ple…

IDEA新建文件夹后右击不能创建class类排错方法

目录 1 查看自身文件名是否为关键词 2 查看是否被“蓝色文件夹”给包含了 3 检查设置那边的class模板 4 报错解决 1 查看自身文件名是否为关键词 如下使用了 Java中的关键词"class"所以才无法创建包 ---------------------------------------------------------…

量化交易学习4(投资组合基本认识)

1 如何衡量投资组合的收益率 1.1 投资组合收益率的计算方法 1.2 投资组合的绝对收益率和相对收益率 2 如何衡量投资组合的风险 2.1 风险的定义 风险是指在未来可能发生的不确定性事件所带来的潜在损失。 在投资领域中&#xff0c;风险通常指投资所面临的不确定性和潜在的损失…

自学Python第二十二天- Django框架(六) django的实用插件:cron、APScheduler

django-crontab 和 django-cron 有时候需要django在后台不断的执行一个任务&#xff0c;简单的可以通过中间件来实现&#xff0c;但是中间件是根据请求触发的。如果需要定时执行任务&#xff0c;则需要使用到一些插件。 django-crontab 和 django-cron 是常用的用于处理定时任…

群晖NAS开启FTP服务结合内网穿透实现公网远程访问本地服务

⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 文章目录 ⛳️ 推荐1. 群晖安装Cpolar2. 创建FTP公网地址3. 开启群晖FTP服务4. 群晖FTP远程连接5. 固定FTP公网地址6. 固定FTP…

【优先级队列(大顶堆 小顶堆)】【遍历哈希表键值对】Leetcode 347 前K个高频元素

【优先级队列&#xff08;大顶堆 小顶堆&#xff09;】【排序】Leetcode 347 前K个高频元素 1.不同排序法归纳2.大顶堆和小顶堆3.PriorityQueue操作4.PriorityQueue的升序&#xff08;默认&#xff09;与降序5.问题解决&#xff1a;找前K个最大的元素 &#xff1a;踢走最小的&…