Docker使用记录——测试LIO_SAM
参考链接
相关概念
获取管理员权限
docker守护进程启动的时候,会默认赋予名字为docker的用户组读写Unix socket的权限,因此只要创建docker用户组,并将当前用户加入到docker用户组中,那么当前用户就有权限访问Unix socket了,进而也就可以执行docker相关命令
sudo groupadd docker #添加docker用户组
sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
newgrp docker #更新用户组
docker ps #测试docker命令是否可以使用sudo正常使用
获取镜像
如果我们本地没有 ubuntu 镜像,我们可以使用 docker pull 命令来载入 ubuntu 镜像:
docker pull ubuntu #默认拉取最新的latest
# docker pull ubuntu:18.04
# docker pull ubuntu:20.04
启动容器
以下命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器:
docker run -itd ubuntu /bin/bash
docker attach e2 #exit退出容器终端,会导致容器的停止
docker restart 5bf #先启动容器
docker exec -it 5bf /bin/bash #exit退出容器终端,不会导致容器的停止,推荐使用
参数说明:
-i: 交互式操作
-t: 终端
ubuntu: ubuntu 镜像。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
要退出终端,直接输入 exit
后台运行
在大部分的场景下,我们希望 docker 的服务是在后台运行的,可以通过 -d 指定容器的运行模式。
docker run -itd --name ubuntu-test ubuntu /bin/bash
更新镜像
在运行的容器内使用 apt-get update 命令进行更新。
在完成操作之后,输入 exit 命令来退出这个容器。
此时 ID 为 e2 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。
各个参数说明:
- -m: 提交的描述信息
- -a: 指定镜像作者
- **e2:**容器 ID
- caohaojie/ubuntu:v1: 指定要创建的目标镜像名
可以使用 docker images 命令来查看我们的新镜像 caohaojie/ubuntu:v1
设置镜像标签
可以使用 docker tag 命令,为镜像添加一个新的标签
docker tag 55a caohaojie/ubuntu:v2
docker tag 镜像ID 用户名称 镜像源名(repository name):新的标签名(tag)
Docker容器图形化界面显示
参考链接
具体操作
- 在本地主机上安装x11界面服务
sudo apt-get install x11-xserver-utils
xhost +
这两句的作用是开放权限,允许所有用户,当然包括docker,访问X11的显示接口
xhost + 每次重新开机,需要在本机操作一次,故选择将xhost + ,加入开机启动脚本——ros开机启动roscore及launch文件_蒋程扬的博客-CSDN博客_ros设置开机自启动roscore
- 在启动docker容器时,添加选项如下
-v /tmp/.x11-unix:/tmp/.x11-unix \ #共享本地unix端口
-e DISPLAY=unix$DISPLAY \ #修改环境变量DISPLAY
-e GDK_SCALE \ #这两个是与显示效果相关的环境变量,实际测试时,不添加这两个环境变量也可以
-e GDK_DPI_SCALE
完整命令
docker run -it -v /tmp/.x11-unix:/tmp/.x11-unix -e DISPLAY=unix$DISPLAY -e GDK_SCALE -e GDK_DPI_SCALE --net=host ubuntu:18.04 /bin/bash
如果不加--net=host
,可能会出现以下问题:
Error: cannot open display: localhost:10.0
cannot open display: unix:0
VS_Code配置
前提:ubuntu已安装好docker,code安装好docker插件
1.点击Docker Help ---->2.点击Edit setting---->3.修改 Docker › Commands: Run Interactive
如下
"docker.commands.runInteractive": "${containerCommand} run --rm -it -v /tmp/.x11-unix:/tmp/.x11-unix -e DISPLAY=unix$DISPLAY -e GDK_SCALE -e GDK_DPI_SCALE --net=host ${exposedPorts} ${tag}"
测试LIO_SAM
- 新建Dockerfile
新建Dockerfile,复制LIO_SAM仓库目录下的Dockerfile的内容,将第5行的内容去掉,修改后如下
FROM osrf/ros:kinetic-desktop-full-xenial
RUN apt-get update \
&& apt-get install -y curl \
&& apt-get update \
&& apt-get install -y ros-kinetic-navigation \
&& apt-get install -y ros-kinetic-robot-localization \
&& apt-get install -y ros-kinetic-robot-state-publisher \
&& rm -rf /var/lib/apt/lists/*
RUN apt-get update \
&& apt install -y software-properties-common \
&& add-apt-repository -y ppa:borglab/gtsam-release-4.0 \
&& apt-get update \
&& apt install -y libgtsam-dev libgtsam-unstable-dev \
&& rm -rf /var/lib/apt/lists/*
SHELL ["/bin/bash", "-c"]
RUN mkdir -p ~/catkin_ws/src \
&& cd ~/catkin_ws/src \
&& git clone https://github.com/TixiaoShan/LIO-SAM.git \
&& cd .. \
&& source /opt/ros/kinetic/setup.bash \
&& catkin_make
RUN echo "source /opt/ros/kinetic/setup.bash" >> /root/.bashrc \
&& echo "source /root/catkin_ws/devel/setup.bash" >> /root/.bashrc
WORKDIR /root/catkin_ws
- docker build-建立镜像
在Dockerfile的当前目录运行如下命令
docker build -t caohaojie/lio_sam:dev .
打开vs code的docker活动栏,能显示出建立完成的镜像
- docker run-启动容器
选中目标镜像,右键点击 Run Interactive 启动容器
- 运行数据集
- 在容器终端启动launch文件
roslaunch lio_sam run.launch
- 在本地终端播放数据集
最终结果如图所示