进入组后需要使用到docker,作为一个对docker一无所知的人,将陆续使用到一些docker的一些功能,先将之前使用到的一些东西写在这里,后续遇到再陆续更新。
docker中文社区:http://www.docker.org.cn
这个中文社区有一些入门的东西,但是我刚开始使用的时候并没有怎么看懂😂,原谅我的智商,因为我最开始只是纠结怎么装docker,后来装好之后随着开始使用,才可以在中文社区找到对应的东西,进入到半懂状态。下面先从安装开始介绍。
Docker 的安装及使用
docker 是一个类似虚拟机却又不同于虚拟机的东西,它比虚拟机来说占用系统资源要少得多,此外我们在配一些软件环境的时候,如果不想影响到主系统,或者配环境遇到问题可以使用docker,docker可以创建容器,容器内可以理解为一个小的实例系统,当然这个只是为了能够对docker又一个初步概念而简单的描述。。docker功能更多,描述的可能不太对,只是给一个初步的印象。
Docker 的安装
- 首先确认系统内核信息,docker需要系统内核版本在3.10以上使用如下命令
$ uname -a
- 然后操作系统默认有docker的源,安装docker。这个需要sudo权限,服务器上没有权限求助于管理员进行安装
$ sudo apt-get install -y docker.io
- 将docker加入到开机启动项中,并启动docker服务
$ chkconfig docker on # 加入开机启动
$ service docker start # 启动docker服务
- 确认安装docker版本信息
$ docker version
- 查看是否安装成功,运行hello-world,运行此命令后docker会从本地找hello-world镜像,如果找不到就会从远程pull,下载镜像
docker run hello-world
Docker的使用
- docker 查找镜像,docker的方便之处在配一个环境之后可以生成一个镜像文件,docker可以通过镜像构建多个实例容器,每个容器互不干涉,且容器都具有相应环境配置,例如
$ docker search ubuntu
我们就可找到许多ubuntu镜像的列表
- docker下载镜像,需要哪个下那个
$ docker pull [name]
- docker 新建容器,这里需要注意选取的参数
$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
$ docker run -i -t ubuntu /bin/bash #示例
- docker 查看容器
$ docker ps # 列出当前所有正在运行的container
$ docker ps -l # 列出最近一次启动的container
$ docker ps -a # 列出所有的container(包含历史,即运行过的container)
$ docker ps -q # 列出最近一次运行的container ID
- 启动容器
$ docker ps -a # 查看容器列表
$ docker start [NAME] # 启动容器
$ docker attach [NAME] # 进入容器
- 文件挂载
$ docker -v # 查看容器列表
高级
如何在docker容器中启动GUI程序,通过docker的前期使用我们知道docker一般在新建一个可交互容器后返回的是一个可以用的shell,但是容器往往没有图形化界面,尤其是当我们需要跑一些有GUI操作程序的时候,比如Autoware这个可视化操作平台,这就需要我们进行一些必要的配置。
之前我提到过如何使用xing+putty 或者ssh -X命令访问远程Linux服务器的那篇文章,其实基本思想一样,目前Unix/Linux比较主流的图形界面服务是X11,而X11服务的图形显示方式实际上是一种Client/Server模式,在服务端和客户端之间,X11通过『DISPLAY』环境变量来指定将图形显示到何处。如下面的流程所示,请注意服务端与客户端的位置,服务端是用于提供显示信息的。
对于docker来说,本机就是服务端,容器是客户端,本机提供显示服务。下面是具体步骤
Linux本机 + docker
因为我是登陆的远程服务器,如果采用ssh登陆的话,要想访问远程服务器的docker容器的GUI界面,因为数据走向不同,配置也不同,当前的配置是我用远程桌面的方式登陆的Linux服务器。因此,配置和本机加docker是一样的,具体步骤如下所示:
- docker的强大在与他可以创建容器,在使用docker run新建容器命令的时候,不同的参数可以指定容器的网络服务,容器的X11服务等和主机的映射关系
$ docker run -i -t \
-v /etc/localtime:/etc/localtime:ro \。# 既然涉及时间,感觉不能删除,没试验过
-v /tmp/.X11-unix:/tmp/.X11-unix \。# 不能删除
-e DISPLAY=unix$DISPLAY \
-v $HOME/slides:/root/slides \ # -v挂载文件夹用,可以根据需要删除修改
-e GDK_SCALE \
-e GDK_DPI_SCALE \
--name test \
mirror
如上命令我们建立了一个可交互式的名字为test,使用镜像为mirror的容器,这个容器指定了DISPLAY为主机的执行X11服务的端口前面加上unix,这个组成了容器的监听X11服务的端口(命令可以不分行)
- 之后开放X11服务给所有用户,在主机上执行命令
$ sudo apt-get install x11-xserver-utils
$ xhost+
之后是我遇到的坑
执行过xhost + 命令之后会报错,显示无法打开DISPLAY的端口,其实很简单,因为我们的DISPLAY环境变量并不是我们真正做过映射的执行x11服务的端口,打开一个没有进行服务的空的端口,就会导致报错-
解决方法如下:
- 容器内部:
$ echo $DISPLAY
- 显示如下
$ unix:13.0
- 主机修改DISPLAY环境变量为:13.0,数值随容器里的变化,并开放x11服务给所有用户
$ export DISPLAY=":13.0" $ xhost +
之后容器内的GUI应用完美运行。。。
关于docker显示GUI的几点补充
因为有其他事情,有一段时间没有去管docker的autoware容器,时隔接近一个月打开原来的容器,发现GUI界面无法显示,非常坑爹,我按照我上面的教程新建容器,发现了几个坑,首先上述新建容器的一大串命令,容器的DISPLAY和主机一样就好
docker run -v
这个命令是用来做挂载文件用的,后面的路径我自己计算机并不存在,所以我给删掉了,大家可以根据自己需要去设置自己的,就像虚拟机的共享文件夹一样,更加详细的教程参见。
我重新新建容器,按原来写的教程没有弹出GUI界面,但是命令行也没有报错,我不太清楚是步骤有误还是我本机的某些服务有问题,毕竟在公共服务器,虽然是私人账号,会不会有的东西影响到也不好说
调了很多东西,包括重启了很多服务,最后还删了这一行“挂载文件夹”没有意义的参数,然后就成功了,我感觉应该还在DISPLAY和其涉及的服务身上,实在不行多试几次,大体步骤无误。
其他的具体细节比如远程ssh连接运行服务器的docker容器的GUI程序
将在后续补充……