# dockerimage
**Repository Path**: uanheng/dockerimage
## Basic Information
- **Project Name**: dockerimage
- **Description**: 3D视觉工坊多传感器融合课程代码
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 21
- **Forks**: 24
- **Created**: 2021-09-06
- **Last Updated**: 2025-08-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## docker 镜像说明
本工程借用了 [fcwu](https://github.com/fcwu/docker-ubuntu-vnc-desktop)编写的工程作为底包,在此基础上添加了 ROS,GTSAM,Ceres-Solver,ProtoBuf等第三方库,kitti2bag,evo工具.
## docker 使用帮助
### 安装 docker
先卸载旧版本(如果没有装可以跳过)
``` bash
sudo apt-get remove docker docker-engine docker.io containerd runc
```
安装前置软件
``` bash
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
```
添加Docker官方GPG密钥
``` bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
```
添加稳定版仓库
``` bash
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
```
安装Docker
``` bash
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
```
使用国内镜像源加速(可选)
docker hub 中国镜像:https://registry.docker-cn.com
网易云docker hub加速:https://hub-mirror.c.163.com
阿里云个人镜像加速(可选中的可选)
查看以下链接[https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors](https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors),如下图:
创建&&打开文件daemon.json
``` bash
sudo gedit /etc/docker/daemon.json
```
将下面的内容复制到里面(**是上面的镜像连接,下面默认给出网易云镜像加速连接,如果有阿里云的可以替换掉**)
``` json
{
"registry-mirrors": ["https://hub-mirror.c.163.com"]
}
```
重启docker
``` bash
sudo systemctl daemon-reload
sudo systemctl restart docker
```
测试是否安装完毕
``` bash
sudo docker run hello-world
```
出现下列输出即可
``` bash
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:df5f5184104426b65967e016ff2ac0bfcd44ad7899ca3bbcf8e44e4461491a9e
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
```
创建docker用户组并添加当前用户到docker用户组
``` bash
sudo groupadd docker
sudo usermod -aG docker ${USER}
sudo systemctl restart docker
```
到这里**docker**就安装完毕了,建议重启一下(其实注销用户在登入也可以),这样再用**docker**的就可以不用加**sudo**权限了
### 生成镜像及容器
将本工程拷贝下来后,使用**cd**命令跳转到目录中.
``` bash
git clone https://gitee.com/uanheng/dockerimage.git && cd dockerimage
```
使用**docker build**命令构建新的容器(**container**),这一过程可能非常长,而且会在命令行输出红色**log**,这里注意,并不是出错了,除非你看到了**error**,在构建容器时**waring**也是输出红色,不必担心.
``` bash
docker build -t rosimage:v1.0 .
```
如下图
完成镜像构建之后,就可以查看镜像ID或者镜像名来构建容器.
这里多说一句,在构建镜像时,由于需要编译ceres,gtsam等优化库,可能会占用大量cpu资源,这里默认是**make -j3**,如果对自己的电脑有信心,也可以改成你**make -j8**及以上.
查看镜像ID及镜像名
``` bash
docker image ls
```
输出
``` bash
REPOSITORY TAG IMAGE ID CREATED SIZE
rosimage v1.0 c6662010012b 4 seconds ago 6.11GB
dorowu/ubuntu-desktop-lxde-vnc bionic 16ac25e8daa0 24 months ago 1.06GB
```
以下两个命令都可以创建容器成功,需要注意,你需要修改**镜像ID**,或**镜像版本号**,以及最重要的**共享文件夹**,并且创建容器时,可能会卡一段时间,不要退出.
(需要配置**共享文件夹**!!!)
(直接复制下面的命令会直接报错,修改**镜像ID**,或**镜像版本号**!!!)
(需要配置**共享文件夹**!!!)
(直接复制下面的命令会直接报错,修改**镜像ID**,或**镜像版本号**!!!)
(需要配置**共享文件夹**!!!)
(直接复制下面的命令会直接报错,修改**镜像ID**,或**镜像版本号**!!!)
(注意,代码中的数据路径默认为 **`/root/workspace/data/`**,如果改动了,需要你手动调整.)
(注意,代码中的数据路径默认为 **`/root/workspace/data/`**,如果改动了,需要你手动调整.)
(注意,代码中的数据路径默认为 **`/root/workspace/data/`**,如果改动了,需要你手动调整.)
``` bash
docker run -p 6080:80 -v /dev/shm:/dev/shm -v /home/uanheng/share:/root/workspace --name="rosimage" c6662010012b
```
或
``` bash
docker run -p 6080:80 -v /dev/shm:/dev/shm -v /home/uanheng/share:/root/workspace --name="rosimage" rosimage:v1.0
```
有如下输出即为成功,构建容器
此时就可以打开浏览器,输入[http://127.0.0.1:6080](http://127.0.0.1:6080).
终端:
到此刻为止,已经成功构建了镜像和容器,刚刚建立容器的窗口输出**ctrl+c**可以退出容器.
现在查看容器
``` bash
docker ps -a
```
可以看到如下输出,说明已经完全成功了.
``` bash
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d1456b0cef5 rosimage:v1.0 "/startup.sh" 7 minutes ago Exited (0) 44 seconds ago rosimage
```
### 关机后如何进入容器
在关机重启后,通过如下命令重新启动和关闭容器.
``` bash
docker start rosimage
```
或使用容器ID(你自己的容器ID)
``` bash
docker start 4d1456b0cef5
```
输出如下
``` bash
rosimage
```
或
``` bash
4d1456b0cef5
```
关闭同理,只要把**start**换成**stop**即可
开启之后,可以在浏览器打开[http://127.0.0.1:6080](http://127.0.0.1:6080)即可.
### 拷贝代码及数据进入共享文件夹
由于opencv在docker里编译较为麻烦,这里使用了讲师提供的编译完成的opencv库,在容器中的`/root/.bashrc`中可以看到
``` bash
export LD_LIBRARY_PATH=/root/opencv/lib:\$LD_LIBRARY_PATH
```
如果大家想用自己的代码去编译,可以将**CMakeLists.txt**代码中的opencv路径改为`/root/opencv/share/OpenCV`
``` cmake
set(OpenCV_DIR "/root/opencv/share/OpenCV")
```
将本工程下**ad_sensor_fusion**文件夹拷贝至刚刚设置的**共享文件夹**目录中,并设置好ros的工作空间,如下面所示
源码来自[https://github.com/Aaronswei/ad_sensor_fusion](https://github.com/Aaronswei/ad_sensor_fusion).
贡献者为讲师飞哥@爱喝苦咖啡的小阿飞,及讲师松哥@帅的丑小鸭.
``` bash
.
├── practice_0_2_point_clouds_icp
│ ├── icp.pcd
│ ├── source.pcd
│ └── target.pcd
├── practice_1_1_multi_camera_sync
│ ├── camera_front_left_60
│ └── camera_front_right_60
├── practice_1_2_camera_imu_sync
│ └── test.bag
├── practice_1_5_camera_radar_spatial_sync_data
│ ├── front_left_right_camera.yml
│ ├── label_left_camera
│ ├── label_right_camera
│ ├── left_camera
│ ├── radar_front_center
│ └── right_camera
├── practice_2_1_stereo_camera_data
│ ├── front_left_right_camera.yml
│ ├── label_left_camera
│ ├── label_right_camera
│ ├── left_camera
│ └── right_camera
├── practice_2_3_camera_lidar
│ ├── 0012
└── practice_2_4_camera_radar_data
├── front_left_right_camera.yml
├── label_left_camera
├── label_right_camera
├── left_camera
├── radar_front_center
└── right_camera
```
同理,将数据下载至上图的data文件夹中.(部分数据需要解压)
数据包:[https://pan.baidu.com/s/1JytE1_6Am35VVBO4gbnrZA](https://pan.baidu.com/s/1JytE1_6Am35VVBO4gbnrZA)
提取码:2333
## 使用 VS Code 编辑代码
在安装了插件之后,我们可以在VS Code的左侧看到所有的容器,如下图
右键对应的容器,可以打开容器,这里我们选择在性窗口打开
(以下依赖关系步骤可以不做,**不影响代码编辑**,下面步骤为函数跳转功能!!!)
(以下依赖关系步骤可以不做,**不影响代码编辑**,下面步骤为函数跳转功能!!!)
(以下依赖关系步骤可以不做,**不影响代码编辑**,下面步骤为函数跳转功能!!!)
使用cmake的参数生成文件依赖关系文件**compile_commands.json**
``` bash
catkin_make -DCMAKE_EXPORT_COMPILE_COMMANDS=Yes .
```
最后将上一步生成的文件指定为工程的配置关系文件,一般在上一步的编译完成后,打开工程里的C/C++源文件一会就会自动询问你是否使用**compile_commands.json**,这时候选择是即可,如果没有的话可以自己新建一个,这样配置之后,就可以右键或F12跳转函数了.
内容如下
``` json
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu11",
"cppStandard": "gnu++98",
"intelliSenseMode": "linux-gcc-x64",
"compileCommands": "${workspaceFolder}/build/compile_commands.json"
}
],
"version": 4
}
```
此外,VS Code可以使用 Ctrl + “~”,打开终端直接进入container的命令行.
## 小技巧和报错方案
按住 **`ctrl`+`shift`+`+`** 可以增加终端的字号,或 **`ctrl`+`shift`+`-`** 可以减小终端的字号.
另外在使用同一个镜像创建多个容器时,由于端口均为6080,所以在浏览器打开第二个novnc时会出现乱码,这里可以通过清除浏览器缓存解决.
在构建时容易出现镜像或容器构建失败的情况:
对于构建镜像失败,需要先删除容器
``` bash
# 查看现有容器
docker ps -a
# 删除失败容器
docker container rm ***(容器名或容器ID)
# 查看现有镜像
docker image ls
# 删除镜像(如果有依赖镜像需要先删除子镜像)
docker image rm ***(一般只有镜像ID,名字是一个none)
```
对于构建容器失败
``` bash
# 查看现有容器
docker ps -a
# 删除失败容器
docker container rm ***(容器名或容器ID)
```