Docker:the container engine

Docker

An open platform for distributed applications for developers and sysadmins

给开发人员和系统管理员提供的分布式应用开放平台。


我们来看看程序员在搭建开发环境时遇到的一些问题:

  1. 重复操作:同一个软件在不同的环境得分别安装和配置一次。
  2. 隔离性差:例如同一个 Mysql 如果权限管理不好很有可能误删别人的数据、不同的开发人员如果在同一台主机环境下共享开发,虽然是用户隔离,但端口如果不规范可能会冲突(我们现在貌似全是 root,更容易出问题);
  3. 可移植性差:例如和生产环境不一致、开发人员之间也无法共享、更严重的情况是当有新人入职时,通常需要又折腾一遍开发环境,无法快速搭建。

对开发和运维人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。

Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。

Docker 的基础是 Linux 容器(LXC)等技术。

在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

Docker Container 是可重用的,依赖于版本化机制,你很容易重用别人的 Container(叫Image),作为基础版本进行扩展,甚至像 Git 那样进行合并多个 Image;

简单来说,Docker 技术允许你在容器中运行你的应用(这有点类似于虚拟机,但是事实上还是有很大的区别),从而确保该应用所需要的所有库和包能够在任何情况下都有效运行,而不管你将他们跑在什么样的机器上。


给个 Docker 的例子

用 Docker 构建一个 Java 的编译环境,包括 Ubuntu、Jdk、Maven、SVN 。

Jdk、Maven 需要手动下载,下载之后分别为

jdk-8u51-linux-x64.gz、apache-maven-3.3.3-bin.tar.gz

创建一个 Dockerfile 文件,包含以下内容

FROM ubuntu
RUN apt-get update
RUN apt-get -y install subversion
ADD jdk-8u51-linux-x64.gz /usr/local
ADD apache-maven-3.3.3-bin.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_51
ENV M2_HOME /usr/local/apache-maven-3.3.3
ENV PATH $PATH:$JAVA_HOME/bin:$M2_HOME/bin

简单的说一下上面的意思,就是基于 Ubuntu 创建一个镜像,然后更新软件源,接着安装 SVN,然后把下载的 Jdk、Maven 添加到镜像,并放置到 /usr/local目录,这里我添加的是一个压缩包,在构建镜像的适合,系统会自动解压,并且镜像里面也不会有压缩的文件,最后再设置环境变量。

构建:

docker build -t dev 

运行

sudo docker run -p 8080:8080 dev

然后可以在浏览器访问 localhost:8080 了。


和 Vagrant 对比

Vagrant 是一款管理虚拟机的工具,而 Docker 是一款通过将应用打包到轻量级容器,而实现构建和部署的工具。两者适用范围不同。一个容器就是一个包含了应用执行所依赖的数据(包括lib,配置文件等等)。它可以保证应用在一个可重复的环境中随时执行。

如果你仅仅是想管理虚拟机,那么你应该使用 Vagrant。如果你想快速开发和部署应用,那么应该使用 Docker。

Vagrant 和 Docker 并不是相互竞争,而是互补的关系。

上次去听了公司内部的一个 Docker 分享,他们的做法是把 Docker 通过各种 Hack 的方法改成了一个虚拟机,个人感觉还不如直接用 Vagrant!!