特别说明:要在个人随笔后写评论的小伙伴们请注意了,个人博客开启了 MathJax 数学公式支持,MathJax 使用
$
标记数学公式的开始和结束。若是某条评论中出现了两个$
,MathJax 会将两个$
之间的内容按照数学公式进行排版,从而致使评论区格式混乱。若是你们的评论中用到了$
,可是又不是为了使用数学公式,就请使用\$
转义一下,谢谢。html
想从头阅读该系列吗?下面是传送门:git
关于 Docker 的介绍,我这里就不废话了。Docker 是什么?Docker 和虚拟机有什么区别?Docker 适用的场景是什么?这些介绍早就烂大街了。你们能够去 Docker 的官网首页看介绍,也能够在博客园的首页随便搜一下,入门级的文章处处都是。若是想了解更深一点的技术细节,能够看 sparkdev 的博客,我这里先对 sparkdev 表示感谢,我这篇随笔中,引用了他的部份内容。并且,我这篇的标题是“我对 Docker 的使用的学习心得”,重点是学习它的使用,而不是它的原理。程序员
在 Ubuntu 中安装 Docker 真的是太方便了。彻底不用访问 Docker 的官网,不须要本身去下载,apt
超级牛力瞬间搞定。稍微须要注意的是,不是安装docker
软件包,而是安装docker.io
软件包。首先,我先用sudo aptitude search docker
命令查看 Ubuntu 的软件源中有哪些和 Docker 有关的包,以下图:
github
其中docker
被明确标记为 transitional package,因此咱们安装下面的docker.io
包,使用sudo aptitude install docker.io
命令。安装完成后,使用sudo docker --version
查看一下,发现是最新的版本,并且是社区版,不是企业版,因此其版本号为 18.06.1-ce。以下图:
docker
只要稍微了解一点 Docker 的人都知道有一个 dockerhub,和咱们经常使用的 github 同样,能够得到别人精心制做并分享的资源。在 github 中,咱们能够找到咱们感兴趣的项目,并把它 clone 到本地。而在 dockerhub 中,这些资源叫 Image,咱们能够把咱们感兴趣的 Image 拉到本地,并以该 Image 为基础,运行一些 Container。编程
关于 Image 和 Container 的概念,我这里再也不废话。我选择了一个 ubuntu,还有一个 spacevim。使用的命令分别为sudo docker pull ubuntu
和sudo docker pull spacevim
。以下图:
json
上面拉取 Image 的操做看似简单,其实经历过失败,主要缘由就是国外的仓库被墙挡住了。解决这个问题的方法,就是设置 Docker 使用中国的 Image 仓库。其设置方法为修改/etc/docker/daemon.json
配置文件,若是没有该文件,就新建一个。将其内容修改成:ubuntu
{ "registry-mirrors":["https://registry.docker-cn.com"] }
而后,使用以下命令重启 Docker 服务:vim
systemctl daemon-reload systemctl restart docker
使用sudo docker image ls
命令能够查看咱们的机器上有哪些 Image,使用sudo docker container ps -a
命令,能够查看咱们的机器上有哪些 Container。在上图中,在咱们拉取镜像以前,它们的显示结果都是空的。sudo docker container ps -a
命令之因此要加上-a
参数,就是为了显示全部的 Container,包括运行的和中止的。bash
拉取完了之后,再使用sudo docker image ls
命令,显示的就再也不是空的了。以下图:
而后,使用sudo docker run -it spacevim/spacevim nvim
命令运行一个容器,启动 SpaceVim,以下图:
在上图中,我分别写了一个 C 语言的文件和一个 Python 语言的文件,同时修改了一下 SpaceVim 本身的配置文件。
SpaceVim 是一个很是优秀的 Vim 整合项目,简单点说,就是经过各类插件把 Vim 打形成一个万能的 IDE,并且它对 NeoVim 支持很是好。确实很漂亮,功能也确实很强大。可是,我系统上用的 Vim 是我本身配的一个很是简洁的 Vim(请看我前面的随笔),若是再在系统上安装 SpaceVim 就不太方便。因此,使用 SpaceVim 官方提供的 Docker Image 就是一个很是方便的选择了。
从上面的截图能够看出,咱们最经常使用的命令就是sudo docker run
命令,它就是以某个 Image 为基础运行一个新的 Container,注意,是新的 Container 哦。也就是说,每执行一次sudo docker run
,就创建一个新的 Container,哪怕它们用的是同一个 Image。若是要启动一个已经存在的 Container 怎么办呢?别担忧,有sudo docker container start
命令。
最经常使用的参数是-i
和-t
,只有这样,咱们才可以和 Container 中的程序进行交互。其次,就是-p
参数,能够把 Container 中的某个端口映射到主机的某个端口,这对网络服务很是重要。还有-v
参数,能够把主机的某个目录映射到 Container 中的某个目录,这样,共享文件就很方便了。
使用 SpaceVim 的 Image 启动一个 Container 后,问题来了。每次启动这个 Container,就自动运行 nvim,进入 SpaceVim 的界面,编辑文件是不成问题,但是这个编辑器界面毕竟不是 Shell 不是吗?咱们其它的管理工做怎么作?
而咱们使用 ubuntu 的 Image 启动 Container 后就很方便了,直接进入 Bash。因此问题来了,在一个 Container 中能够执行多个程序吗?
答案是确定的,那就是sudo docker container exec
命令,以下图:
从上图能够看出,咱们进入 Ubuntu 时,直接和 Shell 进行交互,因此能够很是方便地使用ls
、pwd
等命令,甚至可使用cat /etc/os-release
命令查看系统的版本信息。固然,还可使用apt
安装软件。而要想进入 SpaceVim 所在的容器,就须要使用sudo docker container exec -i spacevim-1.0 bash
命令再启动一个 Shell,这样就可使用ls
命令看到咱们刚才编辑的test.c
和test.py
了。甚至可使用ps
命令查看该容器中运行的进程。
Docker 的官网就别看了,难受。买书呢?费钱!还不必定能找到优秀的。最好的办法就是查看 Docker 的手册页啦。使用sudo dpkg -L docker.io
命令,能够看到系统中安装了好多手册页,以下图:
若是输入man docker
,就是下面这样:
若是输入man docker run
,就是下面这样:
若是想本身写 Dockfile,就输入man Dockfile
。我就不继续截图了。每个手册页均可以从头读到尾,这种流畅的感受是在 Docker 的官网上查看文档体会不到的。
运行一个 Container 后,咱们能够在上面编辑文件、更改配置,还能够按需安装软件。作了不少工做后,咱们能够把这个 Container 打包带走吗?固然能够了,使用sudo docker container commit
命令能够基于一个 Container 再建立一个镜像。而后使用sudo docker push
命令就能够把这个镜像再上传到 dockerhub 上了。固然,这只是理想状态,毕竟有墙的存在,并且 dockerhub 要注册后才能上传镜像。因此上传这个事就不是那么好作啊。
不过不要紧,咱们能够打包用 U 盘带走。sudo docker image save
命令能够把 Image 导出为本地文件。使用 U 盘带走后,使用sudo docker image load
命令能够从这个文件再导入镜像。
其实我关心的是显卡。在个人上上篇随笔中,我写到了使用 CUDA 加速计算,而 CUDA 须要 Nvidia 的显卡支持。若是我要用 Docker 构建一个 CUDA 的开发环境,那就须要我 Docker 中的程序可以访问主机的显卡资源。从理论上讲,这是能够的。毕竟 Docker 不一样于虚拟机,Docker 是和主机共享内核的,而 Nvidia 的驱动,只是一个内核模块。因而,我在使用 Ubuntu 镜像的 Container 中测试了一下。使用lsmod
命令查看内核模块,发现它确实是使用的 Nvidia 的驱动,以下图:
另外,使用sudo aptitude install nvidia-cuda-toolkit
安装 cuda-toolkit,也是能够安装的。所以,证实 Docker 中的程序能够访问主机上的全部硬件资源。使用 Docker 构建咱们本身的开发环境不是梦。
答案是能够。
先来分析一下思路。在 Docker 中运行控制台程序时,咱们须要给程序一个标准输入输出,就能够和程序交互了。在 Docker 中运行 Web 服务时,咱们须要给程序一个 IP 和端口,就能够和服务交互了。GUI 程序须要什么呢?它们须要一个 X Server 的 Display。咱们给它就好了。
DISPLAY的格式是unix:端口
或主机名:端口
,前一种格式表示使用本地的 unix 套接字,后一种表示使用 tcp 套接字。默认状况下,X11的服务端会监听本地的unix:0
端口,而 DISPLAY 的默认值为:0
,这其实是unit:0
的简写。所以若是在 Linux 的控制台启动一个图形程序,它就会出如今当前主机的显示屏幕中。
而 unix 套接字就是一个文件,因此,可使用-v
参数,将主机的 unix 套接字共享到 Container 中,而后,运行在 Container 中的 GUI 程序,就会出如今主机的屏幕上。
其实早在2015年的“Docker全球开发者大会”上,Docker 自家的美女程序员“杰西·弗莱泽尔(Jessie Frazelle)”就展现了一系列黑魔法同样的镜像。这些镜像中的大多数都使用了图形界面。好比,她使用这样的命令docker run -d -v /tmp/.X11-unix:/tmp/.X11-unix jess/libreoffice
在 Docker 中运行了 LibreOffice(这只是举例,真要运行成功还有不少细节须要完善),其中最重要的参数就是-v /tmp/.X11-unix:/tmp/.X11-unix
,也就是把主机的 unix 套接字映射到 Container 中。
OK,关于 Docker,今天就写这么多。我感受我又找到了新世界的大门。
该随笔由京山游侠在2019年03月08日发布于博客园,引用请注明出处,转载或出版请联系博主。QQ邮箱:1841079@qq.com