Skip to main content
 首页 » 编程设计

python之如何在 docker 容器中使用数据

2024年10月01日26lyhabc

安装 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 创建您自己的图像并复制文件
  • 将您的计算机/服务器上的目录映射到容器中
  • 你也可以使用docker cp,从两个容器复制文件, 但从长远来看,这不是很实用。

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

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

在您的项目目录中,添加一个包含环境文件和组合文件的 docker-dev 文件夹(或您想要的任何名称)。 compose 文件负责告诉 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 

撰写文件会将您的每个项目描述为“服务”。我们在这里使用 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 

在运行中的容器内跳跃

docker-compose exec project_a bash 

只需在前台运行容器:

docker-compose run project_a 

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

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

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