如果你还在寻找一种更简单的方法将应用和服务从开发环境迁移到生产环境,或者从一个服务器环境迁移到另一个,那么,你应该知道Docker。Docker是一种Linux容器解决方案,现在已经广为人知。上周刚刚发布了稳定的用于生产环境的1.0版本。
Docker 1.0中主要的增强功能让其能够满足生产环境需求。Docker现在可以直接连接到主机网络接口,而不像早期版本需要使用内部连接要求。连接后的Docker可以通过主机名称找到同伴。另外,Docker能很好地支持SELinux,为每个容器提供更强大的监控功能以及时间戳记的日志。另外Docker还支持多个终端的注册表镜像,从而提升了冗余和可靠性。
Paul Venezia是国外网站Infoworld的高级特约编辑,目前他在该网站上跟大家分享了Docker的工作原理、命令使用案例以及改进的网络功能。
Docker简介
Docker容器允许在主机服务器之间无缝移动应用和服务。比虚拟机更轻量。另外,Docker还包含了版本控制和镜像管理工具,允许应用和服务在物理服务器、虚拟服务器或云实例之间具备简单的扩展性和弹性。底层主机所需要做的只是运行***版本的Linux内核(3.8版本以上),Linux内核必须支持Docker所依赖的LXC(Linux容器)特征。
例如,你可以创建一个仅仅运行memcached服务或Apache Web服务的Docker容器。该容器应该在标准的Linux基础如Ubuntu或CentOS上创建,和任何Linux系统一样安装和配置所需的服务。
因此,memcached实例可以被复制和运行在虚拟服务器、物理服务器、亚马逊云实例或其他可以运行Docker的地方。你不必担心主机之间的服务依赖关系,也不必关心应用安装、模拟硬件或任何传统虚拟化问题。你只需要启动正确建立的容器。
Docker工作原理
Docker在Linux系统镜像上创建容器。就像其他半虚拟化工具如Virtuozzo等,所有的实例基本上运行在主机系统的内核之上,但锁定在自己的运行时间环境中,与主机环境是隔离的。
当你启动或创建一个Docker容器时,只有容器内的激活进程运行时才能开始活动。如果开启一个daemonized进程,容器会立刻结束运行,因为该进程在前端不是激活状态。如果你在前端开启一个进程,容器能正常运行,直到该进程结束。这和其他的半虚拟化工具不同,其他的半虚拟化工具基本上在相同的主机上建立“正常的”虚拟服务器实例。即使前台进程未激活,这些实例也能正常运行。
Docker可以安装在大多数Linux发行版以及Mac OS X和Windows系统上。但后两者只能使用仿真虚拟机作为主机。
在大多数情况下,在主机上安装Docker运行时间是一个非常简单的过程,只需要多数Linux发行版上正常的安装包管理命令。在Docker网站上,你会发现大多数Linux发行版和云服务,以及Mac和Windows系统的非常完整的安装说明。
安装Docker后,我们可以用一个简单的命令创建一个容器:
- $ sudo docker run -i -t ubuntu /bin/bash
该命令告诉Docker下载***的Ubuntu镜像(如果主机上没有安装),并且在容器内部运行/bin/bash命令。该命令在新容器启动时执行,我们会得到以下提供:
- root@2e002f3eb1b2:/#
这里我们可以做一切你想在全新Linux安装过程中做的事情。我们可以运行apt-get更新、安装并配置新软件、编写脚本并像使用其他Linux服务器实例一样使用容器。除了在从命令行退出时容器会停止运行。如果开始一个Apache进程并从容器提供Web网页,Web服务将会停止。因此,为单个服务创建容器通常是个好主意。你可以在单个容器中运行多个服务,但也许会更具挑战性。
简单的Docker使用案例
Docker是一个命令行工具,它提供了中央“docker”执行过程中所需的所有工具。这使得Docker的操作非常简单。一些例子可以检查运行中的容器的状态:
或检查可用的镜像及其版本的列表:
另一个例子是显示一个镜像的历史:
上面的命令显示了命令行界面操作的方便快捷。你只需要指定镜像ID的前几个字符就可以。你可以看到只需要“d95”就能显示d95238078ab0镜像的所有历史。
你可能会注意到该镜像非常小。这是因为Docker从父镜像建立增量镜像,只存储每个容器的更改。因此,如果你有一个300MB的父镜像,如果你在容器中安装了50MB的额外应用或服务,你的容器和生成镜像可能只有50MB。
你可以用Dockerfiles自动化Docker容器的创建过程。Dockerfiles是含有单个容器性能规范的文件。例如,你可以创建一个Dockerfiles来建立一个Ubuntu容器,在新容器内运行一些命令、安装软件或执行其他任务,然后启动容器。
容器网络
Docker早期版本中的网络基于主机桥接,但是Docker 1.0包含了一种新形式的网络,允许容器直接连接到主机以太网接口。默认情况下,一个容器有一个回路以及一个连接到默认内部桥接的接口,但是如果需要的话也可以配制成直接访问。通常,直接访问比桥接的速度更快。
然而,桥接方法在许多情况下是非常有用的。桥接是通过主机自动创建一个内部网络适配器并为其分配一个主机本身尚未使用的子网。然后,当新的容器连接到这座桥,它们的地址进行自动分配。容器启动时你可以将其连接到主机接口或端口,因此运行Apache的容器可能启动并连接到主机上的TCP端口8080(或随机端口)。通过使用脚本和管理控制,你可以在任何地方启动Docker,连接端口并将其传达到需要使用该服务的应用或服务堆栈的其他部分。
Docker的现实世界
Docker 1.0的发布会吸引更多的眼球。Docker对经验丰富的Linux管理员来说应该有相对较短的学习曲线。
Docker是切实可行的、基本的后端基础设施组件,为Linux管理员和架构师提供大量的工具和功能。有可能不具备指向和点击的界面,但这并不一定是坏事。Docker仍有许多地方要改进(如镜像版本控制和私有注册中心),并且很多地方可以更简化(如网络)。但Docker 1.0版本足以满足你的需求了。