1、为什么要用docker安装
1.1docker是啥
自我理解:如果要运行某一个开源库前需要安装太多的依赖,一个一个安装浪费时间且麻烦,docker将相应的依赖放在一个容器里,类似虚拟机,但是虚拟机会安装一些我不需要的东西。所以docker更轻量,docker里的容器可以随便删除。
1.2docker常用指令
1.2.1首先自行百度安装docker
1.2.2docker常见命令
查看所有正在运行的容器:
docker ps
查看所有容器(包括已停止的):
docker ps -a
创建并启动容器:
docker run -it 镜像名
或者指定容器的名称:
docker run --name my_container -d my_image
这里,-it 表示交互模式运行容器,并分配一个伪终端;--name 用于指定容器的名称;-d 表示在后台运行容器。
停止容器:
docker stop 容器名/容器ID
强制停止容器:
docker kill 容器名/容器ID
启动容器:
docker start 容器名/容器ID
重启容器:
docker restart 容器名/容器ID
删除容器:
docker rm 容器名/容器ID
注意,只能删除已停止的容器。
进入容器:
docker attach 容器ID
或者更常用的:
docker exec -it 容器ID /bin/bash
后者可以在正在运行的容器中启动一个新的shell。
查看所有本地镜像:
docker images
从远程仓库拉取镜像:
docker pull 镜像名
查看容器内部细节:
docker inspect 容器ID
查看容器内运行的进程:
docker top 容器ID
查看容器日志:
bash
docker logs 容器名/容器ID
1.3区分容器和镜像
Docker镜像是容器的模板或基础,而容器则是镜像的运行实例。
- Docker镜像:是一个只读的模板,包含了运行应用程序所需的所有内容,如代码、运行时、库、环境变量和配置文件等。镜像可以被视为一个独立的文件系统,包含了创建和启动容器所需的所有依赖。镜像具有轻量级和高效的特点,基于分层的文件系统构建,使得多个镜像可以共享相同的基础层,从而优化存储和传输效率。
- Docker容器:是由Docker镜像创建的运行实例。容器完全使用沙箱机制,相互隔离,互不影响。容器启动时,Docker引擎会在镜像的基础上创建一个可读写的容器层,并将其与镜像层级联在一起,形成一个新的文件系统作为容器的文件系统。容器中的进程依赖于镜像中的文件,但容器对文件的任何修改都只会在容器层进行,不会影响到原始的镜像文件。
2、如何安装ORBSLAM2
2.1从网上下载好别人的安装脚本(在2.2.3安装运行)
git clone https://github.com/jike5/orbslam2-docker.git
以下为下载好的脚本,写好了注释,不需要自己在终端添加
# UI permisions
#定义一个变量XSOCK,指向主机上的X11 Unix socket位置。这个socket通常用于X11客户端和服务器之间的通信。
XSOCK=/tmp/.X11-unix
#定义一个变量XAUTH,指定一个临时文件,用于存储X11认证信息。
XAUTH=/tmp/.docker.xauth
#创建或更新$XAUTH指向的文件
touch $XAUTH
#使用xauth命令列出当前显示(由$DISPLAY指定)的认证信息,并使用sed命令修改它,然后将修改后的认证信息合并到$XAUTH文件中。这一步是为了让Docker容器能够访问主机的X11服务器。
xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -
#修改X11服务器的访问控制,允许名为docker的本地用户访问。
xhost +local:docker
# docker pull jike5/orbslam2-dev:latest
# Create a new container
#-t表示分配一个伪终端,-d表示在后台运行容器。
#--privileged: 给予容器在主机上几乎全部的权限。
#--net=host: 使容器使用主机的网络栈,这样容器内的应用就可以直接看到和使用主机的网络接口。
#--ipc=host: 允许容器使用主机的IPC(进程间通信)命名空间。
docker run -td --privileged --net=host --ipc=host \
--name="orbslam2" \
#-e "DISPLAY=$DISPLAY": 设置环境变量DISPLAY,这样容器内的应用就知道应该连接到哪个X11显示
-e "DISPLAY=$DISPLAY" \
#-e "QT_X11_NO_MITSHM=1": 设置环境变量,通常用于解决某些Qt应用在Docker容器中与X11服务器通信的问题。
-e "QT_X11_NO_MITSHM=1" \
#-v "/tmp/.X11-unix:/tmp/.X11-unix:rw": 将主机上的X11 Unix socket目录挂载到容器内,允许容器访问。
-v "/tmp/.X11-unix:/tmp/.X11-unix:rw" \
#-e "XAUTHORITY=$XAUTH": 设置环境变量,指向前面创建的X11认证文件。
-e "XAUTHORITY=$XAUTH" \
#: 设置ROS(机器人操作系统)的IP地址为127.0.0.1。
-e ROS_IP=127.0.0.1 \
#为容器添加SYS_PTRACE能力,这通常用于调试。
--cap-add=SYS_PTRACE \
#将当前目录(pwd)下的workspace目录挂载到容器内的/workspace目录。
-v `pwd`/workspace:/workspace \
#使用jike5/orbslam2-dev镜像的最新版本。bash: 在容器内启动一个bash shell。
jike5/orbslam2-dev:latest bash
2.2运行脚本,基于大佬的镜像建立好一个容器
具体安装参考原网站
2.2.1拉取镜像
docker image pull jike5/orbslam2-dev
2.2.2
在主机建立好路径并下载ORBSLAM2
mkdir -p workspace/data
cd workspace
git clone https://github.com/jike5/ORB_SLAM2
2.2.3 运行2.1下载内容里的脚本,你则可以搭建一个容器,并且容器里有你需要要的配置
sudo ./run_container_cpu.sh
2.3在容器内运行大佬写的脚本
2.3.1进入容器
docker ps -a | grep orbslam
# you will find you container ID
docker exec -it orbslam3[or container ID] bash
2.3.2 运行两个容器内的脚本
cd /workspace/ORB_SLAM2
./build.sh
./build_ros.sh
3、测试是否安装成功
我是基于某蓝学院给的第一讲案例进行测试