目录
1.ubuntu添加国内镜像源
2.安装docker
3.docker内安装ros
1.ubuntu添加国内镜像源
1.1 打开source.list文件
sudo gedit /etc/apt/sources.list
1.2 添加清华镜像源,复制下列内容到sources.list
文件中,注意是ubuntu18.04
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
1.3 更新apt
sudo apt-get update
2.安装docker
2.1 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
2.2 安装软件包以允许 apt 通过 HTTPS 使用存储库
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
2.3 添加docker的国内源(注意区分镜像源与docker源)
docker的官方源下载比较慢,需要更换为国内源,这里用了腾讯源
2.3.1 添加 Docker 使用的GPG公钥
curl -fsSL https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
2.3.2 添加 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
2.4 安装最新版本的 Docker Engine-Community 和 containerd
sudo apt-get install docker-ce docker-ce-cli containerd.io
2.5 更换docker的镜像源为国内的源(没有此文件会自动创建)
2.5.1 创建(打开)/etc/docker/daemon.json
文件
sudo gedit /etc/docker/daemon.json
2.5.2 复制下列代码到json文件中
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
2.5.3 重启docker
sudo systemctl restart docker
2.6 测试docker是否安装成功
sudo docker run hello-world
需要稍微等待下,会从dockerhub上拉镜像下来
2.7 设置普通用户也可以使用docker命令
2.7.1 添加”docker group“
sudo groupadd docker
(可能已经存在)
2.7.2 将用户添加到docker的group
sudo gpasswd -a ${USER} docker
把${USER}换成你的用户名,比如我的是
sudo gpasswd -a wanghuohuo docker
2.7.3 增加“docker.sock”文件的权限:所有人皆可读写
sudo chmod a+rw /var/run/docker.sock
2.7.4 重启服务
sudo service docker restart
或 sudo /etc/init.d/docker restart
2.7.5 切换当前会话到新 group
newgrp - docker
2.7.6 测试
新开一个终端以普通用户测试docker命令
docker version
3. docker内安装ros-kinetic
3.1 新开一个终端,把ros的官方镜像拉下来
docker pull osrf/ros:kinetic-desktop-full
3.2 下载完后,查看镜像,ros-kinetic的image是3.2个G
docker images
3.3 根据镜像创建容器
docker run -it osrf/ros:kinetic-desktop-full bash
3.4 容器中运行rosocore
roscore
此时已经成功创建ros的容器了,接下来解决docker的GUI问题
4 打开docker中gui界面,如rviz,rqt等
docker中开启GUI原理:
xhost 是用来控制X server访问权限的。通常当你从hostA登陆到hostB上运行hostB上的应用程序时,做为应用程序来说,hostA是client,但是作为图形来说,是在hostA上显示的,需要使用hostA的Xserver,所以hostA是server。因此在登陆到hostB前,需要在hostA上运行xhost +来使其它用户能够访问hostA的Xserver.
总结:docker中显示client通过映射将对Xserver的请求透传到主机端DISPALY,DISPLAY对应主机端的显示接口,主机端也使能接收,完成显示。
xhost + 是使所有用户都能访问Xserver.
xhost + ip使ip上的用户能够访问Xserver.
xhost + nis:user@domain使domain上的nis用户user能够访问
xhost + inet:user@domain使domain上的inet用户能够访问。
4.1 运行xserver
4.1.1 终端输入
xhost +
- 若成功启动,则跳到第4.2继续执行。
- 若显示
xhost: unable to open display
,则说明没有安装vncserver。
4.2 安装vncserver
4.2.1 进入root,确认下vncserver确实没装(我也不明白为什么要进入root,但是照做就行)
su root
vncsever
若提示bash: vncserver: command not found
则需要安装vnc。
4.2.2 退出root(或者重新开一个终端),安装vnc
sudo apt-get install tigervnc-standalone-server tigervnc-viewer
上面命令是我测试没问题的,网上还有其它安装的包
如果上面的命令能安装好vnc,就不用下面这些测试了,直接进入4.2.4
sudo apt-get install x11-xserver-utils
上面这个包系统已经默认装好了,但是仍然不能执行xhost +
sudo apt install xfce4 xfce4-goodies
sudo apt install tightvncserver
上面这个包没有测试过,感觉似乎可以。
sudo apt-get install tigervnc-server
上面这个包没有测试过,感觉似乎也可以。
安装完后就是配置VNC,感觉这个设置挺复杂的,采用了网上最简单的操作方式
4.2.4 安装好vnc后,进入root启动vnc
su root
vncserver
第一次运行会让你输入很多密码,输入就行,一路yes~
4.3 运行turtlesim,测试下docker中的GUI界面
接下来需要启动三个终端,分别是roscore
,turtlesim_node
,turtle_teleop_key
4.3.1 第一个终端——roscore:
①docker命令新建一个容器(带GUI环境变量)
docker run -it \
--env="DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
osrf/ros:kinetic-desktop-full \
/bin/bash
docker run -it \
--env="DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
osrf/ros:melodic-desktop-full \
/bin/bash
命令解释
--env="DISPLAY" :开启显示GUI界面
--env="QT_X11_NO_MITSHM=1" :采用X11的端口1进行显示
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" :映射显示服务节点目录
osrf/ros:kinetic-desktop-full:容器从镜像osrf/ros:kinetic-desktop-full创建
/bin/bash:运行命令bash
②创建完容器后,命令行自动进入了docker,接着运行roscore
source /opt/ros/kinetic/setup.bash
roscore
在创造容器的时候,环境就陪伴着容器,每次进去就会默认加载第一次的环境。
4.3.2 第二个终端——turtlesim_node:
①先查看之前新建的容器名称
docker ps --all
②进入容器中
docker exec -it <container_name> /bin/bash
③运行turtlesim_node
source /opt/ros/kinetic/setup.bash
rosrun turtlesim turtlesim_node
4.3.3 第三个终端——键盘控制:
①进入同一个容器中
docker exec -it <container_name> /bin/bash
source /opt/ros/kinetic/setup.bash
②运行遥控键盘
rosrun turtlesim turtle_teleop_key
此时即可控制小海龟运动
4.3.4 docker容器启动的主次之分
进入docker之前,有一个终端是执行的start或者run命令的,其它终端是执行exec命令进入docker的。前者退出docker会导致整个容器都停止运行,所有会话自动退出。而后者彼此之间不会相互影响。
如本例中,第一个终端退出会导致第二和第三个终端退出,而第二或第三个终端退出,并不会影响其它终端。
4.4 测试gazebo和rviz
rviz和gazebo都能正常打开,但是终端会报错,提示libGL error
4.4.1 rviz
实测报错,缺少一些包,但是可以正常打开
4.4.2 gazebo
实测报错,缺少一些包,但是可以正常打开
4.5 测试catkin_make编译
和上面一样进入到docker容器中,不再赘述,然后建立一个空package,测试编译
①mkdir -p catkin_ws/src
②cd catkin_ws/src
③catkin_create_pkg test rospy roscpp
④cd ..
⑤catkin_make
4.6 测试git(随便找的链接)
git clone https://github.com/octocat/Hello-World
最后,该docker里面没有gedit和Vi
参考:
1 docker安装
https://evilran.me/2021/05/solve-docker-installation-too-slow-on-ubuntu
https://juejin.cn/post/7011154334645747719
2 docker中安装ros
3 如何在Ubuntu 18.04上安装和配置VNC
https://cloud.tencent.com/developer/article/1350304
4 Docker容器运行GUI程序的配置方法
https://www.cnblogs.com/panpanwelcome/p/12877902.html
为什么要新建一个docker的用户组group
https://www.zhangshengrong.com/p/YjNKpbA6XW/