包版:docker.workshop 0.99.1.

内容

1什么是码头?

我发现它可能很难理解Docker刚从描述中。所以让我们潜入并尝试用一个快速的例子解释。你需要提出shellinabox.(见下面)来尝试这个例子。

1.1使用shellinabox.

欢迎光临安装Docker.在您自己的计算机上,但我们的亚马逊机器图像(AMI)已经安装了Docker。我们可以使用它shellinabox.它提供了web浏览器中终端窗口的大部分功能。要使用它,请打开一个新的web浏览器窗口。

你的shellinabox.URL是相同的RStudio URL,但与:4200添加到结尾。如果你的RStudio URL是

http://ec2-www-x-yyy-zz.compute-1.amazonaws.com

然后是你的shellinabox.URL是:

http://ec2-www-x-yyy-zz.compute-1.amazonaws.com:4200

转到那个URL并使用用户名登录Ubuntu.和密码BIOC.

1.2一个快速的例子

在我们使用docker做任何事情之前,让我们快速看一下我们使用的机器。它运行的是什么操作系统?要找到答案,输入命令

猫/etc/*-release

这说明我们使用的是Ubuntu Linux 14.04版本。让我们看一下计算机上正在运行哪些进程。输入的命令

ps辅助

这将列出许多进程,可能超过100个,即使我们几乎没有在机器上做任何事情。典型的机器为了基本的操作需要运行很多过程。

最后,让我们看看当前目录中的文件

LS.

现在让我们用Docker试试这个。使用命令启动Docker容器:

Docker Run -ti -RM Debian:最新Bash

你会看到一个提示来提出那样的东西:

root @ bfd260cc3d02:/#

首先要注意的是这个提示立即出现。

让我们再试一次这个命令,看看我们在哪个操作系统上:

猫/etc/*-release

这告诉我们我们在Debian版本8上。

现在让我们来看看并查看正在运行的过程

ps辅助

这一次它只报告两个进程,我们的bash贝壳和我们PS.命令!

最后,类型

LS.

查看存在的文件。它们是完全不同的文件,而不是我们在主机上看到的文件。

清理,键入

出口

离开容器。

1.3刚才发生了什么?

我们刚刚演示了Docker的一个基本方面:Docker容器中的进程是隔离的从主机的那些。事实上,我们刚开始使用的Docker容器运行的是一个完全不同的Linux发行版(主机上的Debian和Ubuntu)。

然而它不是虚拟机;如果是,我们希望看到它的一系列进程,就像在正常机器上一样。(Docker使用Linux内核的相当近期的进步并且名称空间来实现这种隔离。)所以与虚拟机不同,我们可以充分利用主机的速度和硬件。

因此,即使我们在容器(Debian)上运行的Linux发行版与在主机(Ubuntu)上运行的Linux发行版不同,容器运行的版本也是相同的核心作为主人。这解释了为什么容器开始如此迅速。

当我们通过跑步时,Docker的文件系统也被孤立LS.

所以那是一个坚果壳的码头。孤立的流程和文件系统(和网络也!)。当您了解如何创建Docker容器(在下一节中),您将理解所有运输集装箱隐喻,这些集装箱隐喻在坞站的换档方面得到了折叠。

1.4创建一个容器

假设我已经创造了一个革命性的新应用程序,将改变世界并带给我财富和名望。该应用程序是一行的shell脚本,说:

回声“你好,世界!”

但我们可以假装它是一个非常复杂的应用程序,它具有很多操作系统依赖性,并且非常难以构建和安装。所以我想把我的应用程序作为码头容器发货,拯救其他用户安装它的痛苦。

我会创建一个名为dockerfile.并提出以下内容:

来自Debian:最新CMD Echo“Hello,World!”

然后我将构建容器:

Docker构建-t dtenenba/myapp。

现在容器可以按如下方式运行:

Docker Run Dentenba / MyApp

罗哈德,它吐出“你好,世界!”。所以现在我可以检查我的dockerfile进入github,任何人都可以构建和运行它。我也可以推动它码头工人中心(我有),然后任何用户都可以通过做来实现它(不需要建造它)

Docker Run Dentenba / MyApp

如果主机上尚不存在,则容器将从服务器中拉下来。或者你可以明确地拉它(但不是运行它)

Docker Lift Dentenba / MyApp

dockerfiles包含设置容器所需的所有指令。通常,这包括安装依赖项(通常使用包管理器)和其他先决条件。

看到全部dockerfile参考对于更多的Infromation。

(有其他方式要创建Docker容器,但不建议,所以我不会讨论它。所以在那里!)

1.5dockerfiles和文件系统图层

顺便说一下,我强烈推荐码头工人书由詹姆斯•特恩布尔。它以PDF的形式提供,并且经常更新。事实上,我非常喜欢这本书,所以我将相当大方地引用其中关于Docker文件系统的内容:

在更传统的Linux引导中,唯一的root文件系统被读取,然后在引导后切换到读写,并进行完整性检查。但是,在Docker世界中,根文件系统停留在只读模式,Docker利用了联盟山在根文件系统上添加更多只读文件系统。Union Mount是一个允许一次安装多个文件系统,但似乎是一个文件系统。Union Mount彼此叠加在一起,以便生成的文件系统可能包含来自任何或所有底层文件系统的文件和子目录。

Docker调用这些文件系统中的每一个。图像可以彼此分层。下面的图像称为父图像,您可以遍历每个层,直到到达最终图像称为基本图像的图像堆栈的底部。最后,当从图像启动容器时,Docker在下面的任何图层上安装读写文件系统。这是我们希望我们要运行的Docker容器的任何进程都会执行的地方。

这听起来令人困惑,所以最好用图表来表示。

该图可以被视为代表以下Dockerfile的另一种方式:

来自Ubuntu运行APT-Get Install -y Emacs运行Apt-Get Install -y Apache2

图中的紫色框(从底部到顶部读取)匹配Dockerfile中的行。当Docker构建dockerfile时,它会为dockerfile中的每个命令创建一个新的图像(或文件层)。

2用例

到目前为止,我希望您对Docker的基本概念是:一种包装环境,以包括一些应用程序和所有依赖性的简单方法。现在也许我们有足够的信息来推测Docker如何帮助我们:

3.Docker和Root权限

Docker的一个大问题是,你需要要运行它,因为使Docker工作的内核功能需要root权限。到目前为止,我们在我们的例子中没有看到它,因为Ubuntu.AMI上的用户是具有某些操作的root权限的组的成员。通常,所有码头工人必须以root或befend运行命令苏达。(这在Mac或Windows上没有必要。)

这确实存在一些问题。不是每个人(特别是共享系统)都有root权限。Sysadmins可能不愿意运行一个包含未知内容的容器。

4.如果我不使用Linux呢?

你仍然可以在Windows和Mac上运行Docker,通过一个名为boot2docker.。只需按照以下说明Docker安装页面。

Windows 10将包含一种允许您运行Windows容器的Docker形式。

5.闯入黑盒

你可能会思考,“好吧,我可以有一个人可以拥有一个”你好世界“的应用程序,但我如何让Docker计算在我的数据上?如何在Docker上运行Web应用程序?“

5.1使用本地文件

这是一个快速的dockerfile,它对我的​​本地计算机上的数据执行一些操作。在这种情况下,我想对目录中的文件进行值判断。以下Dockerfile将执行以下操作:

从debian:最新的VOLUME /data WORKDIR /data CMD for i in ' ls ';echo $i is awesome;完成

我可以用它来建造

Docker build -t dtenenba/voldemo。

并像这样运行:

Docker命令-v /etc/:/data dtenenba/voldemo

-v.交换机需要两个目录(由冒号分隔);第一个是我本地文件系统上的目录,第二个可以被认为是容器内该目录的“安装点”。肯定地,上面的命令告诉我我的每个文件/等目录真棒。

在这种情况下,Docker只是列出了文件,但它也可以执行写入操作。(由于Docker默认运行root,因此其输出文件可能没有您想要的权限;阅读摇臂的页面关于如何解决这个问题的技巧)。

5.2暴露网络

这个dockerfile是一个非常简单的Web服务器,但它可能是一个复杂的Web应用程序:

从Debian:最新运行echo“它有效!”> index.html运行apt-get更新运行apt-get安装-y python公开8000 cmd python -m simplehttpserver 8080

如果你建立它:

Docker构建-t dtenenba/webdemo。

然后运行它:

docker运行--name webserverdemo -p 8080:8080 dentenba / webdemo。

与此类似于-v.开关,呢-P.切换将主机上的端口映射到容器上的端口。

然后,您可以在Web浏览器中打开它并查看铆钉消息。

5.2.1知道打开哪个网址

如果您在自己的Linux机器上创建此Dockerfile,则可以转到http://localhost:8080。如果您使用的是boot2docker,您可以执行类似的东西来获取URL:

Echo http:// $(boot2docker ip):8000

如果您在此AMI上,您可以追加:8080到你的rstudio网址,所以有些像:

http://ec2-www-x-yyy-zz.compute-1.amazonaws.com:8080

5.2.2打扫干净

要停止Web服务器,可以按Control-C,或打开另一个窗口并发出命令:

docker rm -f webserverdemo

6.从多个容器组成复杂的应用程序

一个典型的web应用程序可能涉及几个进程;例如,Bioconductor新的包跟踪器由一个用Python编写的web应用程序、一个MySQL数据库和一个SMTP邮件服务器组成。

容器可以是联系在一起为这种情况提供便利。两个容器可以通过网络端口相互通信(而不向主机暴露它们的网络!)

您可以将这样的应用程序与多个容器中的一个应用程序,一个用于每个过程。(Docker应用程序能够由单个容器内的多个进程组成,但最好的做法是每个容器只运行一个进程。)

甚至更好,对于像MySQL Server这样的常见应用程序,您只需拉下已准备好的预先存在的容器。您不需要自己创建和构建MySQL服务器。同样,刚刚接收到发送给它的电子邮件并在浏览器中显示它的架子Web-App容器,非常适于测试Web应用程序的电子邮件功能。

将其捆绑在一起是一个叫做的工具Docker撰写(以前称为图)。此工具不是Docker的一部分,需要单独安装。

与A.yaml文件,我们在此应用程序中声明容器之间的依赖关系。这是我们用于测试新包跟踪器的多容器Docker应用程序的真实yaml文件:

SMTP:图片:“schickling / mailcatcher”#确保Web应用程序配置为使用端口1025进行电子邮件端口: - “1080:1080”#Web应用程序阅读电子邮件DB:图片:“MySQL”环境:MySQL_Root_Password:MySECRETPassword Web:环境:mysql_root_password:mysecretpassword映像:“dtenba / tracker.bioconductor.bioconductor.org”链接: - “db” - “smtp”端口: - “8080”卷: - “roundup:/ sourcup” - “bioc_submit:/ bioc_submit”命令:“/start/start.sh”

我不会在这里详细说明(完整的应用程序GitHub上),但这设置了三个容器以及它们彼此通信所需的所有信息。每个容器都可以通过环境变量访问相关信息。一个命令(Docker-Compose Up)打开所有三个容器。

看看docker-compose.yml参考有关此声明性语法的更多信息。

7.码头工人和R / Bioconductor

我们已经看到了Docker图像是如何建立在另一个图像之上的:我们的“Hello, World”应用就是建立在它之上的debian:最新。通过相同的令牌,Biocumon Isage建立在R和RStudio图像的顶部之上摇滚歌手组织。

完整的文档对于这些图像位于Biocuconducts网站。

对于devel和release(以及以后的旧版本),可以使用以下容器(实际的容器名称以释放_或者devel_并以以下之一结束):

7.1.启动容器

有几种方法可以与容器互动。默认方式是使用RStudio服务器。输入以下命令:

Docker运行-p 8787:8787—rm bioconductor/ develop_base

将在主机的端口8787上提供RStudio服务器。所以,如果你的AMI URL是

http://ec2-www-x-yyy-zz.compute-1.amazonaws.com

添加:8787结束:

http://ec2-www-x-yyy-zz.compute-1.amazonaws.com:8787

RStudio登录是rstudio.密码是rstudio.

您还可以使用此命令启动命令行r:

Docker Run -ti -rm Biocumond / devel_base r

或者如果您计划除了容器内部的R除了r以外的其他命令,请启动bash shell:

Docker Run -ti -RM Biocumon / devel_base Bash

7.2再现性

重复性的关键是确切地知道您使用的码头图像,以便您(或其他)可以在以后重用它。

Bioconductor的Docker图像被标记。例如,这里是可用的标签devel_base.图像。

标签有三种:

一个图像可以有多个标签。如果今天是2015年7月13日,那就是最近的devel_base.图像将被标记20150713.3.2, 和最新的。标签20150713.将要总是适用于同一图像,但其他两个标签没有。因此,出于可重复性的目的,您应该始终注意您正在使用的图像的日期标记。如果没有使用特定标记启动图像,则可以确定运行容器的标记码头工人ps命令,例如:

Docker Run -Ti -rm Biocumon / devel_base

然后在另一个窗口中:

$ docker ps容器ID图像命令创建状态端口名称0AF597A23632 Bioconductor / devel_base:20150713“bash”6秒前上升6秒8787 / tcp happy_yalow

这告诉我我正在使用标记的图像20150713。

8.参考