Linux与生俱来的局限性是可执行文件与库之间的兼容性问题,因为每一个Linux发行版本都有自己固有的包系统。 Docker将应用程序或服务中的可执行状态的组合用容器捆绑在一起,再通过网络共享,使用Docker可以帮助Linux使用开发者和管理者大大缩短在系统构建与管理上所浪费的时间。与Github类似,用户也可以基于Docker Hub中的镜像创建并分享自己的镜像。
Docker提供专门创建并部署镜像的功能,如同Git中管理代码一样,Docker也提供了镜像版本管理的功能。Docker也提供镜像上传和下载功能,Docker还提供了多种API,帮助用户轻松实现自动化部署。
docker 究竟是什么?docker 是一个基于LXC (linux containers)的高级容器引擎。听起来是不是不知道在说什么?简单地说,docker 是一个轻量级的虚拟解决方案,或者说 —— 一个超轻量级的虚拟机。你一定理解虚拟机是什么,那么,你现在可以认为 docker 是一个秒级启动的虚拟机,可以轻易创建和删除,就这一点,是不是酷毙了。
我们会经常看到这个 docker 的图,它告诉我们,docker 是一种集装箱式的工作方式。正如我们会将各种不同的货物统一打包成一个个集装箱,进行标准的管理和运输,在 docker 的世界里,我们把应用和应用所依赖的运行环境打包成一个个 image,然后分发到任意支持 docker 的平台,就可以在这些平台运行我们的应用,提供服务。
那支持 docker 的平台有哪些?因为 docker 是基于 linux 的,在任意的 linux 发行版我们都可以原生地支持 docker,只要对应的内核版本大于 3.10 并且是 64bit,而在 Windows 和 Mac 中,我们可以通过 boot2docker 来运行 docker,这几乎意味着,所有的主流平台都支持 docker 的运行 —— 从此你不再需要为跨平台而苦恼。
当我们在一台 Linux 主机上安装完 Docker 之后,
我们的机器中就包含了本地主机和 Docker 主机。
如果从网络层来划分,本地主机就代表你的电脑,而 Docker 主机就代表你运行的容器。
在一个典型的 Linux 主机上安装 Docker 客户端,运行 Docker daemon ,并且在本地主机上直接运行一些容器。这就意味着你可以为 Docker 容器指定本地主机端口,例如 localhost:8000 或者 0.0.0.0:8376。
与虚拟化相比,Docker是一种更轻量化的方式,使用Docker不需要安装客户OS, Docker镜像只隔离并安装服务器运行所需要的程序与库,与主机共享OS资源,这样就大大减小了镜像的体积。
Docker没有硬件虚拟化层,与虚拟机相比,其在内存访问、文件系统、网络速度上明显快很多。
说起虚拟化,与 VM 的比较是离不开的,我们可以看看这张图:
vm 的理念是在宿主的系统之上,自己虚拟了一个硬件平台,然后运行一个不同的 OS。这意味着它要求很多的资源,在一台机器上,你最多就跑几个虚拟机吧。
而 docker 是依托于宿主机提供的内核,仅仅把一个不同的 linux 发行版本所需的特性打包成一个 image, 这样子当你运行一个 ubuntu 镜像,你会感觉就是在一个 ubuntu 的操作环境里,但实际调用的系统接口都是来源于宿主机。所以当运行一些内核相关的命令时,你就会发现一些端倪,比如 uname -a, 这时给出的信息肯定是宿主机的。
因为共用宿主机的内核,所以 docker 所需的资源也很少,性能开销很小,通常可以在秒内启动,有些已经可以做到毫秒内启动了。在一台机器上,你完全可能做到同时运行上千个 docker 的容器。
Docker设计理念
docker 的运行方式也让我们对 VM 的理念产生质疑,假如我们需要虚拟一个不同的运行环境,是否需要一个完全新的系统?其实我们要的只是运行一个应用所需的依赖环境,不是吗?
总的来说,docker 抛弃传统 VM 试图模拟完整机器的思路,本着“面向应用”的核心理念,以应用为单元进行”集装封箱”。
LXC 是什么?LXC 就是 Linux Container,官网。 LXC 也是一种轻量的虚拟技术,Linux 原生支持的容器。可以说 docker 就是基于 LXC 发展起来的,提供 LXC 的高级封装,发展标准的配置方法。
LXC 的定位是替代传统的虚拟机,侧重于提供一个个操作系统,如 Ubuntu、Debian等。Docker 是面向应用的,官方提倡一个容器即是一个应用,以应用为中心。所以,docker 还提供了统一的打包部署方案,即 Dockerfile, 还有版本控制,image 复用,远程仓库以供镜像共享等。
可以说,LXC 只是 Docker 的底层技术之一,而 Docker 已经在此之上发展出了一个生态系统,如果有另一种容器虚拟技术的话,也许 LXC 也只是配置文件里的 option 选项,libContainer 项目就是在做这样的事情。
Docker就是一个面向应用的容器,用来把程序的运行环境打包,构建统一的运行环境,从而能够在不同的平台同样使用我们针对这套应用所拥有的环境。
看到这里,你应该对 docker 在解决的问题有一些模糊的概念,我们不妨总结一下Docker 在解决什么问题:
也许以后 docker 成为了新的软件管理模式,我们不会再看到开发人员为每个不同发行版本编写配置文件,处理复杂的系统依赖。无论我们需要什么服务,我们只需要安装 docker,然后 pull 一个镜像到本地就可以了。事实上,我们已经开始看到这种趋势了,毕竟 docker 作为开发和测试来说都太方便了。
Install Docker 18.3
sudo apt-get remove docker docker-engine docker.io
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
//add gpg-key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
// set up the stable repository
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
//查看可安装的版本
apt-cache madison docker-ce
sudo apt-get install docker-ce
sudo apt-get install docker-ce=
ubuntu docker 的安装与配置http://www.widuu.com/chinese_docker/installation/ubuntu.html
docker --version
docker info
docker run hello-world
docker image ls
docker images
docker container ls --all
https://github.com/NVIDIA/nvidia-docker
容器将应用程序封装到隔离的虚拟环境中,以简化数据中心的部署。通过将所有应用程序依赖项 (例如二进制文件和库) 都包括在内,应用程序容器能在任何数据中心环境中无缝地运行。
Docker 是领先的容器平台,它现在可用于容器化 GPU 加速的应用程序。这意味着无需进行任何修改即可轻松容器化和隔离加速的应用程序,并将其部署到任何受支持的、可使用 GPU 的基础架构上。 管理和监控加速的数据中心将变得空前容易。
- 可以将旧的加速计算应用程序容器化,并部署在较新的系统、内部环境或云中。
- 可以将特定的 GPU 资源分配给容器,以获得更好的隔离效果和性能。
- 可以轻松地跨不同的环境共享应用程序、协同工作和测试应用程序
nvidia-docker 设计理念
Docker® containers are often used to seamlessly deploy CPU-based applications on multiple machines. With this use case, containers are both hardware-agnostic and platform-agnostic. This is obviously not the case when using NVIDIA GPUs since it is using specialized hardware and it requires the installation of the NVIDIA driver. As a result, Docker Engine does not natively support NVIDIA GPUs with containers.
To solve this problem, one of the early solutions that emerged was to fully reinstall the NVIDIA driver inside the container and then pass the character devices corresponding to the NVIDIA GPUs (e.g. /dev/nvidia0) when starting the container. However, this solution was brittle: the version of the host driver had to exactly match driver version installed in the container. The Docker images could not be shared and had to be built locally on each machine, defeating one of the main advantages of Docker.
To make the Docker images portable while still leveraging NVIDIA GPUs, the container images must be agnostic(不可知)of the NVIDIA driver. This repository provides utilities to enable GPU support inside the container runtime. 这样只要你的电脑安装了NVIDIA显卡驱动,不管你的电脑装的什么显卡,在不同的平台和数据中心,只要使用这个容器,都能达到同样的效果。
## Install the nvidia-docker2 package
## reload the Docker daemon configuration
sudo apt-get install nvidia-docker2
sudo pkill -SIGHUP dockerd
https://ngc.nvidia.com/
docker login nvcr.io
Username: $oauthtoken
Password: k7cqFTUvKKdiwGsPnWnyQFYGnlAlsCIRmlP67Qxa
docker pull nvcr.io/nvidia/caffe2:17.10
nvidia-docker run -it --rm –v local_dir:container_dir nvcr.io/nvidia/caffe2:
nvic.io/nvidia 表示 NVIDIA container registry/registry space
后面是container
-it 表示可以以 interactice 方式运行容器
--rm 当运行完成,delete container
-v 挂载文件 一般使用docker,会让docker的数据存在本地,所以需要本地和docker建立一个链接
-v local-dir:container-dir
CUDA Toolkit Container
所有的NGC Container images 都是基于CUDA platform (nvcr.io/nvidia/cuda)
The toolkit includes GPU-accelerated libraries, debugging and optimization tools, a C/C++ compiler and a runtime library to deploy your application.
使用 NVIDIA-Docker 搭建Digits环境
$ mkdir /home/username/data
$ mkdir /home/username/digits-jobs
nvidia-docker run --name digits -d -p 8888:5000 \
-v /home/username/data:/data:ro
-v /home/username/digits-jobs:/workspace/jobs nvcr.io/nvidia/digits:18.05
打开 http://localhost:8888
https://docs.nvidia.com/ngc/ngc-user-guide/index.html
https://blog.csdn.net/jcjc918/article/details/46486655
https://www.nvidia.cn/object/docker-container-cn.html
NVIDIA-docker https://github.com/NVIDIA/nvidia-docker/wiki/Installation-(version-2.0)#prerequisites
docker学习论坛 http://www.docker.org.cn/
docker-doc https://docs.docker.com/get-started/part2/#pull-and-run-the-image-from-the-remote-repository