All posts by dotte

知乎上赞同数最高的999个回答

爬下了知乎精华里的所有回答,按赞同数从高到低排名,分享于此。手机看的话可以移步到这里,方便直接用知乎客户端查看,避免浏览器和客户端之间的跳转。

干货


8 好朋友之间是如何变淡的?63053 明爱暗恋补习社长
15 吃是否具备教养内涵?56706 匿名用户
17 人截肢了以后会有什么感觉?56155 大树下的小孩子
21 现实可以有多美好?52215 匿名用户
23 长得凶是一种怎样的体验?51251 一笑风云过
56 人到底可以有多坏?41007 匿名用户
75 如何评价陈赫离婚?37373 匿名用户
91 如何长时间高效学习?35253 匿名用户
92 如何系统地学习股市?35180 刘鹏程Sai.L
95 女生怎么健身锻造好身材?35063 北京小风子
100 网络上有哪些免费的教育资源?34341 闹不住菇在搬砖
103 你见过最丑的设计是什么?33829 发条橘子667
110 牢狱生活是种什么体验?33081 匿名用户
141 自控力极差的人如何自救?30733 自嗨的多罗
145 白客有可能当影帝吗?30364 叫兽易小星
155 和不成熟男人谈恋爱是什么感觉?30007 张斯托洛夫斯基
178 为什么要给马钉马掌?28749 Devymex Wang
204 现实可以有多美好?27277 Kent Zeng
208 异地恋如何维持?27043 璇玑
225 鼠疫究竟有多可怕?26499 咖喱鸡
229 思念到极致是什么感觉?26382 玲珑邪僧
242 什么是孤独?25828 张春
244 提车了,下一步需要做什么?25698 汽车奇谈高小强
256 月入十万,难吗?25469 艾法
269 必胜客贵吗?25184 拉尔文
275 这是一个看脸的世界吗?24791 Charles Wang
290 你最喜欢的故事是什么?24229 木剑尚小二
294 富人和穷人能在一起吗?24082 匿名用户
329 人这一生为什么要努力?22965 sym physicheng
343 装修有哪些建议?22657 大鹏金翅
344 老师可以有多坏?22641 indarf
352 如何模仿翻译腔?22469 秋喵千
361 中国真的有很多穷人吗?22167 禁止禁止
386 如何辨认身边的聪明人?21619 谢熊猫君
417 人能控制自己的长相吗?20733 米茶茶茶茶茶
423 你的车辆进化史是什么样的?20675 桑土公的肚子
438 有哪些网上自学课程的好网站?20432 学习网站收集控
439 女人的温柔从哪里体现?20412 匿名用户
440 怎么练好英语口语?20403 寺主人
453 一个女孩要怎样才算得上精致?20107 明珠一颗孙小美
458 你遇过哪些概率极小的事?20076 独钓寒江雪
466 人到底可以有多坏?19917 匿名用户
472 汉族有哪些民族天赋?19797 英俊的陈双獒
483 一个人旅行应该怎样自拍?19563 orange paranoid
498 年轻一定要奋斗吗?19340 寺主人
511 女性年纪大了就不好嫁人了吗?19173 克里斯蒂娜酱
519 当过第三者是什么体验?19076 匿名用户
538 为什么有些美女不上相?18808 命硬的eno
550 如何戒掉装逼?18633 朱炫
556 裸睡时如果地震了怎么办?18545 土豆在蜀国
564 土豪可以多任性?18389 阿萨谢六
568 外国人写汉字有多难?18341 David Rand
571 癌痛有多痛?18305 匿名用户
587 葫芦娃的爷爷叫什么?18010 徐佳杰Pierre
591 能吃是一种怎样的体验?17912 一笑风云过
593 你为什么买日本车?17905 匿名用户
612 什么是「少女心」?17625 王诺诺
625 有哪些简洁的人生建议?17458 周白之白
632 贫穷无法改变吗?17329 山羊月
638 旅行真的能使人改变吗?17236 北京小风子
644 贫穷会让孩子感到自卑吗?17165 山抹微云君
653 猫有时间概念吗?17095 Lydia Yang
710 老师可以有多坏?16313 heather
716 什么是「少女心」?16240 deMONster
721 坐牢是怎样一种体验?16182 匿名用户
722 如何优雅地吃方便面?16175 匿名用户
753 如何可以做好盒饭外卖?15861 大虎锤子
763 如何恰当地表示愤怒?15733 巴赫爱喝胡辣汤
787 人为什么要善良呢?15444 苏莞尔
789 有哪些易读的英文著作?15414 恶喵的奶爸
808 月入十万,难吗?15276 匿名用户
822 苦难有什么价值?15167 张春
830 开一家工厂是一种怎样的体验?15087 煎了个蛋的Cea
854 女生化妆如何入门?14946 Shuen KUNG
867 小时候你干过哪些坏事?14813 蓬莱山辉夜
872 背单词是必须的吗?14777 郑雨薇
873 如何克服自卑?14770 凤红邪
879 如何健康地丰胸?14714 夏奈
882 怎样抱女孩子?14708 马小弱
891 如何优雅地送妹子礼物?14619 一颗林萌
895 有哪些有趣的小家具?14552 菠萝斑马
912 如何评价冯巩?14413 不言调
914 如何克服自卑?14412 匿名用户
915 携程网靠谱吗?14412 李淼
919 网络兼职靠谱吗?14385 半桶水
968 聪明有什么坏处?14010 谢左右
977 离婚对孩子的影响?13946 匿名用户
983 女生容易被什么感动?13916 哆啦A梦的时光机
985 哪些广告打动过你?13887 路边行走的好心人
994 哪些广告打动过你?13830 手感王
from:http://lanbing510.info/2016/04/14/ZhiHu-Good-Answers.html

Docker:带给现代开发人员的福利

Docker 就像是用于 DevOps 的一把瑞士军刀,这一点已得到充分证明。但 Docker 托管的应用程序容器的用途不仅是在云中部署服务器。Docker 容器还可以在许多常见的开发场景中帮助开发和显著提高生产力。本教程将重点介绍 Docker,了解从开发人员角度讲它有何用途。我将介绍 Docker,解释基本概念和术语,并提供一系列实际的开发示例。

您会看到:

  • Docker 可以可简化 Node.js Web 应用程序编码。
  • 您可以使用 Docker 在 Apache Tomcat 服务器上快速创建和测试 Java™ Enterprise Edition (Java EE) 应用程序。
  • Docker 可以通过 Bottle 框架加快 Python Web 应用程序的编码、测试和开发。
  • 您可以通过使用一个 Docker 容器,在几分钟内创建并测试一个具有 NoSQL 数据库后端的完整的三层 Node.js 应用程序。

Docker、golang 和 Bluemix

阅读配套教程 “使用 Docker 和 Bluemix 容器化 golang 应用程序”,将您的多语言探索扩展到 Go 编程语言。另外,了解通过 IBM Containers for Bluemix 将 Docker 化的三层应用程序部署到 Bluemix™ 有都没容易。

您可以在单个 Linux 系统上获得所有这些收益,而不会妨碍任何预设的配置。在了解一些示例后,您就能够轻松地运行各种 Docker 容器来提高日常开发工作流中的生产力。

Docker 基础

Docker 是一个容器管理器。容器将应用程序和它的依赖项捆绑在一起。您从一个存储在存储库中的镜像实例化每个容器,在主机操作系统内隔离的虚拟化环境中运行容器。因为虚拟化技术(通常)是轻量型的,所以您可以同时运行多个容器:

该图演示了 Docker 容器管理器

理解基本术语

了解镜像与容器之间的区别很重要。这两个概念紧密相关,但初学者常常难以了解它们之间的区别。

镜像 是一个静态的层集合。没有任何运行时行为与镜像关联。镜像存储在存储库中(例如 Docker Hub)。

容器 是一个从镜像启动的运行实例。尽管容器可以停止(并在此盘上临时冻结其状态),但它仍是一个容器。

潜在的混淆源于一个事实,那就是通过提交和保存容器,您可以将容器转换为镜像。在这种情况下,您可以将得到的镜像想作是运行的容器的 “冻干 (freeze-dried)” 版本。

您可以使用 Docker 容器管理器执行以下操作:

  • 从镜像运行容器
  • 检查和操作运行的容器的属性
  • 停止运行的容器
  • 在运行的容器内执行额外的任务
  • 启动或重新启动运行的容器
  • 执行其他许多管理任务

容器化的应用程序几乎可以在任何地方运行:桌面 PC 上、服务器上、公共云中,甚至是在一些移动电话上。

学习更多知识。开发更多项目。联系更多同行。

全新的 developerWorks Premium 会员计划提供了强大的开发工具和资源,包括 500 篇通过 Safari Books Online 提供的顶级技术文章(其中超过 100 篇文章是专门面向 Web 开发人员的)、最重要开发人员活动的大幅折扣、最新的 O’Reilly 大会的视频回放,等等。立即注册

Linux 目前是得到最广泛使用和支持的 Docker 平台。Docker 所管理的容器化(轻量型虚拟化)技术在 Linux 平台上最成熟,使用了最新的 Linux 特性,比如 控制组命名空间

如何运行 Docker

您可以通过 docker 命令行客户端来运行 Docker 容器管理器,该客户端有许多可用的开关和选项。这是运行容器化应用程序镜像(在这个例子中是 MySQL 数据库)的一个简化的命令:

docker run -d mysql:5.5

Docker 项目运行着可公开访问的 Docker Hub。用户可以注册并创建自己的容器化应用程序镜像存储库,然后推送镜像来供大家共同使用。例如,您可以找到 Tomcat 服务器、Node.js 和大多数流行的开源数据库的镜像。Docker Hub 的操作理念与 GitHub 相同,因为应用程序镜像是全球 DevOps 和开发人员社区共享和协同创建的。

举例而言,运行 docker run -d mysql:5.5 命令时,如果还没有将 mysql(5.5 版)容器化应用程序镜像存储在本地,就会自动从 Docker Hub 拉取(下载)它。

构建容器化应用程序镜像

还可以使用 docker 命令行客户端来构建容器化应用程序镜像。一种方式是从 Dockerfile 构建镜像 — 一个包含如何安装、设置和配置一个应用程序和它的依赖项的说明的文本文件。

使用 docker 命令行客户端构建容器化镜像的另一种方法是以交互方式设计它们。您在一个运行的容器内手动安装和配置一个应用程序和它的依赖项,然后提交容器并保存为镜像。

一个 Docker 镜像包含一些层,每层大体相当于在安装一组应用程序期间写入磁盘的更改。Docker 管理这些层,并帮助在添加或删除这些镜像时高效地存储和重用。举例而言,一个 mysql 镜像中的层可能包含 Linux 操作系统、Perl、共享库、MySQL 安装和一种基本的 MySQL 配置:

该图演示了一个容器化镜像中的层

Dockerfile 构建容器化镜像或设计自定义容器时,通常不会从头开始。相反,您的工作以现有的 Dockerfile 或一个来自 Docker Hub 的镜像为基础。这样,开发人员和操作人员就能够以彼此的工作为基础,协同创建和管理一组有用的镜像。

将镜像发送到镜像存储库(比如 Docker Hub)的命令是 docker push。下载镜像以供本地使用的命令是 docker pull


开始之前

即使使用 Java、Tomcat、Node.js、Python 和 CouchDB 进行开发,也不需要安装它们中的任何一个。这是在开发工作流中使用 Docker 的美妙之处。

在开始之前,需要一个安装并运行 Docker 的 Linux 系统。要安装 Docker,可以按照适合您的 Linux 发行版的 安装说明 进行操作。

如果无法直接访问 Linux 系统,可以依靠云。大多数云主机都提供了随时可运行的虚拟服务器或虚拟机,只需几分钟就可以为它们配备 Linux 并(通过 SSH 或基于 Web 的终端)连接到它们。这些主机通常与 Docker 兼容。

本教程中的示例假设您在 Linux 系统上运行 Docker。如果您已经在 Mac OS X 或另一个非 Linux 系统上运行 Docker,您的容器可能会在一个由虚拟机管理程序虚拟化的额外虚拟机(常常为 VirtualBox)内运行。在这种情况下,您需要相应地修改示例中的命令才能继续操作。

检查您的 Docker 版本

运行以下命令来检查您的 Docker 版本:

docker --version

高效的层管理

拉取镜像后,请注意指明已存在一个层的消息。Docker 通过层来管理在镜像创建期间写入磁盘的更改,这有助于高效地管理镜像更改集。例如,基础 Ubuntu 镜像或核心实用程序的安装可被多个镜像共享 — 节省了宝贵的磁盘空间和下载时间。

如果您运行 1.8.3 或更高版本,您的系统现在已经设置好。即使使用 Java、Tomcat、Node.js、Python 和 Apache CouchDB 进行开发,也不需要安装或卸载它们中的任何一个。这是在开发工作流中使用 Docker 的美妙之处。

拉取镜像

第一次从 Docker Hub pull(拉取)一个镜像时,必须将它下载到本地 PC 的存储库。根据您的网络访问速度,下载可能很耗时,但对镜像的后续使用将会很快。

运行以下命令来拉取您将在示例中使用的所有镜像:

docker pull node:0.10.40

docker pull java

docker pull tomcat:8

docker pull webratio/ant

docker pull python:3.5

docker pull frodenas/couchdb

有关每个镜像的更多信息,请访问 Docker Hub 的 nodejavatomcatwebratio/antpythonfrodenas/couchdb 页面。

现在,在设置完成后,就可以使用 Docker 处理一个 Node.js 应用程序来进行我们的探索了。


快速设置和开发服务器端 JavaScript 代码

代码发行版中的 javascript 目录(参见 下载)包含一个使用 Node.js 编写的网络商店示例应用程序的源代码。该应用程序(最初由 Lauren Schaefer 设计和编写)使用了 Express Web 框架和 Jade Node 模板引擎。(有关这个应用程序的更多信息,请参阅 “Bluemix 基础:将一个示例 Node.js 应用程序部署到云中。”)通过使用 Docker,您可以在您的计算机上使用这个应用程序,无需安装 Node.js 或它的任何依赖项— 或者排除包安装冲突。

主要程序在 app.js 中。CSS 和关联的 JavaScript 文件在 javascript/public/static 中。Jade 模板在 javascript/view 中。

运行以下命令来安装此应用程序的 Node.js 依赖项:

docker run -it --rm --name lllnode -v "$PWD":/usr/src/myapp -w /usr/src/myapp node:0.10.40 npm install

此命令将会启动 Node 容器,将当前应用程序目录挂载到容器中,然后在应用程序上运行 npm install

  • 基础命令是 docker run � node:0.10.40,它创建一个容器实例并运行您之前拉取的 node:0.10.40 镜像。
  • -it 开关指定您想要一个前台交互式终端。(备用模式是分离的后台进程,可以使用 -d 指定它。)
  • --rm 开关指定执行清理,表示在您退出容器后,Docker 会立即删除它。如果没有指定此开关,该容器会以停止状态持久保存在磁盘上,而且您可以从中断点开始重新启动它。但是,对于忘记删除容器实例的用户而言,重新启动容器是磁盘耗尽的常见来源。如果不使用 --rm,那么任何时候都能运行以下命令来查看您遗留下了多少陈旧的停止容器(数量可能会让您吃惊):
    docker ps -a
  • --name lllnode 选项显式命名容器,这对在其他 Docker 命令中引用该容器很有用。如果没有显式命名容器,Docker 会为它分配一个生成的文本名称 — 这个名称通常没什么意义。您还可以通过内部 ID(一个很长、对人类不友好的十六进制字符串)来引用该容器。
  • -v "$PWD":/usr/src/myapp 选项创建一个卷挂载点。将您当前的工作目录 ($PWD) 挂载为容器内的 /usr/src/myapp。然后可从该容器内访问应用程序的 Node.js 源代码(或您当前的工作目录中可能拥有的其他任何 Node.js 源代码)。
  • -w /usr/src/myapp 选项设置您运行的命令的工作目录。在这个示例中,工作目录更改为挂载的卷。
  • docker run 命令末尾的 npm install 命令在工作目录上的容器内运行。最终结果是您通过容器在当前目录上运行 npm install— 而不安装 Node.js 或它的任何前提软件。

在命令输出中,您可以看到 npm 正在运行的所有依赖项:

安装 Node.js 应用程序依赖项的屏幕截图

在安装依赖项后,可以通过容器运行该应用程序。使用此命令(将它键入为一行):

docker run -it --rm --name lllnode --env PORT=8011 --net="host" -v 
"$PWD":/usr/src/myapp -w /usr/src/myapp node:0.10.40 node app.js

这个命令类似于您之前运行的命令。但请注意,要在容器内运行的命令现在是 node app.js,它将启动应用程序。

查看 app.js 的内容。您会找到以下行:

var appEnv = cfenv.getAppEnv();
app.listen(appEnv.port, appEnv.bind, function() {
   console.log("server starting on " + appEnv.url);
});

这些行导致 Express Web 服务器在 PORT 环境变量指定的端口上监听。为了在容器中设置此环境变量,您刚运行的 docker 命令使用 --env PORT=8011 选项。

此外,该命令的 --net="host" 选项导致容器使用主机操作系统内部的网络堆栈(仅用于开发用途)。然后该应用程序在主机上的端口 8011 上进行监听。

在浏览器中访问 http://localhost:8011/,您可以在其中看到基于运行的容器的 Lauren’s Lovely Landscapes 印刷品商店:

Lauren's Lovely Landscapes 的 Node.js 的屏幕截图

您随时可以退出容器来修改代码或修复错误,然后再次运行容器— 所有操作在几秒内即可完成,不会让开发环境变得杂乱。


在几秒内从 Node.js 转换为 Java EE

现在您已确信 Docker 只需几秒即可启动并运行一个 Node.js 应用程序,您可能想知道它如何更轻量型地处理一些工作 — 比如 Java EE 开发。很高兴为您解答。

假设您刚刚阅读了我的 “使用 Vaadin 实现全堆栈 Java Web 开发” 教程,并渴望试用我的 Java EE Vaadin 示例。但您没有安装 JDK,而且不想因为花一下午时间笨拙地安装一个 JDK 而将系统弄得一团糟。Docker 可以拯救您!

代码下载 的 java 目录中的 ArticleViewer.war 文件是一个包含来自 Vaadin 教程的多个 Vaadin UI 组件的应用程序。您可以通过 Docker 在 Tomcat 8 服务器上运行 ArticleViewer.war。第一步是从您之前拉取的镜像启动一个 Tomcat 8 容器实例:

docker run -it --rm -p 8888:8080 --name=tomcat_server -v $PWD:/mnt tomcat:8

这个命令现在看起来可能很熟悉。为了更方便引用,容器名为 tomcat_server。您目前的工作目录在容器内挂载为 /mnt。

-p 8888:8080 选项告诉 Docker 将主机系统的端口 8888 映射到容器的(内部)端口 8080。在 tomcat 镜像的 Dockerfile 中,您可以看到 Tomcat 在容器内的端口 8080 上执行监听。

通过浏览器访问 http://localhost:8888/,您可以在其中看到熟悉的 Tomcat 8 服务器欢迎页面:

在 Docker 容器内运行的 Tomcat 的屏幕截图

请注意您保持容器在交互式模式下运行(通过 -it 开关)。在该模式下,会在标准输出中连续显示日志,以方便开发。

附加到一个运行的 Docker 容器

现在,容器内挂载的目录 /mnt 是您当前的工作目录,ActiveViewer.war 位于该目录中。

将 ActiveViewer.war 从 /mnt 复制到 Tomcat 8 的 webapps 目录,它会在这里自动部署:

docker exec tomcat_server cp /mnt/ArticleViewer.war /usr/local/tomcat/webapps

这一次不需要使用 docker run 命令,因为 tomcat_server 容器已在运行。相反,您连接到运行的容器并运行一个命令。所以您使用了 docker exec,提供 cp /mnt/ArticleViewer.war /usr/local/tomcat/webapps 命令作为整个命令的最后一部分。

观看 tomcat_server 窗口中的日志,查看来自 ArticleViewer 应用程序部署的日志轨迹。

现在,在浏览器中访问应用程序的 URL(http://localhost:8888/ArticleViewer/)来打开正在运行的应用程序。单击左侧列表中的一篇文章,在右侧查看文章内容:

在 Docker 所启用的 Tomcat 8 上运行的 Vaadin article-viewer 应用程序

在继续后面的操作之前,停下来思考片刻。您没有在系统上下载或安装 JDK 或 Tomcat 8。只需几秒即可在一个功能全面的 Tomcat 8 服务器上运行 Vaadin 应用程序的代码 — 这得益于 Docker。

为 Tomcat 8 开发和构建 Java Web 应用程序

您刚才已经看到,可以使用 Docker 轻松地部署用于测试的 Web 应用程序。也可以通过 Docker 同样轻松地从 Java 源代码编译和构建 Web 应用程序 — 同上面一样,无需让您的开发系统变得一团糟或花很长时间安装前提软件。

将目录更改为 代码发行版 中的 java/LaurenLandscapesJava。这个目录中包含您在 Node.js 示例中看到的 Lauren’s Lovely Landscapes 应用程序的一个 Java 版本。(如果想了解该代码的更详细描述,请阅读 “Bluemix 基础:将一个示例 Java 应用程序部署到云中”。)

build.xml 文件是一个标准的 Apache Ant 构建文件,它包含编译代码和构建 WAR 文件的指令。通过使用 webratio Apache Ant 镜像,可以在更改代码后(或其他任何时刻)快速编译和构建 WAR:

docker run -it --rm -v "$PWD":/mnt webratio/ant bash -c 'cd /mnt; ant'

您现在已经熟悉了这个 docker run 命令中的所有内容。该命令在作为 /mnt 挂载在容器内的当前工作目录内运行 Ant 构建工具。Ant 编译 src 子目录中的所有 Java 源代码,然后构建并绑定 WAR 文件,将它作为 lauren.war 放在 dist 子目录中。

将 lauren.war 从 java/LaurenLandscapesJava/dist 目录复制到 java 目录:

cp dist/lauren.war  ..

您可以使用此命令将 lauren.war 应用程序部署到 Tomcat 8:

docker exec tomcat_server cp /mnt/lauren.war /usr/local/tomcat/webapps

此命令附加到运行的 tomcat_server 容器,并将 lauren.war 文件复制到 Tomcat 8 的 webapps 子目录中用于自动部署。

现在,在浏览器中访问 http://localhost:8888/lauren/,您可以在其中看到在您的 Docker 化 Tomcat 8 上运行的 Lauren’s Lovely Landscape 的 Java 版本。


从 Java 切换到 Python

假设作为一位多语言开发人员的您希望暂时不执行 Java 编码,探索 Python Bottle Web Framework 提供的可能性。为了帮助您快速探索 Python Web 应用程序开发,避免麻烦的安装和依赖项带来的痛苦,Docker 再次挽救了您。

更改到代码发行版的 python/Laurens.Lovely.Landscapes 目录。该目录中包含 Lauren’s Lovely Landscape 应用程序的 Python 版本 — 为 Bottle Web 框架而编写。模板(.tpl 文件)位于 views 子目录中。(有关该代码的更多信息,请查阅 “Bluemix 和 DevOps Services 简介,第 1 部分:部署和更新一个简单应用程序。”)还可以在关联的 Bluemix DevOps Services 存储库 中找到此代码的一个版本。

运行这个 Python 应用程序 — 而不将 Python 安装在您的系统上— 通过以下 Docker 命令(将它们键入为一行):

docker run -it --rm --name lllpython -p 8000:8000 -v "$PWD":/usr/src/myapp -w 
/usr/src/myapp python:3.5 python wsgi.py

现在在浏览器中访问 http://localhost:8000/,您可以在其中看到正在运行的 Lauren’s Lovely Landscapes 应用程序的 Python 版本。

在 Python 中开发时,您可以更改代码并重新运行之前的命令来进行测试。运行 Docker 容器就像运行安装在本地的开发工具一样快。


添加和启动一个分离的数据库

大多数现代 Web 应用程序都涉及 3 层:浏览器作为客户端;一个中间层应用服务器,比如 Express、Tomcat 8 或 Bottle;以及一个后端数据库。通过使用 Docker,您可以快速添加一个数据库,无需将它安装在您的开发系统上。

在这个最后的示例中,您将一个 Apache CouchDB 数据库服务器添加到您的开发环境中。您可以使用 CouchDB API(它与 IBM Cloudant NoSQL 数据库完全兼容)在本地测试 CouchDB 或 Cloudant 代码。

更改到源代码发行版中的数据库目录。这个目录中包含 Lauren’s Lovely Landscapes 应用程序的高级 Node.js 版本。此版本从 CouchDB(或 Cloudant)抓取印刷品商店的库存信息。该网络商店依据可用印刷品的库存来动态更改外观。(您可以在 “Bluemix 基础:将 Cloudant NoSQL 数据库添加到您的 Node.js 应用程序中” 中找到该代码的更多信息。)

要启动 Apache CouchDB 的一个实例,可以使用这个 Docker 命令(将它键入为一行):

docker run -d --name couchdb -p 5984:5984 -e COUCHDB_USERNAME=user -e 
COUCHDB_PASSWORD=abc123 -e COUCHDB_DBNAME=prints -v $PWD/data:/data frodenas/couchdb

该命令使用 COUCHDB_USERNAMECOUCHDB_PASSWORDCOUCHDB_DBNAME 环境变量来配置实例,以便与代码中使用的值匹配。当前的工作目录在容器内挂载为 /data。CouchDB 将数据写入此目录中,使您可以重新启动容器而不丢失数据。

请注意,在这个示例中,您使用了 -d 选项运行该容器,而不是使用 -it --rm 选项。-d 选项启动分离的 CouchDB 实例。您可以使用 docker ps 命令查看所有正在运行的分离的 docket 容器。

接下来安装应用程序的 Node.js 依赖项:

docker run -it --rm --name llldepends -v "$PWD":/usr/src/myapp -w /usr/src/myapp node:0.10.40 npm install

Apache CouchDB 实例还没有任何数据。使用以下命令(将它键入为一行)来运行 dataseeder.js 代码,该代码在 Apache CouchDB 实例中创建一个文档,以便在商店中填充库存:

docker run -it --rm --name dataseeder --net="host" -v "$PWD":/usr/src/myapp -w 
/usr/src/myapp node:0.10.40 node dataseeder.js

在端口 8011 上运行 lllnode 应用程序:

docker run -it --rm --name lllnode --env PORT=8011 --net="host" -v "$PWD":/usr/src/myapp
-w /usr/src/myapp node:0.10.40 node app.js

在浏览器中访问 http://localhost:8011/ 来打开 Lauren’s Lovely Landscapes 商店:

该屏幕截图表明澳大利亚印刷品已脱销

您可以看到澳大利亚的印刷品已脱销。该产品类别突出显示为红色,无法选中。

为了模拟对澳大利亚印刷品补货的过程,您将访问 Apache CouchDB 文档并直接修改库存水平。

Apache CouchDB 提供了一个简单的 GUI(名为 Futon)来访问存储的文档。在浏览器中访问 http://127.0.0.1:5984/_utils/ 来打开 Futon GUI:

CouchDB Futon GUI 的屏幕截图

在 Futon 中,选择 prints。打开文档并展开编号为 3 的库存项。双击澳大利亚印刷品以打开文档进行编辑。将 quan 字段从 0 更改到 3。单击右侧的小型绿色勾号图标,然后单击左上角的 Save Document

使用 Futon 在 Apache CouchDB 中修改并保存一个 NoSQL 文档的屏幕截图

数据库中的数量更新后,在浏览器中重新加载页面 http://localhost:8011/。您可以看到商店现在已屯满货。澳大利亚印刷品不再标记为红色,而且可以选中。

使用 3 层 Web 应用程序时,Docker 简化了中间层应用程序编码的开发工作流,方便了即时本地部署后端数据库来实现测试。


结束语

在这个竞争激烈的时代,您承受不起没有将 Docker 整合进开发工作流中的生活。通过消除反复安装和卸载相互依赖的复杂开发人员包和工具的需求,Docker 可以缩短您的开发时间和探索时间。利用 Docker 来提高您的多语言开发智商,显著提高您的开发生产力。


下载

描述 名字 大小
代码示例 code_docker.zip 22MB

参考资料

from:http://www.ibm.com/developerworks/cn/web/wa-docker-polyglot-programmers/index.html?ca=drs-

知道创宇研发技能表v2.2

 
  • 2014/3/9 发布

    by @知道创宇(www.knownsec.com) @余弦 & 行之

    知道创宇是国内Geek十足且普遍被认为特别有前途的互联网安全公司,

    动态请关注微信公众号:Lazy-Thought

    • 说明
      • 本技能表为知道创宇研发工程师必备技能
      • 聪明的人会根据每个tip自驱动扩展
      • 不聪明的,坐等别人手把手的人请绕行,不仅不适合知道创宇,也不适合任何有Geek精神的公司
      • attach
        附件标志是我们推荐的附加资源,感谢资源提供者
    • 通用技能
      • 公司与个人
        • 公司是盈利性组织
        • 个人和公司必须双赢
        • 工作
          • 在认同公司理念且能够给公司创造足够价值的基础上,为个人发展而工作
      • 沟通、反馈、责任
        • 一个无沟通能力的人,要么是天才,要么是不可爱的人
        • 反馈要及时
          • 避免出问题不反馈,影响进度
          • 方式
            • 正式的:邮件
            • 临时的:QQ等即时通信
            • 礼貌的:给个电话、短信
        • 工作有大小,责任心无大小
        • 周报的透明
          • 意义:大家互相了解工作与心得,有利于自己的判断与成长
          • 不是单纯的给领导汇报工作
      • 任务四象限,决定优先级
        • 紧急重要
        • 重要不紧急
        • 紧急不重要
        • 不紧急不重要
      • 新事物的敏感性
        • 保持好奇心
        • 不要局限在自己的圈子,适当跨界吸收灵感
        • 订阅国内外优秀博客/资源,鲜果RSS阅读不错
          • 英文很重要
        • 选择性参与一些必要的会议,听必要的主题,讨论必要的话题
      • 成长
        • 对知识的渴望程度决定了前进动力的大小
          • messagebox_warning
            BT常说:「做人一定要狂热!」
          • messagebox_warning
            我说:「一定得贪婪!」
        • 不要矫情,不要浮夸!
        • 和比你厉害的人在一起,和一流的人工作
          • 指点往往是精华
          • messagebox_warning
            杜绝笨蛋爆炸
            • 二流的人招进来的人不太可能是一流的
        • 思考
          • 批判性思考
          • 换位思考
        • idea
          提问的智慧
          • 遇到问题先独立思考,尽最大努力后再提问
          • http://www.wapm.cn/smart-questions/smart-questions-zh.html
        • idea
          小事心态
          • 越基础的事越关键,需要越细心
          • 不要一味盲目追求「高级感」,而忽视「小事」/「简单事」/「基础事」
          • 基础不牢、地动山摇
          • 小事做不好,别提大事
        • idea
          任务拆分
          • 成长过程会经历:能力越大、责任越大、事情越多
          • 思路
            • 拆分细化为多个点
            • 排好优先级

              Arrow Link

            • 加入时间维度:何时完成什么

              Arrow Link

            • 是否需要寻求帮助,谁能帮你,自己单干?

              Arrow Link

            • 任务是否可以切换/并发
            • 自己欠缺什么,立马发现
        • idea
          方法论
          • 完成一件事有好几条途径,优秀的人的途径最短
          • 任务拆分很容易得出做事的方法论
          • 好的「方法论」会让你具备更强的「创造力」!
            • idea
              时刻问自己:「是否具备创造力?」
      • 牛人姿态
        • 即使现在不是牛人,也得具备这样的姿态
        • 这种感觉只能意会
        • 没有一定扎实内功与远见的人很少有这样的姿态
      • messagebox_warning
        完成的定义
        • 比如写个POC
          • 1. 搞懂了目标Web应用漏洞的原理
          • 2. 熟练运用Python各相关模块与机制
          • 3. 熟练了解了HTTP协议
            • HTTP请求
            • HTTP响应
          • 4. 代码写得够规范,让人看起来就是爽
          • 5. 程序经过足够的测试
            • 黑测试
            • 白测试
          • 6. 及时反馈进度
            • 我遇到困难了
            • 我搞定了
          • 7. 更新相关文档,沉淀
      • messagebox_warning
        熟练的定义
        • 比如熟练SQL注入
          • SQL语句这门“语言”能脱离文档顺手写出
          • 主流数据库的SQL特有函数、存储过程、机制我都了如指掌
            • MySQL
            • MSSQL
            • Oracel
            • Postgre
            • Access
            • SQLite
          • 牛逼的工具我不仅用的顺其自然,源码还读过几遍,我能修改
            • sqlmap
          • 我具备创造性,而不仅仅是跟在大牛身后
            • 研究出了几个不错的技巧
            • 发了几篇不错的Paper
            • 对外会议/沙龙等进行了几次分享
            • 写出了自己的相关工具,爽
          • 我实战了N回,遇到了很多奇葩环境,我有足够的信心绕过
          • 以上这些之后,这才叫熟练!其他同理
      • 好书推荐
        • 推荐理由
          • 打通任督二脉的书,怎能不看?
          • 任何科学研究最终必须至少到哲学层面,触碰到上帝的脚
          • 具体技术类书籍请见“专业技能”相关部分
        • 鸡汤类
          • 黑客与画家
            • 印象深刻:设计者的品味
              • 好设计是简单的设计
                • 抓住本质
              • 好设计是永不过时的设计
                • 如果解决方法是丑陋的,那就肯定还有更好的解决方法,只是还没有发现而已
              • 好设计是解决主要问题的设计
              • 好设计是启发性的设计
              • 好设计通常是有点趣味性的设计
              • 好设计是艰苦的设计
              • 好设计是看似容易的设计
              • 好设计是对称的设计
              • 好设计是模仿大自然的设计
              • 好设计是一种再设计
              • 好设计是能够复制的设计
              • 好设计往往是奇特的设计
              • 好设计是成批出现的
              • 好设计常常是大胆的设计
          • 浪潮之巅
            • 感受IT帝国的崛起与没落,我们现在站在又一个互联网浪潮之巅
        • 洁癖类
          • 重构
          • 代码整洁之道
          • 代码大全2
          • 数学之美
        • 敏捷类
          • Rework中文版
            • 37signals团队的敏捷经验
          • 高效程序员的45个习惯
        • 产品类
          • 人人都是产品经理
          • 结网
        • 神书
          • 自私的基因
          • 失控
          • 万物由来
    • 专业技能
      • idea
        原则
        • 至少完整看完与练习好一本书
        • 至少过一遍官方文档
      • bookmark
        基础必备
        • HTTP抓包与调试
          • Firefox插件
            • Firebug
              • 抓包与各种调试
            • Tamper Data
              • 拦截修改
            • Live Http Header
              • 重放功能
            • Hackbar
              • 编码解码/POST提交
            • Modify Headers
              • 修改头部
          • Fiddler
            • 浏览器代理神器
            • 拦截请求或响应
            • 抓包
            • 重放
            • 模拟请求
            • 编码解码
            • 第三方扩展
              • Watcher
                • Web前端安全的自动审计工具
          • Wireshark
            • 各种强大的过滤器语法
          • Tcpdump
            • 命令行的类Wireshark抓包神器
          • Python
            • urllib2
              • 打开请求响应调试
                • 编辑urllib2的do_open里的h.set_debuglevel
                • 改为h.set_debuglevel(1),这时可以清晰看到请求响应数据,包括https
        • 什么是跳转
          • 服务端跳转
            • 302
              • <?php header(“Location: 3.php”); ?>
            • 301
              • <?php header(“HTTP/1.1 301 Moved Permanently”); header(“Location: 2.php”); ?>
            • u=urllib2.urlopen(url)后,u.url能得到服务端跳转后的地址
              • urllib2自己的特性
              • 所谓的会跟进去
          • 客户端跳转
            • <meta http-equiv=”refresh” content=”0; url=http://www.evilcos.me” />
              • htmlparse解析就行了
            • location.href=”http://evilcos.me”;
              • 正则(弱),js引擎(王道)
        • Python编码规范
          • attach
          • 入门书
            • Python核心编程2
              • 第4章 Python对象
                • 完整熟练
              • 6.8 Unicode
                • 完整熟练
              • 8.11 迭代器和iter()函数
                • 完整熟练
              • 第9章 文件的输入和输出
                • 完整熟练
              • 第10章 错误和异常
                • 完整熟练
              • 第11章 函数和函数式编程
                • 完整熟练
              • 第12章 模块
                • 完整熟练
              • 第14章 执行环境
                • 完整熟练
              • 第15章 正则表达式
                • idea
                  完整熟练
              • 第18章 多线程编程
                • 完整熟练
              • 20.2 使用Python进行Web应用:创建一个简单的Web客户端
                • 完整熟练
        • Office能力
          • Word文档编写,看去要专业,尤其对外的
          • Excel里面大量的统计、图表功能,需要善于使用
          • PPT演讲、培训等必备,如何做好PPT?百度一下……
          • ksmiletris
            进一步
            • yEd
            • Visio
            • FreeMind
              • 本技能表就是这个制作
        • 熟练VIM
        • 算法
          • 快排
          • 二分
        • 正则表达式
        • 研发能力
          • 瀑布模型
            • 需求->需求分析->设计->开发->测试->上线->运维/运营
          • idea
            需求分析能力
            • 给你一个需求,如何给出一个优美的执行思路——方法论
            • 这个能力非常非常非常的关键
          • 调试能力
            • 只要定位出,就没有解决不了的Bugs
            • 肉眼看到的都是假象
              • 一定要专业的工具与经验配合
            • Bugs在哪出现,最终就在哪进行真实模拟调试
            • 缩小范围
              • 构建自己的测试样例
                • 排除网络复杂未知情况
              • 关联模块一个个排除
              • Python单步调试
                • import pdb;pdb.set_trace()
                • 在需要单步调试的地方加上面这句,运行程序后中断在此,然后h查看指令进行一步步细细调试
              • 粗暴调试:print
          • 敏捷思想
            • 快速迭代
            • 任务拆细
            • v1原则:定义好v1的目标,快速完成v1为优先
            • 习惯Wiki记录,利于沉淀与分享
        • 翻墙
      • Web安全
        • Web服务组件
        • 安全维度
          • 漏洞
          • 风险
          • 事件
        • Web安全标准
          • OWASP
          • WASC
          • 我们内部Wiki
        • 实战环境
          • 黑客攻防技术宝典(Web实战篇)
          • 白帽子讲Web安全
          • Web前端黑客技术揭秘
            • 我和xisigr自己出品
          • SQL注入攻击与防御
        • papers
      • 研发清单
        • 编码环境
          • pip
          • Vagrant
          • tmux/screen
          • vim
          • zsh + oh-my-zsh
          • Python2.7
          • >Django1.4
          • web.py
          • node.js
          • Ubuntu/Gentoo/Centos
          • ipython
          • 版本控制
            • git/svn
            • gitlab
          • Nginx+uWSGI
        • Python
          • 官方手册
            • 至少过一遍,这都没过一遍,视野会局限
            • 行之说:「我没看过Python的书,却熟读官方手册……」
        • Linux
        • 前端
            • JavaScript DOM编程艺术
          • 了解DOM
            • 这同样是搞好前端安全的必要基础
            • jQuery
              • 优秀的插件应该体验一遍,并做些尝试
              • 官方文档得过一遍
            • ECharts
              • 来自百度
            • Google API
            • ZoomEye Map组件
              • ZoomEye团队自己基于开源的打造
            • AngularJS
              • Google出品的颠覆性前端框架
            • Bootstrap
              • 应该使用一遍
        • 爬虫进阶
          • 代理池
            • 爬虫「稳定」需要
          • 网络请求
            • wget/curl
            • urllib2/httplib2/requests
            • idea
              scrapy
          • 验证码破解
            • pytesser
        • 调度
          • crontab是最原生的定时调度
          • 基于redis实现的分布式调度
          • 基于rpyc实现的分布式调度
          • celery/gearman等调度框架
        • 并发
          • 线程池
            • 进程内优美的并发方案
          • 协程
            • 进程内另一种优美的并发方案
          • 多进程
            • os.fork
            • idea
              multiprocessing
        • 数据结构
          • JSON
          • cPickle
          • protobuf
        • 数据库
          • MySQL
          • MongoDB
          • Cassandra
          • Hadoop体系
          • Redis
          • Sqlite
          • bsddb
        • DevOps
          • SSH证书
          • Fabric
          • SaltStack
          • puppet
          • pssh/dsh
        • 调试
        • 算法
        • 持续集成
          • 自测试
            • nose
          • Jenkins
        • 协作
          • 类似Trello的在线协同平台
          • 微信
          • 立会
      • 设计思想
        • 人人都是架构师:具备架构思想是一件多酷的事
        • 实战出真知
        • 如何设计
          • attach
          • 松耦合、紧内聚
          • 单元与单元属性
          • 生产者与消费者
          • 结构
            • 队列
            • LRU
          • 分布式
            • 存储
            • 计算
          • 资源考虑
            • CPU
            • 内存
            • 带宽
          • 粗暴美学/暴力美学
            • 大数据,先考虑run it,然后才能知道规律在哪
            • 「run it优先」能快速打通整体,洞察问题
            • 「run it优先」能摆脱细节(繁枝末节)的束缚
            • 「run it优先」能快速迭代出伟大的v1
          • 一个字总结
      • 优质资源
      • 牛人1,2,3
        • 1研究:研究东西,有足够洞察力,研究水准不错
        • 2研发:hack idea自己有魄力实现,不懂研发的黑客如同不会游泳的海盗
        • 3工程:研发出来的需要实战、需要工程化,否则只是玩具,而不能成为真的武器

from:http://blog.knownsec.com/Knownsec_RD_Checklist/v2.2.html

refer:Java后端工程师技能树

Open Sourcing a Python Project the Right Way

Most Python developers have written at least one tool, script, library or framework that others would find useful. My goal in this article is to make the process of open-sourcing existing Python code as clear and painless as possible. And I don’t simply mean, “create GitHub repo, git push, post on Reddit, and call it a day.” By the end of this article, you’ll be able to take an existing code base and transform it into an open source project that encourages both use and contribution.

While every project is different, there are some parts of the process of open-sourcing existing code that are common to all Python projects. In the vein of another popular series I’ve written, “Starting a Django Project The Right Way,” I’ll outline the steps I’ve found to be necessary when open-sourcing a Python project.

数据爬取和数据分析案例

数据爬取:

*如何入门 Python 爬虫?

专栏:Python爬虫入门教程

Python爬虫学习系列教程

模拟登录一些知名的网站,为了方便爬取需要登录的网站

Python 爬虫-模拟登录知乎-爬取拉勾网职位信息

Python写的链家爬虫 代码+数据

数据爬取工具或框架:

scrapy

Hawk 【重磅开源】Hawk-数据抓取工具:简明教程

pyspider

使用Wget下载整个网站
you-get(Releases · soimort/you-get · GitHub这里面有各种发布版本)。

刚开始写爬虫用的是urllib2,后来知道了requests,惊为天人。
刚开始解析网页用的是re,后来知道了BeautifulSoup,解析页面不能再轻松。
再后来看别人的爬虫,知道了scrapy,被这个框架惊艳到了。
之后遇到了一些有验证码的网站,于是知道了PIL。但后来知道了opencv,pybrain。当在爬虫中用上人工神经网络识别出验证码,兴奋得守在爬虫旁边看他爬完全站。
再后来知道了threading,知道了celery。(知乎)

使用Python进行验证码识别

数据分析案例:

有哪些网站用爬虫爬取能得到很有价值的数据?

2016豆瓣电影可视化分析报告

京东百万记录分析中国人罩杯分布 | 上150万数据 密码:guvy)

用Python侦测比特币交易的网络可视化分析

如何通过房屋租售比来判断房产的价值或泡沫?
你用 Python 做过什么有趣的数据挖掘/分析项目

知乎问题爬虫

知乎数据 API 接口 (node.js)

拉勾职位信息爬取

赶集租房信息

链家爬虫 (数据:链家数据

使用Python进行验证码识别

个人博客:

沙漠之鹰