• synergy at 2014年10月29日

    有,但是西安哪家公司在用,我就不清楚了。

    这个工具本身还是不错的。

  • 是呀。。。往届生可以帮助解决么?

  • 深入浅出 Docker at 2014年10月27日

    深入浅出 Docker(五):基于 Fig 搭建开发环境

    1. 概述

    在搭建开发环境时,我们都希望搭建过程能够简单,并且一劳永逸,其他的同事可以复用已经搭建好的开发环境以节省开发时间。而在搭建开发环境时,我们经常会被复杂的配置以及重复的下载安装所困扰。在 Docker 技术未出现之前,我们可以使用 Pupet、Chef、Ansible 等配置管理工具把复杂的配置管理起来,这样的管理配置技术仍然是目前比较流行的方式之一。配置管理工具使用的都是自己的 DSL 语法定义,考虑到环境的复杂性,配置一套通用的开发环境需要针对各个系统定制,对于大部分开发环境这种维护成本仍然是很高的。Docker 技术出现之后,系统的依赖问题得到了彻底的解决,我们可以通过镜像的方式简化环境的安装。结合 Docker 的开发部署工具 Fig,我们可以使用 fig.yml 文件来定义所有的环境,一次定义,多处使用,简单而且高效。

    1.1 打包的方式

    Docker 本省并不能创建一个真实的虚拟机,它只是基于 Linux Kernel 把额外的系统文件做了封装,并利用 Linux Kernel 相关的技术如 Cgroup、Namespace 隔离用户应用。应用 Docker 技术,团队之间通过共享 Image 或者 Dockefile 来复用开发环境。为了简化写 Dockerfile 的方式 ,Fig 提供更加精简的 DSL 定义文件 fig.yml,可以让新成员快速搭建开发环境并将精力投入到开发过程中去,而不是研究如何正确安装并配置诸如 PostgreSQL 之类的数据库。目前,软件开发需要的环境 Image,大部分都可以在 Docker Hub 中搜索到,需要使用时直接下载就可以使用。

    1.2 应用组合的方式

    使用 Docker 之后,我们不再需要在本地机器安装所有的软件包。我们可以根据项目需要在 Docker Hub 上搜索相关软件的 Image,然后使用 Fig pull 从 Docker Hub 上直接下载并由 Fig 调用 Docker 的 Link 命令把 Image 关联起来,这样所有应用都可以直接调用指定端口的服务,比如 Mysql 的 3306 端口提供数据库服务。开发者并不需要对 Docker 有太多的了解,只需要掌握常用的几条 Fig 命令就可以随时调试自己的环境。

    1.3 环境共享的方式

    Fig 直接定义好了 Image,我们不需要过多的关心容器或者镜像。在分享环境时,只需要把对应的 Dockerfile 和 fig.yml 文件分享给同事,他们就可以在自己的机器上运行并搭建出需要的环境,且不用再担心环境依赖带来的意外调试烦恼。团队成员在 git clone 项目代码后,就可以如下图一样使用一条命令启动自己的开发环境:

    1. Fig 安装指南

    首先,我们需要安装 Docker Engine,官方针对主流的系统提供了对应的安装手册。这里,我的开发机系统是一台 MacBook Pro,所以我需要安装 boot2docker 来支持 Docker。

    接下来,我们就可以安装对应系统版本的 Fig 运行文件。比如在 Mac OS 或者在 64 位的 Linux 上安装 Fig:

    $ curl -L https://github.com/docker/fig/releases/download/1.0.0/fig-uname` -s-uname -m` > /usr/local/bin/fig; chmod +x /usr/local/bin/fig 当以上的安装方式不能成功的话,我们可以选择使用 Python Package 的安装方式:

    $ sudo pip install -U fig 最后,不管使用什么 Linux 系统,安装完 Fig 之后通过运行以下命令来确保环境的一致性。

    $ fig --version 如果一切顺利的话,恭喜你,Fig 安装成功了。下面请随我一起学习如何使用 Fig 配置开发环境。

    1. Rails 开发环境配置详解

    我们来配置一套最常用的 Rails+PostgreSQL 项目。

    第一步,确保 Fig 已经正确的安装到主机系统,如果还没有,请参考上一章节的安装指南。

    第二步,在项目根目录下存放一个名为 Dockerfile 文件:

    FROM ruby RUN apt-get update -qq && apt-get install -y build-essential libpq-dev RUN mkdir /myapp WORKDIR /myapp ADD Gemfile /myapp/Gemfile RUN bundle install ADD . /myapp 第三步,创建一个 Gemfile 文件用来定义 Rails 软件包。 内容如下所示:

    source 'https://rubygems.org' gem 'rails', '4.0.2' 第四步,创建一个 fig.yml 文件,并使用以下配置文件来做最后的环境初始化。

    db: image: postgres ports: - "5432" web: build: . command: bundle exec rackup -p 3000 volumes: - .:/myapp ports: - "3000:3000" links: - db 第五步,当前你目录下空空如也,使用如下命令可以生成一套 Rails 项目骨架:

    $ fig run web rails new . --force --database=postgresql --skip-bundle 当你跑完以上命令,你就会得到一个崭新的 Rails 项目。

    $ ls Dockerfile Rakefile config fig.yml public vendor Gemfile app config.ru lib test README.rdoc bin db log tmp 编辑一下 Gemfile 文件,去掉 therubyracer 包的注释, 让 Rails 依赖的 Javascript 的运行时环境。

    gem 'therubyracer', platforms: :ruby 所有的文件编辑都做完之后,运行命令创建开发环境 image。

    $ fig build 运行完 build 命令后,我们就有了可以立即使用的 Image。这两个 Image 的名字分别是 web 和 db。为了让 db 能连上 web,我们通常还需要修改 database.yml 来支持数据库连接。

    development: &default adapter: postgresql encoding: unicode database: postgres pool: 5 username: postgres password: host: db test: <<: *default database: myapp_test

    好了,让我们运行一下:

    $ fig up 命令行将显示如下日志:

    Recreating figtest_db_1... Creating figtest_web_1... Attaching to figtest_db_1, figtest_web_1 db_1 | LOG: database system was shut down at 2014-10-01 23:53:11 UTC db_1 | LOG: autovacuum launcher started db_1 | LOG: database system is ready to accept connections web_1 | [2014-10-01 23:53:16] INFO WEBrick 1.3.1 web_1 | [2014-10-01 23:53:16] INFO ruby 2.1.2 (2014-05-08) [x86_64-linux] web_1 | [2014-10-01 23:53:16] INFO WEBrick::HTTPServer#start: pid=1 port=3000 db_1 | FATAL: database "myapp_development" does not exist db_1 | FATAL: database "myapp_development" does not exist web_1 | 192.168.59.3 - - [01/Oct/2014 23:53:40] "GET / HTTP/1.1" 500 13476 0.5112 web_1 | 192.168.59.3 - - [01/Oct/2014 23:53:40] "GET %2Ffavicon.ico HTTP/1.1" 200 - 0.0067 通过以上日志可以知道开发数据库还没有创建。这时我们可以开启另外一个 terminal,创建开发数据库:

    $ fig run web rake db:create 当以上所有步骤都成功运行后,就需要来验证开发环境的正确性了。通过访问http://localhost:3000/ 我们应该可以看到熟悉的 Rails 欢迎页面:

    1. Django 开发环境配置详解

    接下来让我们使用 Fig 来配置一套运行 Django/PostgreSQL 的应用程序吧。

    首先我们新建一个项目目录,并在目录里创建 3 个文件。第一个文件是 Docker 镜像的定义文件: Dockerfile,用来描述安装在 Docker 容器里软件依赖关系。文件如下:

    FROM python:2.7 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code ADD requirements.txt /code/ RUN pip install -r requirements.txt ADD . /code/ 以上文件描述这个 Image 将安装 requirements.txt 指定的 python 依赖包。

    第二个文件是 requirements.txt,它是 python 依赖包定义描述文件,内容如下:

    Django psycopg2 最后,Fig 需要把所有的环境都连接起来运行。这个文件名为 fig.yml 。它描述项目需要的服务组件、指定镜像的版本、如何连接服务、什么卷可以被载入容器内部、什么端口可以暴露出来等。内容形如:

    db: image: postgres web: build: . command: python manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000" links: - db 到此处,我们就可以使用 fig run 来创建一个 Django 项目了:

    $ fig run web django-admin.py startproject figexample . 当你运行完之后,可以在当前目录下看到创建的新项目文件:

    $ ls Dockerfile fig.yml figexample manage.py requirements.txt 接下来的事情就是创建数据库链接,修改 figexample/settings.py 的 DATABASES = ...部分。

    DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'postgres', 'USER': 'postgres', 'HOST': 'db', 'PORT': 5432, } } 这个配置信息是用来连接 postgres 镜像服务。

    然后,运行命令 fig up 来启动容器。

    Recreating myapp_db_1... Recreating myapp_web_1... Attaching to myapp_db_1, myapp_web_1 myapp_db_1 | myapp_db_1 | PostgreSQL stand-alone backend 9.1.11 myapp_db_1 | 2014-01-27 12:17:03 UTC LOG: database system is ready to accept connections myapp_db_1 | 2014-01-27 12:17:03 UTC LOG: autovacuum launcher started myapp_web_1 | Validating models... myapp_web_1 | myapp_web_1 | 0 errors found myapp_web_1 | January 27, 2014 - 12:12:40 myapp_web_1 | Django version 1.6.1, using settings 'figexample.settings' myapp_web_1 | Starting development server at http://0.0.0.0:8000/ myapp_web_1 | Quit the server with CONTROL-C. 这个时候,你可以开启浏览器,然后输入 localhost:8000 就可以访问这个 Django 应用。

    注意,当你跑起来应用之后,就可以初始化数据库了。这里,请一定要保证 fig up 是在运行中,并另外开启一个命令行窗口执行一下命令:

    $ fig run web python manage.py syncdb 如果你反复使用了 fig up 之后,可以体会到它一次性会把 web 和 db 两个镜像一起启动,如果你 CONTROL-C 之后,数据库也会停止服务。你甚至可以 fig run web /bin/bash 的方式直接进入到容器里看看。

    1. Wordpress 开发环境配置详解

    Fig 一样可以应付 PHP 应用的开发需求。

    首先,创建一个 Dockerfile 来支持生成开发用 Image。

    $ curl https://wordpress.org/latest.tar.gz | tar -xvzf - 以上这条命令创建名为 wordpress 的目录。进入到此目录,创建镜像文件 Dockerfile,内容如下:

    FROM stackbrew/ubuntu:13.10 RUN apt-get update && apt-get install php5 php5-mysql -y ADD . /code 下一步创建 fig.yml,它将定义出 web 服务和 mysql db 服务。

    web: build: . command: php -S 0.0.0.0:8000 -t /code ports: - "8000:8000" links: - db volumes: - .:/code db: image: mysql environment: MYSQL_DATABASE: wordpress MYSQL_ROOT_PASSWORD: wordpress wordpress 有一个支持文件需要修改,它是 wp-config.php:

    <?php define('DB_NAME', 'wordpress'); define('DB_USER', 'root'); define('DB_PASSWORD', 'wordpress'); define('DB_HOST', getenv("DB_1_PORT_3306_TCP_ADDR") . ":" . getenv("DB_1_PORT_3306_TCP_PORT")); define('DB_CHARSET', 'utf8'); define('DB_COLLATE', '');

    define('AUTH_KEY', 'put your unique phrase here'); define('SECURE_AUTH_KEY', 'put your unique phrase here'); define('LOGGED_IN_KEY', 'put your unique phrase here'); define('NONCE_KEY', 'put your unique phrase here'); define('AUTH_SALT', 'put your unique phrase here'); define('SECURE_AUTH_SALT', 'put your unique phrase here'); define('LOGGED_IN_SALT', 'put your unique phrase here'); define('NONCE_SALT', 'put your unique phrase here');

    $table_prefix = 'wp_'; define('WPLANG', ''); define('WP_DEBUG', false);

    if ( ! defined('ABSPATH') ) define('ABSPATH', dirname(FILE) . '/');

    require_once(ABSPATH . 'wp-settings.php'); 以上三个文件都修改后,就可以在此目录下运行 fig up 来启动 wordpress。可以使用浏览器访问 localhost:8000 浏览 Wordpress 首页。

    1. 结论

    通过 Fig 来构建基于 Docker 的开发环境可以让我们的开发事半功倍。其实如果读者按照我的步骤一步一步搭建开发环境,仍然会有很多挑战。

    首先,因为国内带宽的限制,从官方下载 Image 是一个长时间等待的过程。即使 Docker 公司已经使用了 CDN 服务,但在国内网络使用仍然很慢。为了能快速下载,我还常备一条 VPN 线路作为数据通道来下载 Image。目前这是最理想的方式,可以节省很多开发时间。

    第二,fig up 并不能保证 Image 能一次成功。但不需要灰心。你可以 fig run web /bin/bash 直接到容器里面调试。我遇到过多次费解的问题都是直接在里面跑命令解决的。当你退出时,fig 会自动更新到相应的 Image 里。当你再次 fig up,它会使用新 Image 去创建这个运行容器。

    第三,fig up 会创建两个以上的容器实例,在退出容器后再次启动 fig up,并不会重用之前退出的容器实例,而是新建容器实例。像 fig up 这类常用命令运行多次之后会导致过期的容器文件仍然存储在你的开发机器上并占用硬盘空间,并且 Fig 还没有提供对应的命令自动清理它们。目前可以解决的办法是直接使用 Docker rm/rmi 命令手工清除。

    以上总结出的实战经验,仍然不能掩盖 Fig 特有的亮点:运用 Fig 可以定义统一运行步骤,让部署环境可以完全的隔离在一个独立的容器环境里,并且这个隔离环境可以在开发、测试、生产多个步骤中保持一致。当前 Fig 项目还很年轻,需要大家多参与项目的讨论,提出自己的问题才能让 Fig 更好使用,更多信息可以到这里查阅。

    1. 作者简介

    肖德时, Red Hat Engineering Service/HSS 内部工具组 Team Leader。Nodejs 开源项目 nodejs-cantas Lead Developer。擅长企业内部工具的设计以及实现。开源课程 Rails Starter 的发起人。rubygem: lazy_high_charts 的 Maintainer。Twitter 账号:xds2000,邮箱:[email] xiaods@gmail.com[/email]

    8.下期预告

    Docker 引擎可以在多台主机上启动成千上百的实例,那么如何管理这些容器实例显然会成为一个挑战。所以下期我将给大家介绍一款非常出色的容器集群管理框架 Kubernetes,敬请期待!

  • 深入浅出 Docker at 2014年10月27日

    [i=s] 本帖最后由 laofo 于 2014-10-27 15:13 编辑

    深入浅出 Docker(四):Docker 的集成测试部署之道

    1. 背景

    敏捷开发已经流行了很长时间,如今有越来越多的企业开始践行敏捷开发所提倡的以人为中心、迭代、循序渐进的开发理念。在这样的场景下引入 Docker 技术,首要目的就是使用 Docker 提供的虚拟化方式,给开发团队建立一套可以复用的开发环境,让开发环境可以通过 Image 的形式分享给项目的所有开发成员,以简化开发环境的搭建。但是,在没有 Docker 技术之前就已经有类如 Vagrant 的开发环境分发技术,软件开发者一样可以创建类似需求的环境配置流程。所以在开发环境方面,Docker 技术的优势并不能很好的发挥出来。笔者认为 Docker 的优点在于可以简化 CI(持续集成)、CD(持续交付)的构建流程,让开发者把更多的精力用在开发上。

    每家公司都有自己的开发技术栈,我们需要结合实际情况对其进行持续改进,优化自己的构建流程。当我们准备迈出第一步时,我们首先要确立一张构建蓝图,做到胸有成竹,这样接下来的事情才会很快实现。

    [attach] 2480[/attach]

    这张时序图概括了目前敏捷开发流程的所有环节。结合以上时序图给出的蓝图框架,本文的重点是讲解引入 Docker 技术到每个环节中的实践经验。

    1. 创建持续发布的团队

    开发团队在引入 Docker 技术的时候,最大的问题是没有可遵循的业界标准。大家常常以最佳实践为口号,引入多种工具链,导致在使用 Docker 的过程中没有侧重点。涉及到 Docker 选型,又在工具学习上花费大量时间,而不是选用合适的工具以组建可持续发布产品的开发团队。基于这样的场景,我们可以把 “简单易用” 的原则作为评判标准,引入到 Docker 技术工具选型的参考中。开发团队在引入 Docker 技术的过程中,首先需要解决的是让团队成员尽快掌握 Docker 命令行的使用。在熟悉了 Docker 命令行之后,团队需要解决几个关键问题具体如下:

    1)Base Image 的选择, 比如 phusion-baseimage

    2)配置管理 Docker 镜像的工具的选择,比如 Ansible、Chef、Puppet

    3)Host 主机系统的选择,比如 CoreOS、Atomic、Ubuntu

    Base Image 包括了操作系统命令行和类库的最小集合,一旦启用,所有应用都需要以它为基础创建应用镜像。Ubuntu 作为官方使用的默认版本,是目前最易用的版本,但系统没有经过优化,可以考虑使用第三方有划过的版本,比如如 phusion-baseimage。对于选择 RHEL、CentOS 分支的 Base Image,提供安全框架 SELinux 的使用、块级存储文件系统 devicemapper 等技术,这些特性是不能和 Ubuntu 分支通用的。另外需要注意的是,使用的操作系统分支不同,其裁剪系统的方法也完全不同,所以大家在选择操作系统时一定要慎重。

    配置管理 Docker 镜像的工具主要用于基于 Dockerfile 创建 Image 的配置管理。我们需要结合开发团队的现状,选择一款团队熟悉的工具作为通用工具。配置工具有很多种选择,其中 Ansible 作为后起之秀,在配置管理的使用中体验非常简单易用,推荐大家参考使用。

    Host 主机系统是 Docker 后台进程的运行环境。从开发角度来看,它就是一台普通的单机 OS 系统,我们仅部署 Docker 后台进程以及集群工具,所以希望 Host 主机系统的开销越小越好。这里推荐给大家的 Host 主机系统是 CoreOS,它是目前开销最小的主机系统。另外,还有红帽的开源 Atomic 主机系统,有基于 Fedora、CentOS、RHEL 多个版本的分支选择,也是不错的候选对象。另外一种情况是选择最小安装操作系统,自己定制 Host 主机系统。如果你的团队有这个实力,可以考虑自己定制这样的系统。

    1. 持续集成的构建系统

    当开发团队把代码提交到 Git 应用仓库的那一刻,我相信所有的开发者都希望有一个系统能帮助他们把这个应用程序部署到应用服务器上,以节省不必要的人工成本。但是,复杂的应用部署场景,让这个想法实现起来并不简单。

    首先,我们需要有一个支持 Docker 的构建系统,这里推荐 Jenkins。它的主要特点是项目开源、方便定制、使用简单。Jenkins 可以方便的安装各种第三方插件,从而方便快捷的集成第三方的应用。

    通过 Jenkins 系统的 Job 触发机制,我们可以方便的创建各种类型的集成 Job 用例。但缺乏统一标准的 Job 用例使用方法,会导致项目 Job 用例使用的混乱,难于管理维护。这也让开发团队无法充分利用好集成系统的优势,当然这也不是我们期望的结果。所以,敏捷实践方法提出了一个可以持续交付的概念 DeploymentPipeline(管道部署)。通过 Docker 技术,我们可以很方便的理解并实施这个方法。

    Jenkins 的管道部署把部署的流程形象化成为一个长长的管道,每间隔一小段会有一个节点,也就是 Job,完成这个 Job 工作后才可以进入下一个环节。形式如下:

    [attach] 2481[/attach] image source: google image search

    大家看到上图中的每一块面板在引入 Docker 技术之后,就可以使用 Docker 把任务模块化,然后做成有针对性的 Image 用来跑需要的任务。每一个任务 Image 的创建工作又可以在开发者自己的环境中完成,类似的场景可以参考下图: [attach] 2482[/attach] image source: google image search

    所以,使用 Docker 之后,任务的模块化很自然地被定义出来。通过管道图,可以查看每一步的执行时间。开发者也可以针对任务的需要,为每一个任务定义严格的性能标准,已作为之后测试工作的参考基础。

    4.最佳的发布环境

    应用经过测试,接下来我们需要把它发布到测试环境和生产环境。这个阶段中如何更合理地使用 Docker 也是一个难点,开发团队需要考虑如何打造一个可伸缩扩展的分发环境。其实,这个环境就是基于 Docker 的私有云,更进一步我们可能期望的是提供 API 接口的 PaaS 云服务。为了构建此 PaaS 服务,这里推荐几款非常热门的工具方便大家参考,通过这些工具可以定制出企业私有的 PaaS 服务。

    1) Apache Mesos + marathon

    Apache Mesos 系统是一套资源管理调度集群系统,生产环境使用它可以实现应用集群。此系统是由 Twitter 发起的 Apache 开源项目。在这个集群系统里,我们可以使用 Zookeeper 开启 3 个 Mesos master 服务,当 3 个 Mesos master 通过 zookeeper 交换信息后会选出 Leader 服务,这时发给其它两台 Slave Messos Master 上的请求会转发到 Messos master Leader 服务。Mesos slave 服务器在开启后会把内存、存储空间和 CPU 资源信息发给 Messos master。Mesos 是一个框架,在设计它的时候只是为了用它执行 Job 来做数据分析。它并不能运行一个比如 Web 服务 Nginx 这样长时间运行的服务,所以我们需要借助 marathon 来支持这个需求。marathon 有自己的 REST API,我们可以创建如下的配置文件 Docker.json:

    { "container": { "type": "DOCKER", "docker": { "image": "libmesos/ubuntu" } }, "id": "ubuntu", "instances": "1", "cpus": "0.5", "mem": "512", "uris": [], "cmd": "while sleep 10; do date -u +%T; done" } 然后调用

    curl -X POST -H "Content-Type: application/json" http://:8080/v2/apps [email]-d@Docker.json[/email]

    我们就可以创建出一个 Web 服务在 Mesos 集群上。对于 Marathon 的具体案例,可以参考官方案例。 [attach] 2483[/attach]

    image source: google image search

    2) Google Kubernetes

    Google 的一个容器集群管理工具,它提出两个概念:

    Pods,每个 Pod 是一个容器的集合并部署在同一台主机上,共享 IP 地址和存储空间,比如 Apache,Redis 之类分为一组容器集合。 Labels,提供服务标签,方便 Pod 容器之间的调用协作。 通过官方架构设计文档的介绍,可以详细的了解每个组件的设计思想。这是目前业界唯一在生产环境部署经验的基础上推出的开源容器方案,可以预见到未来会成为容器管理系统的行业参考标准。

    [attach] 2484[/attach] image source: google image search

    3) Panamax

    在琳琅满目的集群管理工具面前,如何管理单机的 Docker 容器也是一个需要解决问题。因为 Docker 占用内存小,在单机服务器上部署成百上千个容器也不足为奇。Panamax 提供人性化的 Web 管理界面用来安装软件让部署变得更简单。并且,Panamax 还提供丰富的容器模板,让在线创建服务成为可能。比如到 DigitalOcean 申请一台主机,安装一套 Panamax 启动为后台服务。然后通过 Panamax Web 界面安装 Nginx、Mysql、Redis 等服务镜像,这样可以快速搭建生产环境的应用场景。所有的操作都是在 Web 界面上完成,开发者只需要关注开发本身即可。

    [attach] 2485[/attach]

    1. 结论

    Docker 的集成部署方案,是一套灵活简单的工具集解决方案。它克服了之前集群工具复杂、难用的困境,使用统一的 Docker 应用容器的概念部署软件应用。通过引入 Docker 技术,开发团队在面对复杂的生产环境中,可以结合自己团队的实际情况,定制出适合自己基础架构的配套软件发布方案。

    1. 作者简介

    肖德时, Red Hat Engineering Service/HSS 内部工具组 Team Leader. Nodejs 开源项目 nodejs-cantas Lead Developer。擅长企业内部工具的设计以及实现。开源课程 Rails Starter 的发起人。rubygem: lazy_high_charts 的 Maintainer。twitter 账号:xds2000,邮箱:[email] xiaods@gmail.com[/email]

    7.下期预告

    Docker 在生产环境的应用实践已经给大家介绍,下期我将给大家介绍如何基于 Docker 快速构建开发环境,敬请期待!

  • 深入浅出 Docker(四):Docker 的集成测试部署之道

    1. 背景

    敏捷开发已经流行了很长时间,如今有越来越多的企业开始践行敏捷开发所提倡的以人为中心、迭代、循序渐进的开发理念。在这样的场景下引入 Docker 技术,首要目的就是使用 Docker 提供的虚拟化方式,给开发团队建立一套可以复用的开发环境,让开发环境可以通过 Image 的形式分享给项目的所有开发成员,以简化开发环境的搭建。但是,在没有 Docker 技术之前就已经有类如 Vagrant 的开发环境分发技术,软件开发者一样可以创建类似需求的环境配置流程。所以在开发环境方面,Docker 技术的优势并不能很好的发挥出来。笔者认为 Docker 的优点在于可以简化 CI(持续集成)、CD(持续交付)的构建流程,让开发者把更多的精力用在开发上。

    每家公司都有自己的开发技术栈,我们需要结合实际情况对其进行持续改进,优化自己的构建流程。当我们准备迈出第一步时,我们首先要确立一张构建蓝图,做到胸有成竹,这样接下来的事情才会很快实现。

    这张时序图概括了目前敏捷开发流程的所有环节。结合以上时序图给出的蓝图框架,本文的重点是讲解引入 Docker 技术到每个环节中的实践经验。

    1. 创建持续发布的团队

    开发团队在引入 Docker 技术的时候,最大的问题是没有可遵循的业界标准。大家常常以最佳实践为口号,引入多种工具链,导致在使用 Docker 的过程中没有侧重点。涉及到 Docker 选型,又在工具学习上花费大量时间,而不是选用合适的工具以组建可持续发布产品的开发团队。基于这样的场景,我们可以把 “简单易用” 的原则作为评判标准,引入到 Docker 技术工具选型的参考中。开发团队在引入 Docker 技术的过程中,首先需要解决的是让团队成员尽快掌握 Docker 命令行的使用。在熟悉了 Docker 命令行之后,团队需要解决几个关键问题具体如下:

    1)Base Image 的选择, 比如 phusion-baseimage

    2)配置管理 Docker 镜像的工具的选择,比如 Ansible、Chef、Puppet

    3)Host 主机系统的选择,比如 CoreOS、Atomic、Ubuntu

    Base Image 包括了操作系统命令行和类库的最小集合,一旦启用,所有应用都需要以它为基础创建应用镜像。Ubuntu 作为官方使用的默认版本,是目前最易用的版本,但系统没有经过优化,可以考虑使用第三方有划过的版本,比如如 phusion-baseimage。对于选择 RHEL、CentOS 分支的 Base Image,提供安全框架 SELinux 的使用、块级存储文件系统 devicemapper 等技术,这些特性是不能和 Ubuntu 分支通用的。另外需要注意的是,使用的操作系统分支不同,其裁剪系统的方法也完全不同,所以大家在选择操作系统时一定要慎重。

    配置管理 Docker 镜像的工具主要用于基于 Dockerfile 创建 Image 的配置管理。我们需要结合开发团队的现状,选择一款团队熟悉的工具作为通用工具。配置工具有很多种选择,其中 Ansible 作为后起之秀,在配置管理的使用中体验非常简单易用,推荐大家参考使用。

    Host 主机系统是 Docker 后台进程的运行环境。从开发角度来看,它就是一台普通的单机 OS 系统,我们仅部署 Docker 后台进程以及集群工具,所以希望 Host 主机系统的开销越小越好。这里推荐给大家的 Host 主机系统是 CoreOS,它是目前开销最小的主机系统。另外,还有红帽的开源 Atomic 主机系统,有基于 Fedora、CentOS、RHEL 多个版本的分支选择,也是不错的候选对象。另外一种情况是选择最小安装操作系统,自己定制 Host 主机系统。如果你的团队有这个实力,可以考虑自己定制这样的系统。

    1. 持续集成的构建系统

    当开发团队把代码提交到 Git 应用仓库的那一刻,我相信所有的开发者都希望有一个系统能帮助他们把这个应用程序部署到应用服务器上,以节省不必要的人工成本。但是,复杂的应用部署场景,让这个想法实现起来并不简单。

    首先,我们需要有一个支持 Docker 的构建系统,这里推荐 Jenkins。它的主要特点是项目开源、方便定制、使用简单。Jenkins 可以方便的安装各种第三方插件,从而方便快捷的集成第三方的应用。

    通过 Jenkins 系统的 Job 触发机制,我们可以方便的创建各种类型的集成 Job 用例。但缺乏统一标准的 Job 用例使用方法,会导致项目 Job 用例使用的混乱,难于管理维护。这也让开发团队无法充分利用好集成系统的优势,当然这也不是我们期望的结果。所以,敏捷实践方法提出了一个可以持续交付的概念 DeploymentPipeline(管道部署)。通过 Docker 技术,我们可以很方便的理解并实施这个方法。

    Jenkins 的管道部署把部署的流程形象化成为一个长长的管道,每间隔一小段会有一个节点,也就是 Job,完成这个 Job 工作后才可以进入下一个环节。形式如下:

    image source: google image search

    大家看到上图中的每一块面板在引入 Docker 技术之后,就可以使用 Docker 把任务模块化,然后做成有针对性的 Image 用来跑需要的任务。每一个任务 Image 的创建工作又可以在开发者自己的环境中完成,类似的场景可以参考下图:

    image source: google image search

    所以,使用 Docker 之后,任务的模块化很自然地被定义出来。通过管道图,可以查看每一步的执行时间。开发者也可以针对任务的需要,为每一个任务定义严格的性能标准,已作为之后测试工作的参考基础。

    4.最佳的发布环境

    应用经过测试,接下来我们需要把它发布到测试环境和生产环境。这个阶段中如何更合理地使用 Docker 也是一个难点,开发团队需要考虑如何打造一个可伸缩扩展的分发环境。其实,这个环境就是基于 Docker 的私有云,更进一步我们可能期望的是提供 API 接口的 PaaS 云服务。为了构建此 PaaS 服务,这里推荐几款非常热门的工具方便大家参考,通过这些工具可以定制出企业私有的 PaaS 服务。

    1) Apache Mesos + marathon

    Apache Mesos 系统是一套资源管理调度集群系统,生产环境使用它可以实现应用集群。此系统是由 Twitter 发起的 Apache 开源项目。在这个集群系统里,我们可以使用 Zookeeper 开启 3 个 Mesos master 服务,当 3 个 Mesos master 通过 zookeeper 交换信息后会选出 Leader 服务,这时发给其它两台 Slave Messos Master 上的请求会转发到 Messos master Leader 服务。Mesos slave 服务器在开启后会把内存、存储空间和 CPU 资源信息发给 Messos master。Mesos 是一个框架,在设计它的时候只是为了用它执行 Job 来做数据分析。它并不能运行一个比如 Web 服务 Nginx 这样长时间运行的服务,所以我们需要借助 marathon 来支持这个需求。marathon 有自己的 REST API,我们可以创建如下的配置文件 Docker.json:

    { "container": { "type": "DOCKER", "docker": { "image": "libmesos/ubuntu" } }, "id": "ubuntu", "instances": "1", "cpus": "0.5", "mem": "512", "uris": [], "cmd": "while sleep 10; do date -u +%T; done" } 然后调用

    curl -X POST -H "Content-Type: application/json" http://:8080/v2/apps [email]-d@Docker.json[/email]

    我们就可以创建出一个 Web 服务在 Mesos 集群上。对于 Marathon 的具体案例,可以参考官方案例。

    image source: google image search

    2) Google Kubernetes

    Google 的一个容器集群管理工具,它提出两个概念:

    Pods,每个 Pod 是一个容器的集合并部署在同一台主机上,共享 IP 地址和存储空间,比如 Apache,Redis 之类分为一组容器集合。 Labels,提供服务标签,方便 Pod 容器之间的调用协作。 通过官方架构设计文档的介绍,可以详细的了解每个组件的设计思想。这是目前业界唯一在生产环境部署经验的基础上推出的开源容器方案,可以预见到未来会成为容器管理系统的行业参考标准。

    image source: google image search

    3) Panamax

    在琳琅满目的集群管理工具面前,如何管理单机的 Docker 容器也是一个需要解决问题。因为 Docker 占用内存小,在单机服务器上部署成百上千个容器也不足为奇。Panamax 提供人性化的 Web 管理界面用来安装软件让部署变得更简单。并且,Panamax 还提供丰富的容器模板,让在线创建服务成为可能。比如到 DigitalOcean 申请一台主机,安装一套 Panamax 启动为后台服务。然后通过 Panamax Web 界面安装 Nginx、Mysql、Redis 等服务镜像,这样可以快速搭建生产环境的应用场景。所有的操作都是在 Web 界面上完成,开发者只需要关注开发本身即可。

    1. 结论

    Docker 的集成部署方案,是一套灵活简单的工具集解决方案。它克服了之前集群工具复杂、难用的困境,使用统一的 Docker 应用容器的概念部署软件应用。通过引入 Docker 技术,开发团队在面对复杂的生产环境中,可以结合自己团队的实际情况,定制出适合自己基础架构的配套软件发布方案。

    1. 作者简介

    肖德时, Red Hat Engineering Service/HSS 内部工具组 Team Leader. Nodejs 开源项目 nodejs-cantas Lead Developer。擅长企业内部工具的设计以及实现。开源课程 Rails Starter 的发起人。rubygem: lazy_high_charts 的 Maintainer。twitter 账号:xds2000,邮箱:[email] xiaods@gmail.com[/email]

    7.下期预告

    Docker 在生产环境的应用实践已经给大家介绍,下期我将给大家介绍如何基于 Docker 快速构建开发环境,敬请期待!

  • [i=s] 本帖最后由 laofo 于 2014-10-27 10:07 编辑

    觉得海康累的可以去 Nokia,觉得 Nokia 钱少的可以去海康。哈哈 @qhy218

  • 深入浅出 Docker at 2014年10月24日

    深入浅出 Docker(三):Docker 开源之路

    1. 背景

    Docker 从一开始的概念阶段就致力于使用开源驱动的方式来发展,它的成功缘于国外成熟的开源文化氛围,以及可借鉴的社区运营经验。通过本文详细的介绍,让大家可以全面了解一个项目亦或者一项技术是如何通过开源的方式发展起来的。为了更准确的描述 Docker 的社区状况,请先看一份来自 Docker 官方的数据: [attach] 2475[/attach] 图中数据的看点有:

    超过 500 个代码贡献者。代码的贡献者在社区发展过程中是非常重要的催化剂,它会不断加快产品迭代的速度,让项目更快的交付到最终用户的手里。 20 个全职开发。一般的开源项目一般都不会有如此多的全职开发人员,但是 Docker 却有 20 个全职开发人员来驱动一个社区项目。这也从侧面证明了国外公司对开源项目的支持力度,以至于一家初创公司都舍得投入 20 个全职开发来推动开源技术的发展。 超过 8000 个创建在 GitHub 上的 Docker 相关项目。通过这个规模可以看到围绕 Docker 可以使用的项目已经非常丰富。 Docker 技术聚会。30 个国家超过 90 个城市举办超过 250 个 Docker 技术聚会,这样的技术聚会还在不断增加,Docker 技术爱好者可以在线申请承办此类技术聚会。 50 万次的 boot2docker 下载。boot2docker 为 Docker 官方推荐客户端,50 万次也代表当前潜在的用户群体。

    [attach] 2476[/attach] Docker 公司目前正式员工 50 多名,由开源老手 Ben Golub(前 GlusterFS CEO) 主持运营。现在主要有以下几个赢利点:

    印有蓝鲸的 T 恤和贴纸的品牌价值 通过 Docker Hub 服务提供 SaaS 的分发服务 提供 Docker 技术支持和培训 通过了解 Docker 的社区现状和公司的运营状况,可以发现其在运营的方式上并没有什么特别的地方。除了支付公司员工的正常开支外,它并没有像一般商业公司那样在推广上投入很多资金。Docker 在推广上主要是将开源社区和社交网络作为基础推广平台,结合全球范围的 Docker 技术聚会,形成了良好的良性的客户互动和口口相传的品牌效应。在 Docker 的开源历程中,通过分析观察用户社区、源代码管理、合作伙伴的生态圈这三种形式,梳理出一套实践经验的案例,方便大家参考学习。

    1. 用户社区维护

    Docker 技术首先考虑的是在技术社区里通过各种渠道来找到它的用户,而当前最流行的技术社交网络不是 Twitter,而是 GitHub。所以 Docker 第一步是向 GitHub 上提交自己的代码开始吸引自己的用户的。我们总说万事开头难,那么 Docker 的第一个 Commit 应该是什么,它是否需要包括测试、用户文档、用户开发指南、设计理念等一系列的文档和代码呢?如果参照常规的开源项目,它们都考虑的都很周到,完善的代码文档结构会让用户第一眼就知道这是一个成熟的项目,我们只要用就可以了。但 Docker 公司却不按套路出牌,第一个 Commit 仅包括 6 个主文件:

    [attach] 2477[/attach]

    没有 README,没有开发环境指南,开始阶段用户无法有效的了解 Docker 项目。但是,这其实也是对的,因为在一个小众的开源项目的初期,很难吸引到社区用户来为它贡献代码。在接下来的很长一段时间,Docker 主要是由 Docker 之父 Solomon Hykes 开发维护。在没有社区用户参与的情况下,他每天不分昼夜地提交代码,也许是为了生活,也许是为了爱好,Solomon Hykes 在拼命的实现心中那个目标:让 LXC 创建的容器更容易使用。用当下时髦的那句话讲就是不忘初衷。

    [attach] 2478[/attach]

    从 Solomon Hykes 贡献代码的趋势图,我们可以看到只有保证项目的活跃度(持续贡献代码)那么项目才有可能获得用户的认可和关注。试想,“三天打鱼,两天晒网” 的开源项目会给用户怎么样的感觉?作者都不专注,用户怎么可能忠实?这种投入,并不是偶然性的,这是国外业界的开源文化,非常值得我们学习。

    在代码贡献的同时,Docker.io 的主站也在 2013 年的 5 月 30 日第一次提交到 GitHub。这距离第一行代码提交到 GitHub 已经有 5 个月。总体来看,Docker 从一开始仅仅是一个很酷的想法,到真正完成并可以对外发布版本,也是经历了小半年之久。开源的意义并不像国内大多数厂商发布开源项目一样,一定要在内部应用的很成功才发布到技术社区。我们通过以上数据,可以很容易的看出来,它一定是一个长期的、持续的过程。你越专注的投入,你的项目越有可能成功。

    当然,如果仅仅 Docker 只在 GitHub 上提供代码来吸引用户,那也不会是最佳的实践。在网站建立后的下一步,它开始在全球各大城市的技术聚会上推广介绍 Docker。Docker 技术在全球推广的方法是通过线下的技术聚会,外加社交网络媒体传播才得到流行的。Docker 官网通过发布 “创建 Docker 技术聚会指南”,引导 Docker 技术的爱好者自发申请承办技术聚会。Docker 官网主要通过类似 Twitter、Docker 周报、用户论坛等渠道,及时的把每个城市即将开始的技术聚会时间和联系人发布出来,就可以把 Docker 的技术推广做下去。并且这种形式的最大好处是口碑相传,其长尾效应的结果是 Docker 技术开始在当地的技术圈得到关注。像这样的技术聚会,一般都在 30 到 200 人之间,对于商业项目的推广是无法参照这样推广的。但这种形式就像一颗种子散落在城市中间,一旦有人介绍 Docker 技术到这个城市的技术圈,就会有更多的用户去 GitHub 上关注 Docker 的项目进展。

    1. 源代码管理

    Docker 的源码是按照模块划分的,每一个模块都会单独放在一个目录里。并且每个目录都会包含一个 MAINTAINERS.md。当你提交一个 Pull Request 的时候,子模块的维护者就会站出来回答 “LGTM (Looks Good To Me)” 表示已经看了你的代码并接受你提交的代码。

    每一个想参与 Docker 开发的开发者,你需要进入一个特殊的目录 hack,这个目录包括了所有你想知道的开发相关信息。它把开发者分为 4 类人,

    代码贡献者,详细指南看 CONTRIBUTORS.md。 代码维护者,详细指南看 MAINTAINERS.md。 程序打包者,详细指南看 PACKAGERS.md。 负责发布版本的维护者,详细指南看 RELEASE-CHECKLIST.md。 所有的指南文档都非常详细完整,可以做到看完此文档就可以开始相应角色的任务。除了这些文档之外,hack 目录还包括了发布,开发,测试等环节需要的辅助脚本,让开发者可以得到很多开发上的便利。

    Docker 从一开始就是围绕 LXC 开发的,但在版本稳定后,使用 Go 重写了一套类 LXC 接口实现。也就是 libcontainer 项目。它的代码管理方式与上面的 Docker 源代码管理方式一样,开发者可以很容易的导入到子项目 libcontainer 的开发。一致的管理方法可以提高流程的复用,这种管理方式希望能得到大家的借鉴参考。

    1. 创建合作伙伴生态圈

    首先,Docker 从一开始使用 Ubuntu 版本作为开发环境,主要是 Ubuntu 上支持 aufs(advanced multi layered unification filesystem) 文件系统。所以,Docker 对 Ubuntu 的支持是最好的。

    还有就是大家非常熟悉的 Google 的 GCE,在没有 Docker 之前,就已经使用自己开发的类 LXC 容器。在有了 Docker 之后, Google 开发了 kubernetes 来管理 Docker。

    商业版本 Linux 的领导者 RedHat,也是 Docker 生态圈非常重要的合作伙伴。并且它支持的 Fedora 社区、CentOS 社区会对推广 Docker 技术起到关键性作用。

    还有就是 OpenStack 的建立者 Rackspace,在混合云解决方案上具有全球领导地位。Docker 与它的合作,可以帮助 Docker 技术在混合云的解决方案中得到推广。

    最后就是开源 PaaS 项目 DEIS,基于 Docker 和 CoreOS 技术构建的类如 Heroku 发布流程的 PaaS 应用。与它的合作,可以让更多的企业看到一个使用 Docker 技术的范本。

    1. 结论

    Docker 的开源之路可以说是开源项目的最佳实践,它从屌丝瞬间变为高富帅的历程并不是偶然。Docker 的开源之路还在进行中,从它的模式中我们可以学习到的东西并不仅仅局限于以上罗列的几点,读者可以在参与开源项目的过程中多体会,找到自己的 “痛点”,然后参考 Docker 等开源项目的做法,相信可以很快解决你的问题。

    1. 作者简介

    肖德时, Red Hat Engineering Service/HSS 内部工具组 Team Leader. Nodejs 开源项目 nodejs-cantas Lead Developer。擅长企业内部工具的设计以及实现。开源课程 Rails Starter 的发起人。rubygem: lazy_high_charts 的 Maintainer。twitter 账号:xds2000,邮箱:[email] xiaods@gmail.com[/email]

    7.下期预告

    Docker 技术基本信息已经介绍的差不多了,接下来的系列将进入实战篇。下一篇将重点讲解 Docker 的集成测试部署方法,并结合众场景(数据库集成、测试、审查、部署)给出参考解决方案,敬请期待!

  • 深入浅出 Docker at 2014年10月24日

    深入浅出 Docker(二):Docker 命令行探秘

    作者 肖德时

    1. Docker 命令行

    Docker 官方为了让用户快速了解 Docker,提供了一个交互式教程,旨在帮助用户掌握 Docker 命令行的使用方法。但是由于 Docker 技术的快速发展,此交互式教程已经无法满足 Docker 用户的实际使用需求,所以让我们一起开始一次真正的命令行学习之旅。首先,Docker 的命令清单可以通过运行 docker ,或者 docker help 命令得到:

    $ sudo docker [attach] 2473[/attach]

    在 Docker 容器技术不断演化的过程中,Docker 的子命令已经达到 34 个之多,其中核心子命令 (例如:run) 还会有复杂的参数配置。笔者通过结合功能和应用场景方面的考虑,把命令行划分为 4 个部分,方便我们快速概览 Docker 命令行的组成结构:

    功能划分

    命令

    环境信息相关

    info version 系统运维相关

    attach build commit cp diff export images import / save / load inspect kill port pause / unpause ps rm rmi run start / stop / restart tag top wait 日志信息相关

    events history logs Docker Hub 服务相关

    login pull / push search 1.1 参数约定

    单个字符的参数可以放在一起组合配置,例如

    docker run -t -i --name test busybox sh 可以用这样的方式等同:

    docker run -ti --name test busybox sh 1.2 Boolean

    Boolean 参数形式如: -d=false。注意,当你声明这个 Boolean 参数时,比如 docker run -d=true,它将直接把启动的 Container 挂起放在后台运行。

    1.3 字符串和数字

    参数如 --name=“” 定义一个字符串,它仅能被定义一次。同类型的如-c=0 定义一个数字,它也只能被定义一次。

    1.4 后台进程

    Docker 后台进程是一个常驻后台的系统进程,值得注意的是 Docker 使用同一个文件来支持客户端和后台进程,其中角色切换通过-d 来实现。这个后台进程是用来管理容器的,使用 Docker --help 可以得到更详细的功能参数配置, 如下图:

    [attach] 2474[/attach] Docker 后台进程参数清单如下表:

    参数

    解释

    --api-enable-cors=false

    开放远程 API 调用的 CORS 头信息。这个接口开关对想进行二次开发的上层应用提供了支持。

    -b, --bridge=""

    挂载已经存在的网桥设备到 Docker 容器里。注意,使用 none 可以停用容器里的网络。

    --bip=""

    使用 CIDR 地址来设定网络桥的 IP。注意,此参数和 -b 不能一起使用。

    -D, --debug=false

    开启 Debug 模式。例如:docker -d -D

    -d, --daemon=false

    开启 Daemon 模式。

    --dns=[]

    强制容器使用 DNS 服务器。例如: docker -d --dns 8.8.8.8

    --dns-search=[]

    强制容器使用指定的 DNS 搜索域名。例如: docker -d --dns-search example.com

    -e, --exec-driver="native"

    强制容器使用指定的运行时驱动。例如:docker -d -e lxc

    -G, --group="docker"

    在后台运行模式下,赋予指定的 Group 到相应的 unix socket 上。注意,当此参数 --group 赋予空字符串时,将去除组信息。

    -g, --graph="/var/lib/docker"

    配置 Docker 运行时根目录

    -H, --host=[]

    在后台模式下指定 socket 绑定,可以绑定一个或多个 tcp://host:port, unix:///path/to/socket, fd://* 或 fd://socketfd。例如:

    $ docker -H tcp://0.0.0.0:2375 ps 或者

    $ export DOCKER_HOST="tcp://0.0.0.0:2375" $ docker ps

    --icc=true

    启用内联容器的通信。

    --ip="0.0.0.0"

    容器绑定 IP 时使用的默认 IP 地址

    --ip-forward=true

    启动容器的 net.ipv4.ip_forward

    --iptables=true

    启动 Docker 容器自定义的 iptable 规则

    --mtu=0

    设置容器网络的 MTU 值,如果没有这个参数,选用默认 route MTU,如果没有默认 route,就设置成常量值 1500。

    -p, --pidfile="/var/run/docker.pid"

    后台进程 PID 文件路径。

    -r, --restart=true

    重启之前运行中的容器

    -s, --storage-driver=""

    强制容器运行时使用指定的存储驱动,例如,指定使用 devicemapper, 可以这样:

    docker -d -s devicemapper

    --selinux-enabled=false

    启用 selinux 支持

    --storage-opt=[]

    配置存储驱动的参数

    --tls=false

    启动 TLS 认证开关

    --tlscacert="/Users/dxiao/.docker/ca.pem"

    通过 CA 认证过的的 certificate 文件路径

    --tlscert="/Users/dxiao/.docker/cert.pem"

    TLS 的 certificate 文件路径

    --tlskey="/Users/dxiao/.docker/key.pem"

    TLS 的 key 文件路径

    --tlsverify=false

    使用 TLS 并做后台进程与客户端通讯的验证

    -v, --version=false

    显示版本信息

    注意,其中带有 [] 的启动参数可以指定多次,例如

    $ docker run -a stdin -a stdout -a stderr -i -t ubuntu /bin/bash

    1. Docker 命令行探秘

    2.1 环境信息相关

    info

    使用方法: docker info

    例子:

    [fedora@docker-devel-cli docker]$ sudo docker -D info Containers: 0 Images: 32 Storage Driver: devicemapper Pool Name: docker-252:1-130159-pool Data file: /var/lib/docker/devicemapper/devicemapper/data Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata Data Space Used: 1616.9 Mb Data Space Total: 102400.0 Mb Metadata Space Used: 2.4 Mb Metadata Space Total: 2048.0 Mb Execution Driver: native-0.2 Kernel Version: 3.11.10-301.fc20.x86_64 Debug mode (server): false Debug mode (client): true Fds: 11 Goroutines: 14 EventsListeners: 0 Init SHA1: 2c5adb59737b8a01fa3fb968519a43fe140bc9c9 Init Path: /usr/libexec/docker/dockerinit Sockets: [fd://] 使用说明:

    这个命令在开发者报告 Bug 时会非常有用,结合 docker vesion 一起,可以随时使用这个命令把本地的配置信息提供出来,方便 Docker 的开发者快速定位问题。

    version

    使用方法: docker version

    使用说明:

    显示 Docker 的版本号,API 版本号,Git commit, Docker 客户端和后台进程的 Go 版本号。

    2.2 系统运维相关

    attach

    使用方法: docker attach [OPTIONS] CONTAINER

    例子:

    $ ID=$(sudo docker run -d ubuntu /usr/bin/top -b) $ sudo docker attach $ID top - 17:21:49 up 5:53, 0 users, load average: 0.63, 1.15, 0.78 Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie %Cpu(s): 1.0 us, 0.7 sy, 0.0 ni, 97.7 id, 0.7 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem: 2051644 total, 723700 used, 1327944 free, 33032 buffers KiB Swap: 0 total, 0 used, 0 free. 565836 cached Mem

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 19748 1280 1008 R 0.0 0.1 0:00.04 top $ sudo docker stop $ID 使用说明:

    使用这个命令可以挂载正在后台运行的容器,在开发应用的过程中运用这个命令可以随时观察容器內进程的运行状况。开发者在开发应用的场景中,这个命令是一个非常有用的命令。

    build

    使用方法:docker build [OPTIONS] PATH | URL | -

    例子:

    $ docker build . Uploading context 18.829 MB Uploading context Step 0 : FROM busybox ---> 769b9341d937 Step 1 : CMD echo Hello world ---> Using cache ---> 99cc1ad10469 Successfully built 99cc1ad10469 使用说明:

    这个命令是从源码构建新 Image 的命令。因为 Image 是分层的,最关键的 Base Image 是如何构建的是用户比较关心的,Docker 官方文档给出了构建方法,请参考这里。

    commit

    使用方法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

    例子:

    $ sudo docker ps ID IMAGE COMMAND CREATED STATUS PORTS c3f279d17e0a ubuntu:12.04 /bin/bash 7 days ago Up 25 hours 197387f1b436 ubuntu:12.04 /bin/bash 7 days ago Up 25 hours $ docker commit c3f279d17e0a SvenDowideit/testimage:version3 f5283438590d $ docker images | head REPOSITORY TAG ID CREATED VIRTUAL SIZE SvenDowideit/testimage version3 f5283438590d 16 seconds ago 335.7 MB 使用说明:

    这个命令的用处在于把有修改的 container 提交成新的 Image,然后导出此 Imange 分发给其他场景中调试使用。Docker 官方的建议是,当你在调试完 Image 的问题后,应该写一个新的 Dockerfile 文件来维护此 Image。commit 命令仅是一个临时创建 Imange 的辅助命令。

    cp

    使用方法: cp CONTAINER:PATH HOSTPATH

    使用说明:

    使用 cp 可以把容器內的文件复制到 Host 主机上。这个命令在开发者开发应用的场景下,会需要把运行程序产生的结果复制出来的需求,在这个情况下就可以使用这个 cp 命令。

    diff

    使用方法:docker diff CONTAINER

    例子:

    $ sudo docker diff 7bb0e258aefe

    C /dev A /dev/kmsg C /etc A /etc/mtab A /go A /go/src A /go/src/github.com A /go/src/github.com/dotcloud .... 使用说明:

    diff 会列出 3 种容器内文件状态变化(A - Add, D - Delete, C - Change )的列表清单。构建 Image 的过程中需要的调试指令。

    export

    使用方法:docker export CONTAINER

    例子:

    $ sudo docker export red_panda > latest.tar 使用说明:

    把容器系统文件打包并导出来,方便分发给其他场景使用。

    images

    使用方法:docker images [OPTIONS] [NAME]

    例子:

    $ sudo docker images | head REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE 77af4d6b9913 19 hours ago 1.089 GB committest latest b6fa739cedf5 19 hours ago 1.089 GB 78a85c484f71 19 hours ago 1.089 GB $ docker latest 30557a29d5ab 20 hours ago 1.089 GB 0124422dd9f9 20 hours ago 1.089 GB 18ad6fad3402 22 hours ago 1.082 GB f9f1e26352f0 23 hours ago 1.089 GB tryout latest 2629d1fa0b81 23 hours ago 131.5 MB 5ed6274db6ce 24 hours ago 1.089 GB 使用说明:

    Docker Image 是多层结构的,默认只显示最顶层的 Image。不显示的中间层默认是为了增加可复用性、减少磁盘使用空间,加快 build 构建的速度的功能,一般用户不需要关心这个细节。

    import / save / load

    使用方法:

    docker import URL|- [REPOSITORY[:TAG]] docker save IMAGE docker load 使用说明:

    这一组命令是系统运维里非常关键的命令。加载 (两种方法: import, load),导出 (一种方法: save) 容器系统文件。

    inspect

    使用方法:

    docker inspect CONTAINER|IMAGE [CONTAINER|IMAGE...] 例子:

    $ sudo docker inspect --format='{{.NetworkSettings.IPAddress}}' $INSTANCE_ID 使用说明:

    查看容器运行时详细信息的命令。了解一个 Image 或者 Container 的完整构建信息就可以通过这个命令实现。

    kill

    使用方法:

    docker kill [OPTIONS] CONTAINER [CONTAINER...] 使用说明:

    杀掉容器的进程。

    port

    使用方法:

    docker port CONTAINER PRIVATE_PORT 使用说明:

    打印出 Host 主机端口与容器暴露出的端口的 NAT 映射关系

    pause / unpause

    使用方法:

    docker pause CONTAINER 使用说明:

    使用 cgroup 的 freezer 顺序暂停、恢复容器里的所有进程。详细 freezer 的特性,请参考官方文档。

    ps

    使用方法:

    docker ps [OPTIONS] 例子:

    $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4c01db0b339c ubuntu:12.04 bash 17 seconds ago Up 16 seconds webapp d7886598dbe2 crosbymichael/redis:latest /redis-server --dir 33 minutes ago Up 33 minutes 6379/tcp redis,webapp/db 使用说明:

    docker ps 打印出正在运行的容器,docker ps -a 打印出所有运行过的容器。

    rm

    使用方法:

    docker rm [OPTIONS] CONTAINER [CONTAINER...] 例子:

    $ sudo docker rm /redis /redis 使用说明:

    删除指定的容器。

    rmi

    使用方法:

    docker rmi IMAGE [IMAGE...] 例子:

    $ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE test1 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) test2 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)

    $ sudo docker rmi fd484f19954f Error: Conflict, cannot delete image fd484f19954f because it is tagged in multiple repositories 2013/12/11 05:47:16 Error: failed to remove one or more images

    $ sudo docker rmi test1 Untagged: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8

    $ sudo docker rmi test2 Untagged: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8

    $ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)

    $ sudo docker rmi test Untagged: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8 Deleted: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8 使用说明:

    指定删除 Image 文件。

    run

    使用方法:

    docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 例子:

    $ sudo docker run --cidfile /tmp/docker_test.cid ubuntu echo "test" 使用说明:

    这个命令是核心命令,可以配置的参数多达 28 个参数。详细的解释可以通过 docker run --help 列出。官方文档中提到的 Issue 2702:"lxc-start: Permission denied - failed to mount" could indicate a permissions problem with AppArmor. 在最新版本的 Dcoker 中已经解决。

    start / stop / restart

    使用方法:

    docker start CONTAINER [CONTAINER...] 使用说明:

    这组命令可以开启 (两个:start, restart),停止 (一个:stop) 一个容器。

    tag

    使用方法:

    docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/] NAME[:TAG] 使用说明:

    组合使用用户名,Image 名字,标签名来组织管理 Image。

    top

    使用方法:

    docker top CONTAINER [ps OPTIONS] 使用说明:

    显示容器內运行的进程。

    wait

    使用方法:

    docker wait CONTAINER [CONTAINER...] 使用说明:

    阻塞对指定容器的其他调用方法,直到容器停止后退出阻塞。

    2.3 日志信息相关

    events

    使用方法:

    docker events [OPTIONS] 使用说明:

    打印容器实时的系统事件。

    history

    使用方法:

    docker history [OPTIONS] IMAGE 例子:

    $ docker history docker IMAGE CREATED CREATED BY SIZE 3e23a5875458790b7a806f95f7ec0d0b2a5c1659bfc899c89f939f6d5b8f7094 8 days ago /bin/sh -c #(nop) ENV LC_ALL=C.UTF-8 0 B 8578938dd17054dce7993d21de79e96a037400e8d28e15e7290fea4f65128a36 8 days ago /bin/sh -c dpkg-reconfigure locales && locale-gen C.UTF-8 && /usr/sbin/update-locale LANG=C.UTF-8 1.245 MB be51b77efb42f67a5e96437b3e102f81e0a1399038f77bf28cea0ed23a65cf60 8 days ago /bin/sh -c apt-get update && apt-get install -y git libxml2-dev python build-essential make gcc python-dev locales python-pip 338.3 MB 4b137612be55ca69776c7f30c2d2dd0aa2e7d72059820abf3e25b629f887a084 6 weeks ago /bin/sh -c #(nop) ADD jessie.tar.xz in / 121 MB 750d58736b4b6cc0f9a9abe8f258cef269e3e9dceced1146503522be9f985ada 6 weeks ago /bin/sh -c #(nop) MAINTAINER Tianon Gravi <[email] admwiggin@gmail.com[/email]>

    • mkimage-debootstrap.sh -t jessie.tar.xz jessie http://http.debian.net/debian 0 B 511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158 9 months ago 0 B

    使用说明:

    打印指定 Image 中每一层 Image 命令行的历史记录。

    logs

    使用方法:

    docker logs CONTAINER 使用说明:

    批量打印出容器中进程的运行日志。

    2.4 Dcoker Hub 服务相关

    login

    使用方法:

    docker login [OPTIONS] [SERVER] 使用说明:

    登录 Hub 服务。

    pull / push

    使用方法:

    docker push NAME[:TAG] 使用说明:

    通过此命令分享 Image 到 Hub 服务或者自服务的 Registry 服务。

    search

    使用方法:

    docker search TERM 使用说明:

    通过关键字搜索分享的 Image。

    1. 总结

    通过以上 Docker 命令行的详细解释,可以强化对 Docker 命令的全面理解。考虑到 Docker 命令行的发展变化非常快,读者可以参考官方的命令行解释文档更新相应的命令行解释。另外,通过以上 Docker 命令行的分析,可以知道 Docker 命令行架构设计的特点在于客户端和服务端的运行文件是同一个文件,内部实现代码应该是重用的设计。笔者希望开发者在开发类似的命令行应用时参考这样的设计,减少前后台容错的复杂度。

    参考文献

    [1] https://docs.docker.com/reference/commandline/cli/

    [2] https://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing

    [3] https://en.wikipedia.org/wiki/CIDR_notation#CIDR_notation

  • 如 [url=home.php?mod=space&uid=20986]@ 西点 [/url] 所说,需要写上你用哪个账户去连接 TFS

    C:\a>tf workspace /? TF - Team Foundation Version Control Tool, Version 10.0.30319.1 Copyright (c) Microsoft Corporation. All rights reserved.

    Creates, deletes, displays, or modifies properties and mappings associated with a workspace.

    tf workspace /new [/noprompt] [/template:workspacename[;workspaceowner]] [/computer:computername] [/comment:("comment"|@commentfile)] [workspacename[;workspaceowner]] [/collection:TeamProjectCollectionUrl] [/permission:(Private|PublicLimited|Public)] [/login:username,[password]]

    tf workspace /delete [/collection:TeamProjectCollectionUrl] workspacename[;workspaceowner] [/login:username,[password]]

    tf workspace [/collection:TeamProjectCollectionUrl] [/comment:("comment"|@commentfile)] [/newname:workspacename] [workspacename[;workspaceowner]] [/newowner:ownername] [/computer:computername] [/permission:(Private|PublicLimited|Public)] [/login:username,[password]]

    C:\a>

  • @Laruence: 这些个东西和概念本来没错, 但是很多人脱离实际使用场景有目的的鼓吹和推广, 才造就了不少的"无用"的误会.

  • 呵呵,别太在意。

    多举办几次就有经验了。这次还是要感谢你。没有你的组织,大家很难有机会聚到一起。

  • 是否上市这个谁都说不准。另外即便上市,对于普通员工来说,钱也不会很多。上市与否与公司的福利没太大关系。

    华为没上市,但是华为内部员工持股分红收入还是很多的,但是里边加班也挺严重的

  • 上海银行配置管理员职位 at 2014年10月16日

    上海的配置管理职位还是不少的。 为啥我看到很多不错的职位都在上海。。。。你们却只看到北京多。。。。

    苍天大地。。

  • 南京离苏州也就一个小时车程吧。北上广人力成本太高,IT 公司都搬到苏州去了。。。。。

  • svn 上传代码变慢如何解决 at 2014年10月16日

    这个影响很大?

  • 他们直接就是在 eclipse 点一下就直接发不出去了?

    即便是这样,他们的项目在 eclipse 中肯定也是用了某种构建工具,你看看他们用的是什么。

  • 先弄清楚删了什么东西

  • 如果市场不行,又确实好用。不如开源了。

    估计 IBM 不会这么干

  • hudson 如何实现单点登陆 at 2014年09月28日

    和 LDAP 集成么?使用域帐户登录?

  • 都可以上传附件啊。是不是附件类型不支持。你想上传附件的后缀是?

    最好压缩成一个 zip 或者 rar 文件。

  • N+5 的补偿,还是比较可以的。

  • 你能把头像换一下嘛,好让我们不对你产生幻想。。。。[哈哈]

  • 上海银行配置管理员职位 at 2014年09月24日

    [i=s] 本帖最后由 laofo 于 2014-9-24 10:30 编辑

    你可以认真的算一下一个月到底有多少加班费,有没有可能比工资还高

    另外就是即便加班费再多,那也是牺牲了自己的时间和辛苦换来的。

    有些人天生就反感、不愿意加班。:hug:

  • 上海银行配置管理员职位 at 2014年09月23日

    工资太低了。