如何使用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
它在环境中设置您的项目和文件以跟踪您的进度。
安装 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
它在环境中设置您的项目和文件以跟踪您的进度。