您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
如何用Docker成为更高效的数据科学家?
你的,镜像,容器如何用Docker成为更高效的数据科学家?
发布时间:2016-12-08加入收藏来源:互联网点击:
在这个案例中,我们指定基础镜像为 ubuntu:16.04,它会搜索名叫 ubuntu 的 DockerHub 库(https://hub.docker.com/_/ubuntu/)。镜像名之后的部分 16.04 是指定了你想要安装的基础镜像的版本的标签(tag)。如果你检索一下 Ubuntu DockerHub 库,你会注意到不同版本的 Ubuntu 对应于不同的 tag:
2017 年 12 月的官方 Ubuntu DockerHub 库截屏
比如,ubuntu:16.04、ubuntu:xenial-20171201、ubuntu:xenial 和 ubuntu:latest 全都是指 16.04 版的 Ubuntu,它们全都是同一个镜像的别名。此外,这里提供的链接指向了对应的 Dockerfile,可用于构建每个版本的镜像。有时候你无法在 DockerHub 中找到 Dockerfile,因为维护者可以自己选择是否将关于这些镜像的创建方式的 Dockerfile 包含进来。我个人觉得阅读一些 Dockerfile 有助于更好地理解 Dockerfile。(但不要急,读完这篇教程再说!)
你需要特别注意一个标签,即 :latest 标签。这也是你在不为 FROM 语句指定标签时默认 pull 的镜像。比如说如果你的 FROM 语句是这样:
FROM ubuntu
然后你就将 pull ubuntu:16.04 镜像。为什么?——仔细看上面,你可以看到 :latest 关联的是 16.04.
关于 Docker 镜像最后需要注意的一点:在从 DockerHub pull 随机的 Docker 镜像时要做出明智的判断。有恶意的人创建的镜像有可能会包含恶意软件。
LABEL 语句
这个语句会为你的镜像添加元数据,而且是完全可选的。我增加这个语句的目的是为了让别人知道可以联系谁,同时也方便我搜索我的 Docker 容器,尤其是在一个服务器上同时运行着很多容器时。
LABEL maintainer="Hamel Husain <youremail>"
ENV 语句
ENV.UTF-8 LC_ALL=C.UTF-8
这让你可以修改环境变量,而且相当直接,相关情况请参阅:https://docs.docker.com/engine/reference/builder/
RUN 语句
这通常是最需要花功夫的地方,给出了你构建该 Docker 镜像所想要完成的任务。你可以运行 apt-get 和 pip install 等任意的 shell 命令来安装你需要的软件包和依赖包。
RUN apt-get update --fix-missing && apt-get install -y wget bzip2
build-essential \
ca-certificates \
git-core \
...
在这里我安装了一些我喜欢的实用工具,比如 curl、htop、byobu,然后安装了 Anaconda,之后还安装了一些基础 Anaconda 中没有的其它库(你可以在完整的 Dockerfile 中查看其它 RUN 语句)。
RUN 语句后的命令与 Docker 没什么关系,只是一些你在安装这些软件包时需要运行的正常 Linux 命令,所以就算你不熟悉这些软件包或 Linux 命令也不要担心。另外,再给一个建议:当我最早开始学习 Docker 时,我查看了 GitHub 或 DockerHub 上的其它 Dockerfile,然后将我需要的部分复制粘贴到了我的 Dockerfile。
你可能注意到了 RUN 语句的格式。每个库或软件包都整齐地进行了缩进,而且为了可读性还按字母进行了排序。这是 Dockerfile 的普遍惯例,所以我建议你也这样做以便合作。
EXPOSE 语句
如果你想公开一个端口,这个语句会很有用——比如,如果你从该容器或某个网络服务内实施一个 Jupyter Notebook。Docker 的文档相当好地解释了 EXPOSE 语句:
EXPOSE 指令实际上并没有发布该端口。它的功能是作为创建该镜像的人和运行该容器的人之间的一类文档,内容是关于打算发布的端口。要实际发布该端口,就要在运行该容器时在 docker run 上使用 -p 标志并且映射一个或多个端口,或者也可以使用 -P 标志发布所有端口并将它们映射到高阶端口。
VOLUME 语句
VOLUME /ds
这个语句让你可以在 Docker 容器和主机计算机之间共享数据。VOLUME 语句让你可以安装外部安装的卷。主机目录只有在容器运行时才声明(因为你可能在不同的计算机上运行该容器),而不会在定义镜像时声明*。目前你只指定了 Docker 容器内你想与主机容器共享的文件夹的名称。
Docker 用户指南解释说:
主机目录是在容器运行时声明的:主机目录(挂载点)本质上取决于主机。这是为了保证镜像的可移植性,因为一个给定的主机目录无法保证在所有主机上都可用。由于这个原因,你不能在 Dockerfile 中挂载主机目录。VOLUME 指令不支持指定 host-dir 参数。你必须在创建或运行容器时指定挂载点。
此外,这些卷的目的是将数据保存到容器的文件系统之外,当你要操作大量数据而且不希望你的镜像膨胀得很大时,这会很有用。当你保存一个 Docker 镜像时,在这个 VOLUME 目录中的任何数据都不会被保存为该镜像的一部分,但是在这个容器目录之外的数据会被保存。
WORKDIR 语句
WORKDIR /ds
这个语句设置了工作目录,以便你在另一条命令中可以无需使用绝对路径就能索引特定的文件。例如这个 Dockerfile 中的最后一条语句是:
CMD [“./run_jupyter.sh”]
该语句就默认假设工作目录是 /ds
ADD 语句
ADD run_jupyter.sh /ds/run_jupyter.sh
这条命令让你可以在 Docker 容器运行时将文件从主机计算机复制到该 Docker 容器。我使用这个命令来执行 bash 脚本以及将 .bachrc 文件等有用东西导入到容器中。
注意这里的主机容器的路径并没有完全指定,因为其主机路径是你在该容器运行时指定的背景路径(context directory)的相对路径(后面会讨论)。
在我运行这个容器时,run_jupyter.sh 正好在背景路径的根目录内,所以在该源文件之前没有路径。
用户指南中介绍说:
ADD <src>... <dest>
ADD 指令从 <src> 复制新文件、目录或远程文件 URL 并将它们添加到路径 <dest> 的镜像的文件系统中。
CMD 语句
Docker 容器的设计思想是这些容器是短暂的,能保证运行完你想运行的应用就行了。但在数据科学方面,我们往往希望保持这些容器一直运行,即使它们之中并没有主动地运行着什么。很多人都通过运行 bash shell 来实现这一点(除非你终止它,否则它就不会停止)。
CMD [“./run_jupyter.sh”]
在上面的命令中,我运行了一个实例化一个 Jupyter Notebook 服务器的 shell 脚本。但是,如果你没有什么要运行的特定应用而只是想保持你的容器运行(而不退出),你可以直接运行 bash shell,只不过使用以下命令:
CMD ["/bin/bash"]
这种方法是有效的,因为除非你退出,否则 bash shell 就不会终止;因此该容器会一直保持运行。
用户指南中介绍说:
在一个 Dockerfile 中只能有一个 CMD 指令。如果你列出了不止一个 CMD,那么只有最后一个才有效。
CMD 的主要目的是为正在执行的容器提供默认配置。这些默认配置可能包含一个可执行文件,或者也可以省略可执行文件,在这种情况下你还必须指定一个 ENTRYPOINT 指令。
创建你的 Docker 镜像
Dockerfile 中的信息可真够多的。不要担心,后面的内容就相对很简单了。现在我们已经在 Dockerfile 中创建了我们的配方,是时候创造镜像了。你可以通过以下命令完成:
GitHub 上也有:https://github.com/hamelsmu/Docker_Tutorial/blob/master/basic_tutorial/build_image.sh
这会创建一个 Docker 镜像(而不是容器;如果你不记得这两者之间的差异,请查阅文章前面的术语介绍),你可以在后面运行这个镜像。
上一篇:骑自行车的时候运动摄像机如何安装能够拍出更酷的画面?
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |