如何在docker容器中使用数据?

时间:2017-04-29 12:26:07

标签: python docker kaggle

现在安装Docker并谷歌搜索几个小时后,我无法弄清楚如何在Docker中放置数据,它似乎变得越来越复杂。

我做了什么;安装了Docker并运行了我想要使用的图像(kaggle / python)。我还阅读了几个关于在Docker容器中管理和共享数据的教程,但到目前为止还没有成功......

我想要的是:目前,我只是希望能够将GitHub存储库+其他数据下载到Docker容器中。我在哪里以及如何存储这些文件?我更喜欢使用GUI甚至是我的GitHub GUI,但我想也可以使用简单的命令。是否也可以从当前不活动的Docker中放置数据或访问数据?

3 个答案:

答案 0 :(得分:1)

请注意,我还假设您使用的是Linux容器。这适用于所有平台,但在Windows上,您需要告诉您的docker进程您正在处理Linux容器。 (这是托盘中的下拉列表)

了解docker需要花一些时间,理解它的唯一方法就是弄脏你的手。我建议从制作现有项目的图像开始。制作Dockerfile并使用docker build .等。

首先覆盖docker basics(快速版)。

  • 为了在docker中运行某些东西,我们首先需要构建和映像
  • 图片是文件的集合
  • 您可以通过制作Dockerfile
  • 将文件添加到图片中
  • 在第一行使用FROM关键字进行扩展和图像显示 通过向其添加新文件来创建新图像
  • 在凝视容器时,我们需要告诉它应该使用什么图像 并将图像中的所有文件复制到容器存储

在容器中获取文件的最简单方法:

  • 使用Dockerfile创建自己的图像并复制文件
  • 将计算机/服务器上的目录映射到容器
  • 您也可以使用docker cp来复制文件和两个容器, 但从长远来看,这不太实用。

docker-compose为你自动化很多这些东西,但是你应该也可以使用docker命令来理解它是如何工作的。一个compose文件基本上是一个存储参数的格式。 docker命令,因此您不必编写长行多行的命令

在本地开发中在docker中配置多个项目的“简单”方法。

在项目目录中,添加包含环境文件和撰写文件的docker-dev文件夹(或任何您想要调用的文件夹)。 compose文件负责告诉docker它应该如何运行你的项目。您当然可以为每个项目创建一个撰写文件,但这样您就可以轻松地一起运行它们。

projects/
    docker-dev/
        .env
        docker-compose.yml
    project_a/
        Dockerfile
        # .. all your project files
    project_b/
        Dockerfile
        # .. all your project files

.env中的值作为变量发送到撰写文件。我们现在只需添加项目目录的完整路径。

PROJECT_ROOT=/path/to/your/project/dir

撰写文件会将您的每个项目描述为“服务”。我们在这里使用compose版本。

version: '2'
services:
  project_a:
    # Assuming this is a Django project and we override command
    build: ${PROJECT_ROOT}/project_a
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      # Map the local source inside the container
      - ${PROJECT_ROOT}/project_a:/srv/project_a/
    ports:
      # Map port 8000 in the container to your computer at port 8000
      - "8000:8000"
  project_a:
    # Assuming this is a Django project and we override command
    build: ${PROJECT_ROOT}/project_b
    volumes:
      # Map the local source inside the container
      - ${PROJECT_ROOT}/project_b:/srv/project_b/

这将告诉docker如何构建和运行这两个项目。我们还将您计算机上的源映射到容器中,以便您可以在本地处理项目并查看容器中的即时更新。

现在我们需要为每个项目创建一个Dockerfile,否则docker将不知道如何为项目构建图像。

Dockerfile示例:

FROM python:3.6

COPY requirements.txt /requirements.txt

RUN pip install requirements.txt
# Copy the project into the image
# We don't need that now because we are mapping it from the host
# COPY . /srv/project_a

# If we need to expose a network port, make sure we specify that
EXPOSE 8000

# Set the current working directory
WORKDIR /srv/project_a

# Assuming we run django here
CMD python manage.py runserver 0.0.0.0:8000

现在我们进入docker-dev目录并尝试一下。尝试一次构建一个项目。

docker-compose build project_a
docker-compose build project_b

以后台模式启动项目。

docker-compose up -d project_a

跳进正在运行的容器

docker-compose exec project_a bash

只需在forground中运行容器:

docker-compose run project_a

有很多理由要覆盖,但希望这可能有用。

在我的情况下,我运行了大量不同类型的Web服务器。如果您没有在docker中设置代理,那么这会非常令人沮丧,因此您可以使用虚拟主机访问每个容器。例如,您可以使用jwilder-nginx(https://hub.docker.com/r/jwilder/nginx-proxy/)以超级简单的方式解决此问题。您可以编辑自己的主机文件并为每个容器创建假名称(只需添加.dev后缀,这样就不会覆盖真正的dns名称)

jwilder-nginx容器将根据您决定的虚拟主机名自动将您发送到特定容器。然后,您不再需要将端口映射到本地计算机,除了映射到端口80的nginx容器。

答案 1 :(得分:1)

对于喜欢使用GUI的其他人,我最终使用了portainer。 安装portainer(通过使用一个简单的命令完成)后,您可以通过浏览到它运行的位置打开UI,在我的情况下:

http://127.0.1.1:9000

在那里你可以创建一个容器。首先指定名称和图像,然后向下滚动到“高级容器选项”>卷>映射额外的音量。单击“绑定”按钮,指定容器中的路径(例如“/ home”)和主机上的路径,然后就完成了!

当容器正在运行时,将文件添加到此主机目录,然后启动容器,您将在其中看到您的文件。反过来,在容器未运行时,也可以访问容器创建的文件。

注意:我不确定这是否是正确的做事方式。但是,一旦遇到任何问题,我就会编辑这篇文章。

答案 2 :(得分:0)

拉动图像后,您可以在shell中使用这样的代码:

docker run --rm -it -p 8888:8888  -v d:/Kaggles:/d  kaggle/python

在容器内运行jupyter notebook

jupyter notebook --ip=0.0.0.0 --no-browser

这会将本地目录挂载到可以访问它的容器上。

然后,转到浏览器并点击https://localhost:8888,当我使用Python 3.5打开新内核时,我不记得在拉动图像或设置时做了什么特别的事情泊坞。

您可以从here找到更多信息。

您还可以尝试使用datmo轻松设置环境和跟踪机器学习项目,以使实验可重现。您可以按如下方式运行datmo task命令来设置jupyter notebook,

datmo task run 'jupyter notebook' --port 8888

它会在环境中设置您的项目和文件,以跟踪您的进度。