Docker实战指南(一):Docker介绍

Introduction

我第一次注意到Docker大概是在2014年的时候,当时对Docker的第一印象就是,哇靠,这不就是LXC + cgroups吗,新瓶装旧酒又拿来卖了?这都行?
直到2015年6月,在各大IT巨头的推动下,Open Container Initiative(OCI)成立,并制定了Open Container的第一版接口的标准规范,Docker正式的成为了Container技术的龙头。
本系列文章将循序渐进的带您深入到Docker的方方面面中,让您体会到Docker相比传统的LXC技术的优势所在,以及如何将这些优势收为己用。

Docker的前世今生

简单来说,Docker就是一个应用程序,一个后台守护进程而已。从技术本质上来讲,Docker基于Linux Namespace技术,但又不仅仅是Namespace那么简单,否则的话LXC同样可以火起来。
Docker提供了很多新工具/概念,如沙箱环境(sandbox environment),命令行工具(command-line tool),镜像管理(image management)等等。这些额外的工具让Docker变得易于使用,在众多Container技术中脱颖而出。
Docker的出现改变了软件开发和软件运营的方式,从架构到开发和测试,再到交付以及上线,依靠Docker,这一系列的流程都得到了简化,大大加快了工程上线的开发速度,降低了企业的成本。
同时,Docker有了自己的生态圈,众多公司,包括Google, Microsoft, Intel, IBM, VMware这些巨头,都聚在一起推动Docker发展。Google推出了基于Docker的云服务,Microsoft也推出了基于Windows的Docker支持,AWS也可以托管Docker镜像。Docker逐渐发展为虚拟化技术(Virtualization)云计算(Cloud Computing)中的新宠。

Docker vs Virtualization

Docker并不是虚拟化(Virtualization)技术。虽然和虚拟化一样,提供了隔离(isolation)的能力,但是对比虚拟化技术,docker并没有使用硬件虚拟化(hardware virtualization)技术,而仅仅是用户态的一个进程而已。用户的应用程序作为一个Linux的用户态进程,运行在Docker的容器(container)中。
而做到这些的便是Docker采用的以下八个技术:

  • PID namespace:进程的命名空间,不同的container内部的进程拥有独立的PID。
  • UTS namespace:主机名命名空间,不同的container内部可以拥有不同的主机名。
  • MNT namespace:文件系统命名空间,不同的container内部可以拥有不同的文件系统。
  • IPC namespace:进程间通信命名空间,不同的container内部可以拥有不同的进程间通信空间,如各自独立的共享内存。
  • NET namespace:网络命名空间,不同的container内部可以有不同的网络连接访问方式。
  • USR namespace:用户命名空间,不同的container内部可以有不同的用户。
  • chroot():不同的container可以有不同的root目录。
  • cgroups:不同的container可以有各自受保护的资源。

上面的八个技术构成了Docker的运行时(runtime)所需的技术。

为什么使用Docker

简单来说,可以让软件开发流程变得快速简单,尤其是在环境的配置上面。
相信大家都有这样的噩梦,每次要开发新软件或者换环境的时候,需要安装配置一大堆的依赖。虽然有yum或者apt这类的包管理软件帮忙,但是如果出现的包冲突,或者找不到包的情况,或者需要源码编译却缺失依赖,这种环境部署简直就是噩梦。
Docker就是解决上述噩梦的利器。
此外,Docker也是解决跨平台部署的利器。你可以在你的MacOS, Windows, Linux上安装Docker,然后下载你所需要的Docker镜像(image)进行程序开发。当你的程序需要发布的时候,仅仅需要将你的Docker镜像打包发布,不再需要搭建新环境。

Hello World!

也许看完上述介绍大家还是云里雾里,没关系,既然叫实战指南,那么必然有实战部分,我们从最简单的Hello World程序开始。
首先下载Docker安装环境:https://docs.docker.com/engine/installation/
里面有Linux版的,Windows版的,MacOS版的,Cloud版的,选择适合你的就好。
当安装好之后,在命令行中运行:

docker run dockerinaction/hello_world

如果失败,那么需要使用root权限来操作,Windows的话请采用管理员(administrator)权限。
一切就绪后,你应该可以看到一句:

hello world

至此,第一个Hello World程序成功运行。
中间发生了什么?这个命令完成了下面一系列的操作:

  1. Docker检查是否有所需的镜像,如果没有,那么尝试去Docker Hub下载所需镜像。
  2. 安装所需镜像。
  3. Docker创建一个容器,并加载镜像,运行镜像中的Hello World程序。

至于这个程序是什么,答案很简单:

echo "hello world"

Summary

我们简单的介绍了Docker的前世今生,采用的技术,以及使用的场景,最后用一个简单的Hello World程序来进行实战。
后续我们将介绍,如果利用Docker运行你自己的程序。

(本文出自csprojectedu.com,转载请注明出处)