由于不同的project需要不同版本的环境,比如一个要opencv3, 一个opencv4, 都安装在主机上会很混乱,所以用docker来创建不同的环境。
现在想用的docker功能:
安装
创建一个ubuntu环境
在ubuntu环境中如何安装软件
怎么把安装好软件的环境保存下来,并上传到docker hub, 方便在其他机器上使用,或者系统崩了之后复原
如何一个容器开启多个终端
如何借用主机的显示屏显示docker中的图形化界面
现在一项一项来:
安装:
参照官网:https://docs.docker.com/engine/install/ubuntu/
这篇文章讲得比较详细:https://kalacloud.com/blog/how-to-install-and-use-docker-on-ubuntu/
为了方便设置,再装一个docker-desktop:
https://docs.docker.com/desktop/linux/install/
这个直接下载deb文件,双击文件夹安装即可(用dpkg -i我这里会报缺少依赖错误)
docker安装好后,每次使用docker命令前面都要加上sudo, 很是麻烦,
这时可添加自己的用户名进去,比如我的用户名是new_usr
那么sudo usermod -aG docker new_usr
再用一个su - new_usr
,下次就不需要sudo了
创建一个ubuntu环境:
我们可以拿来主义,直接用别人已经搭好的ubuntu环境
先看看都有什么ubuntu环境
我这里想用一个带opencv3版本的,
所以搜索opencv3
$ docker search opencv3
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
harshjv/opencv3 Dockerized OpenCV3 with Python support, Open… 4 [OK]
wlads/opencv3-contrib-python OpenCV 3.1.0 with Contrib and Python support… 2
tanmaniac/opencv3-cudagl Docker container with CUDA 9, OpenGL, and Op… 2 [OK]
varunagrawal/opencv3 Ubuntu 16.04 + OpenCV3 + Python3 2
stevenli1119/opencv3.4.12_cuda11.0_cudnn8.0 opencv3.4.12_cuda11.0_cudnn8.0 1
evoup/opencv3.3.0 opencv3.3.0 with python2.7 over ubuntu16.04 1 [OK]
lalala/opencv3 1 [OK]
带[OK]的是官方的,我这里选evoup/opencv3.3.0
所以把它拉到本地
docker pull evoup/opencv3.3.0
通过$ docker images
可以看到这个image已经被拉下来了。
注意拉下来的是image(镜像),而我们run一个这样的镜像就是container(容器),一个镜像可以run多个容器。
在ubuntu环境中如何安装软件
和正常ubuntu系统里安装软件一样。
换源方法:
sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
sed -i s@/security.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
apt-get clean
apt-get update
保存安装好的环境,上传到docker hub, 方便系统崩了以后复原
参考:https://kalacloud.com/blog/how-to-install-and-use-docker-on-ubuntu/
docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name
commit之后可以看到新生成的image, 假设ubuntu-ros是新的镜像
要推送镜像,请首先登录 Docker Hub。没有用户名的要先注册一个。
docker login -u docker-registry-username
输入账号对应的密码后,即可登录成功。
Login Succeeded
注意:如果你在 Docker 注册用户名与用于创建镜像的本地用户名不同,要在备注中记录 Docker 用户名:
docker tag kalacloud/ubuntu-nodejs kalacloud/ubuntu-nodejs
然后,我们就可以推送镜像到 Docker hub 上了,命令如下:
docker push docker-registry-username/docker-image-name
如果我们要把ubuntu-nodejs镜像推送到kalacloud的版本库,命令如下:
docker push kalacloud/ubuntu-nodejs
可以打开docker-desktop看到上传的image
如何一个容器打开多个终端:
像ros这种,在一个终端输入了roscore之后,要再打开其他终端才能运行node, 或者想开多个终端进行调试。
如果用docker run, 就会打开一个新的容器,涉及到容器间的通信问题,
如果想进同一个容器,要用docker exec
可通过docker ps
查看当前容器的id, 假设这里container id是7896ef8f403f
docker exec -it 7896ef8f403f /bin/bash
如何借用主机的显示屏显示docker中的图形化界面
docker相当于一个没有显示屏的电脑,那么如何共享主机的画面来显示docker中的图形化界面呢,
比如显示ros中的小海龟。
参考:https://blog.csdn.net/qq_29935433/article/details/106194487?utm_source=app&app_version=5.5.0
只是需要注意一点,血泪的教训,
在主机上做了下面这一步之后,
#允许所有用户,包括docker,访问X11 的显示接口
sudo apt-get install x11-xserver-utils
xhost +
#输出为:access control disabled, clients can connect from any host
一定要新开一个终端打开docker,如果用之前已经打开的终端,环境的配置反映不过去,会出现could not connect to display :0的错误。
docker run -it --net=host -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY --env="QT_X11_NO_MITSHM=1"
如果报无法打开/tmp/.X11-unix
,需要配置file shared的错误,
打开docker-desktop, 点右上角的setting符号,选Resource->File sharing, 然后把/tmp文件夹加进去。
再打开docker,运行rqt, rviz
等,就能显示了。
共享USB
比如我要用一个usb摄像头,连到docker里面的程序,
程序启动时会提示报错,找不到/dev/video这个设备,
这时需要在docker run命令后面加一个选项
--device="/dev/video0"
同时还要加上--privileged
,不然会没有访问摄像头的权限
docker与宿主机间的文件拷贝
宿主机的文件copy到docker:
docker cp <本地文件名> <container id>:<docker中的路径/文件名>
docker中的文件copy到宿主机:
docker cp <container id>:<docker中的路径/文件名> <本地文件名>