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

How to use data in a docker container?

安装 Docker 并在谷歌上搜索了几个小时后,我不知道如何将数据放在 Docker 中,似乎越来越复杂了。

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

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

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

要理解 docker 需要做一些工作,理解它的唯一方法就是亲自动手。我建议从制作现有项目的图像开始。做一个Dockerfile然后玩docker build .

先学习 docker 基础知识(快速版)。

  • 为了 运行 docker 中的内容,我们首先需要构建和映像
  • 图像是文件的集合
  • 您可以通过 Dockerfile
  • 将文件添加到图像
  • 在扩展和图像的第一行使用 FROM 关键字 通过向其添加新文件创建新图像
  • 启动容器时,我们需要告诉它应该使用什么图像 并且图像中的所有文件都被复制到容器存储

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

  • 使用 Dockerfile 创建您自己的图像并复制到文件中
  • 将 computer/server 上的目录映射到容器中
  • 您还可以使用 docker cp,从和两个容器中复制文件, 但这在长 运行.
  • 中不是很实用

(docker-compose 为您自动执行了很多这些事情,但您可能还应该尝试使用 docker 命令以了解其工作原理。撰写文件基本上是一种存储格式docker 命令的参数,因此您不必编写多行长的命令)

在本地开发中 docker 配置多个项目的 "simple" 方法。

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

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

撰写文件会将您的每个项目描述为 "service"。我们在这里使用 compose 版本 2。

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

跳入 运行ning 容器

docker-compose exec project_a bash

只是运行前台的容器:

docker-compose run project_a

要涵盖的内容很多,但希望这会有所帮助。

就我而言,我 运行 大量不同类型的网络服务器。如果您不在 docker 中设置代理,这样您就可以使用虚拟主机访问每个容器,这真的很令人沮丧。例如,您可以使用 jwilder-nginx (https://hub.docker.com/r/jwilder/nginx-proxy/) 以超级简单的方式解决这个问题。您可以编辑自己的主机文件并为每个容器制作完整的假名称(只需添加 .dev 后缀,这样您就不会覆盖真实的 dns 名称)

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

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

http://127.0.1.1:9000

在那里你可以创建一个容器。首先指定名称和图像,然后向下滚动到 'Advanced container options' > Volumes > map additional volume。单击 'Bind' 按钮,指定容器中的路径(例如“/home”)和主机上的路径,就完成了!

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

注意:我不确定这是否是正确的处理方式。但是,我会在遇到任何问题时立即编辑此 post。

拉取镜像后,可以在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/ 我不记得在拉取图像或设置时做了什么特别的事情Docker.

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

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

datmo task run 'jupyter notebook' --port 8888

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