是什么,为什么
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。 --来自百度百科
是因为目前的后端在开发和运维阶段确实需要一种虚拟化技术解决开发环境和生产环境环境一致的问题。
0x00 和虚拟机区别
虚拟机是模拟硬件的输入和输出,但是如果宿主机个虚拟机他们的kernel是一直的,就不用做硬件输入输出的搬运工了,只需要做kernel输入输出的搬运工即可。
问:Docker 容器有自己的 kernel 吗
答:没有,docker 和宿主机共享 kernel
问:docker 的 kernel version 由镜像确定还是由宿主机确定
答:由宿主机决定
0x01 大概实现原理
其实就是调用了内核的隔离api,所以需要相应内核版本的支持。 在启动一个容器的时候,它只是调用系统中早已内置的可以隔离资源的方法,而 kernel 支持这些方法,也是在创建进程的方法上做了一层资源隔离的扩展而已。 所以docker启动速度快是因为,本质来说容器和进程差别没有想象中的大,共享了很多代码,流程也差的不多。
docker其实想做的事情就是把资源隔离的接口标准化,严格的说它是所有相似资源隔离的一层抽象和搬运工。
用namespace完成进程和网络的隔离。用虚拟网卡和iptables保证和外界的网络通信。
用cgroups完成CPU、内存等资源的隔离。
用AUFS联合文件系统完成文件方面的隔离。
0x02 基本用法
docker 的用法各大博客上都有说,这里就不再赘述,想说一些nvidia-docker的用法。
nvidia-docker是docker的用法,它包装了一些gpu的函数,使得docker能直接访问主机上的gpu资源。
说一下我用它的时候遇到的一些坑。
首先,docker里面是不需要安装nvidia驱动的。它会直接使用本机的nvidia驱动,这样避免了本机和docker里驱动不一致带来的问题。
然后用法,有两种形式可以启动nvidia-docker
# 第一种
nvidia-docker run xxx
# 第二种
docker run --runtime=nvidia xxx
这两种都是可以的,没有区别。
最后github上docker的项目说,docker19.03就开始支持gpu了,nvidia-docker不再受支持。