本文最初发表于 Towards Data Science 博客,经原作者 Sanket Gupta 授权,InfoQ 中文站翻译并分享。
本文详细介绍了如何使用 Docker 用于机器学习项目和 Jupyter Notebook。
对于当前的软件开发,Docker 是一个非常关键的部分。在开发应用程序时,Docker 可以让你将应用程序分开并隔离。对于一名数据科学家来说,依赖于像pyenvor virtualenv
这样的虚拟环境库是很常见的,但是使用 Docker 可以解锁你的不仅仅是原型化,而是构建生产级应用。
尽管虚拟环境非常适合快速开发工作,但 Docker 为与同事协作以及在云中部署数据科学应用程序提供了一种很好的方式。在本文中,我们将介绍数据科学和机器学习开发所需了解的 Docker 基础知识。
学习 Docker 的资源有很多,但是当我刚开始学习的时候,我希望有一个小教程能让我快速地学会如何使用 Dockerfile,而不是花时间去学习很多理论。但愿本文能够成为这样的教程。不管怎样,让我们开始吧。
Docker 之所以如此适用于数据科学应用,有以下几个原因:
conda
和pip
来安装库。这给了你很大的灵活性,你可以在一个特定的项目中使用哪些库。例如,最近我想使用 Facebook 的 Prophet 包进行时间序列预测,通过conda
就可以轻松地安装,但对于 TensorFlow 等机器学习库,我更喜欢使用pip
——在 Docker 上,这两种方法都非常容易使用。Docker 还可以让你使用任何任意的操作系统。你可以构建不同版本的 Ubuntu 或 Alpine,甚至 Windows。对于虚拟环境,你需要使用主机操作系统。requirements.txt
,然后在需要的情况下执行特定的步骤。不过,对于 Docker 来说,安装步骤通常是类似的。将Dockerfile
与docker-compose
一起使用,用户只需运行docker-compose
就可以安装所有的需求,并为你设置所有内容。而且无论是机器还是操作系统,这一步骤都是一样的——这一点非常棒!所以,对于与你的同事合作或开源项目,Docker 是非常棒的!要开始使用 Docker,请从这里下载适用于 Windows、Linux 或 Mac 的 Docker。另外,在 Docker Hub 上创建一个账户:hub.docker.com—— Docker Hub,就像 Github 一样,你可以在那里发布和使用其他人的镜像。举例来说,在那里可以看到一堆 Python 镜像。通常,你从 Docker Hub 中的一个映像开始,然后根据你自己的特定需求在其之上进行构建。
由于本文是一个实践指南,所以我们首先从创建一个 Dockerfile 开始。你可以选择使用现有的项目,也可以创建一个新的项目文件夹。我们将通过脚本模式来完成工作流。如果你喜欢用 Jupyter Notebook 学习,我们会在最后单独的章节中介绍它们。
Dockerfile 是一个文本文件,它包含了构建 Docker 镜像所需的所有命令。一个 Docker 镜像是由一系列层构建而成的。每个层代表了镜像的 Dockerfile 中的一条指令。每当 Dockerfile 中的层发生变化时,当你重建镜像时,该变化后的所有层都将被重新构建。
让我们来编写我们的 Dockerfile 吧!用vim Dockerfile
创建一个新的 Dockerfile,方法如下:
FROM python:3.8-slim-buster
RUN mkdir /app
WORKDIR /app
RUN pip install numpy==1.19.4 \
pandas==1.1.5 \
scikit-learn==0.23.2 \
tensorflow==2.4.0 \
seaborn==0.11.0
COPY . .
我们要做的是以下几个步骤:
app
文件夹。使app
作为我们的工作文件夹——默认情况下,这将是我们此后所有的命令的位置。pip install
下载项目需要的库。这些都是机器学习项目所需要的常用库,比如 Numpy 和 Pandas 用于数据探索;Scikit-Learn 用于数据扩展、浅层建模、特征选择和度量;TensorFlow 用于深度学习模型,最后是 Seaborn 用于数据可视化。app
目录下。Docker Image(镜像)是一个只读的模板文件,它包含了应用程序运行所需的源代码、库、依赖关系、工具和其他文件。它是用一组层构建的。
命令行的 docker 命令的基本思想是:
docker <management command> <command>
Docker 镜像需要知道的重要命令是:
# List all docker images
docker image ls
# Build an image with name "hello" from Dockerfile in this directory
docker image build -t hello .
# Delete image with name "hello"
docker image rm hello
如上所述,现在让我们运行docker image build-t hello
。在带有 DockerFile 的文件夹中。它会显示一些所有库的安装步骤和它们的依赖关系。最后,它将显示:
Successfully built <IMAGE_ID>
Successfully tagged hello:latest
如果我们只想要 Python 3.8 镜像,而不需要额外的命令,我们可以运行:docker image pull python:3.8-slim-buster
。
Docker Container(容器)是 Docker 镜像的运行实例:容器运行实际的应用程序。容器包括一个应用程序及其所有的依赖关系。容器与其他容器共享内核,并作为一个独立进程在主机操作系统上运行。镜像可以在没有容器的情况下存在,而容器需要运行镜像才能存在。你可以从同一个镜像中拥有许多运行中的容器。需要知道的重要命令如下:
现在要运行已构建的 Docker 镜像:
docker container run -it hello bash
你需要指定-it
才能通过终端 shell 与容器交互。null 要做到这一点,你需要使用volumes
。运行docker container run -it -v $PWD:/app hello bash
:这将在 Docker 内部启动一个 bash shell,并创建一种在我们的本地机器和 Docker 容器之间来回复制文件的方法。
docker-compose
,这样你就不用记住这个长长的命令了。# Run the container from previously built "hello" image
# It will take you to a bash shell inside the docker container
# where you can run commands and scripts
docker container run -it -v $PWD:/app hello bash
# List all running docker containers
docker container ls
# List all docker containers even stopped ones
docker container ls -a
如果我们只想在 Python 3.8 容器中运行一些 bash 命令,我们可以运行:docker container run -it python:3.8-slim-buster bash
下图有助于说明 Dockerfile、Docker 镜像和 Docker 容器之间的区别:
Dockerfile 帮助构建一个 Docker 镜像,然后用来运行 Docker 容器。
Docker compose 是一种用于定义和运行多容器 Docker 应用程序工具。即使你正在运行一个单一的应用程序,它也是一个有用的工具,你可以不记得所有不同的volumes
参数、端口设置等。
要创建 docker-compose 文件,请在 Dockerfile 所在的文件夹中运行vim docker-compose.yml
:
version: "3"
services:
hello:
build: .
image: hello
volumes:
- ".:/app"
这个 Docker 文件是一个 YAML 文件,它告诉 Docker 从不同的 Dockerfiles 构建各种服务,配置镜像名称、环境变量、卷和端口。
要运行这个文件,请执行命令docker-compose build hello
:这将像之前一样构建 hello 镜像。接下来的命令docker-compose run hello bash
将运行容器并设置卷等。这个命令会替换步骤 3 中的整个docker container run -it -v $PWD:/app hello bash
命令。
需掌握的重要命令:
# Build the docker service "hello"
docker-compose build hello
# Run a container from image "hello" and open a bash shell
docker-compose run hello bash
现在,你可以在 Docker 镜像中编写代码,并分析和运行数据科学代码了!
当你构建更多的 Docker 镜像和容器时,你需要在系统上管理所有这些镜像和容器的方法。这些命令将帮助你浏览 Docker 世界。让我们来了解一些 Docker 系统命令。
docker system info
命令用来获取所有关于容器数量、镜像等信息。docker system df
命令用来了解通过删除未使用的容器、镜像等可以回收多少空间。docker system prune
后面带Y
参数将清理所有停止的容器和所有悬空(dangling)镜像,这非常有用。如果你在上面的命令中加上-a
参数,它将清理所有的镜像,而不仅仅是悬空镜像。如果你更喜欢使用 Jupyter Notebook,那么它会稍微复杂一些,但是我们可以根据前面部分的知识进行构建。你还必须修改你的镜像和docker-compose
文件。
# Dockerfile for working with Jupyter notebooks
FROM python:3.8-slim-buster
WORKDIR /home/notebooks # This is different from usual
RUN pip install numpy==1.19.4 \
pandas==1.1.5 \
scikit-learn==0.23.2 \
tensorflow==2.4.0 \
seaborn==0.11.0 \
jupyter \
notebook
COPY . .
EXPOSE 8888
ENTRYPOINT ["jupyter", "notebook","--ip=0.0.0.0","--allow-root", "--no-browser"]
在现有的项目中创建上述 Dockerfile,然后将docker-compose
文件更改为:
version: "3"
services:
hello:
build: .
image: hello
volumes:
- ".:/home/notebooks" # This is different from usual
ports:
- 8888:8888
下面是要运行的命令:
# Build the docker service "hello"
docker-compose build hello
# Create a Docker container from image "hello"
# It will use ENTRYPOINT in Dockerfile to start Jupyter notebook
docker-compose up hello
和前面一样,运行 build 命令。但是不需要调用 bash,只需要运行up
命令,并使用上面的ENTRYPOINT
,Docker 就会启动一个 Jupyter Notebook 服务器,你可以在本地访问http://127.0.0.1:8888/?token=<token>
,现在你可以使用电脑上的浏览器在 Docker 容器上进行 Jupyter 操作。
恭喜!希望以上工作流程对你的数据科学开发非常有用。让我们快速回顾一下,当你将 Docker 和数据科学项目结合起来时,有哪些可能性:
数据科学 / 机器学习开发的 Docker 用例:
Dockerfile
和docker-compose
文件,方便合作。这篇关于使用 Docker 和数据科学的实践指南到此结束。
作者介绍:
Sanket Gupta,Octopart 数据科学家。目前正在与金融、营销、产品和工程团队合作。侧重于端到端管道,包括数据工程、数据分析以及数据科学。
原文链接:
https://towardsdatascience.com/hands-on-guide-to-docker-for-data-science-d5d1f6f4a326
领取专属 10元无门槛券
私享最新 技术干货