docker数据科学与spark镜像源与使用常见问题疑难解答

以下是一些与数据挖掘和数据科学相关的 Docker 镜像源:

  • jupyter/all-spark-notebook: 此镜像包含 Jupyter Notebook 和 Spark 的完整环境,用于 Spark 开发和学习。

  • rocker/tidyverse: 此镜像包含用于 R 语言的 tidyverse 数据科学包。

  • jupyter/scipy-notebook: 此镜像包含用于 Python 语言的 SciPy 科学计算库。

  • rstudio/r-shiny: 此镜像包含用于 R 语言的 Shiny Web 应用程序框架。

  • data-science-stack/docker-stack: 此镜像包含用于数据科学的各种工具和库。

这些只是一些可用的镜像源的示例。有关更多信息,请参阅以下资源:

运行容器

使用 Jupyter Docker Stack 之一需要两种选择:

  1. 您希望使用哪个 Docker 镜像

  2. 您希望如何从该镜像启动 Docker 容器

本节提供有关第二个的详细信息。

使用 Docker CLI

您可以使用Docker 命令行界面从 Jupyter Docker Stacks 启动本地 Docker 容器。使用 CLI 配置容器的方法有很多种。以下是一些常见的模式。

示例1

如果本地主机上尚不存在该命令,则此命令将从 Quay.io 中提取jupyter/scipy-notebook标记的映像。2024-01-15然后,它启动一个运行带有 JupyterLab 前端的 Jupyter Server 的容器,并在主机端口 8888 上公开服务器。服务器日志显示在终端中,并包含服务器的 URL。

复制代码
docker run -it -p 8888:8888 quay.io/jupyter/scipy-notebook:2024-01-15

# Entered start.sh with args: jupyter lab

# ...

#     To access the server, open this file in a browser:
#         file:///home/jovyan/.local/share/jupyter/runtime/jpserver-7-open.html
#     Or copy and paste one of these URLs:
#         http://eca4aa01751c:8888/lab?token=d4ac9278f5f5388e88097a3a8ebbe9401be206cfa0b83099
#         http://127.0.0.1:8888/lab?token=d4ac9278f5f5388e88097a3a8ebbe9401be206cfa0b83099

Ctrl-C两次将关闭服务器,但将容器完好无损地保留在磁盘上,以便以后使用如下命令重新启动或永久删除:

复制代码
# list containers
docker ps --all
# CONTAINER ID   IMAGE                                       COMMAND                  CREATED              STATUS                     PORTS     NAMES
# eca4aa01751c   quay.io/jupyter/scipy-notebook:2024-01-15   "tini -g -- start-no..."   About a minute ago   Exited (0) 5 seconds ago             silly_panini

# start the stopped container
docker start --attach -i eca4aa01751c
# Entered start.sh with args: jupyter lab
# ...

# remove the stopped container
docker rm eca4aa01751c
# eca4aa01751c

示例2

如果本地主机上尚不存在该命令,则此命令将从 Quay.io 中提取jupyter/r-notebook标记的映像。2024-01-15然后,它启动一个运行服务器的容器,并在主机端口 10000 上公开该服务器。服务器日志显示在终端中,并包含服务器的 URL,但使用内部容器端口 (8888),而不是正确的主机端口 (10000)。

复制代码
docker run -it --rm -p 10000:8888 -v "${PWD}":/home/jovyan/work quay.io/jupyter/r-notebook:2024-01-15

Ctrl-C两次将关闭服务器并立即销毁 Docker 容器。~/work容器中的新文件和更改将被保留。在容器中所做的任何其他更改都将丢失。
笔记

默认情况下,jupyter 的 root_dir/home/jovyan。因此,新的笔记本将保存在那里,除非您更改文件浏览器中的目录。

要更改默认目录,您需要ServerApp.root_dir通过将此行添加到上一个命令来指定:。start-notebook.py --ServerApp.root_dir=/home/jovyan/work

示例3

如果本地主机上尚不存在标记的映像,则此命令将从Quay.io中提取jupyter/all-spark-notebook当前标记的映像。然后,它启动一个名为运行 JupyterLab 服务器的容器,并在随机选择的端口上公开该服务器。latest``latest``notebook

复制代码
docker run --detach -P --name notebook quay.io/jupyter/all-spark-notebook

在哪里:

  • --detach:将以分离模式运行容器

您还可以使用以下 docker 命令来查看端口和 Jupyter 服务器令牌:

复制代码
# get the random host port assigned to the container port 8888
docker port notebook 8888
# 0.0.0.0:49153
# :::49153

# get the notebook token from the logs
docker logs --tail 3 notebook
    # Or copy and paste one of these URLs:
    #     http://878f1a9b4dfa:8888/lab?token=d336fa63c03f064ff15ce7b269cab95b2095786cf9ab2ba3
    #  or http://127.0.0.1:8888/lab?token=d336fa63c03f064ff15ce7b269cab95b2095786cf9ab2ba3

总之,在主机上访问服务器的 URL(在本例中为http://127.0.0.1:49153/lab?token=d336fa63c03f064ff15ce7b269cab95b2095786cf9ab2ba3 ) 。

容器在后台运行,直到被其他 Docker 命令停止和/或删除:

复制代码
# stop the container
docker stop notebook
# notebook

# remove the container permanently
docker rm notebook
# notebook

常见问题疑难解答

排除故障时,您可能会看到意外行为或收到错误消息。本节提供有关如何识别和解决一些最常见问题的建议。

本文档中使用的大多数标志在文档的"通用功能"、"Docker 选项"部分中进行了详细解释 。docker run

安装卷时权限被拒绝

-v如果您在使用以下标志挂载本地卷或主机目录时运行 Docker 容器:

复制代码
docker run -it --rm \
    -p 8888:8888 \
    -v <my-vol>:<container-dir> \
    quay.io/jupyter/minimal-notebook:latest

尝试访问已安装的卷时,您可能会遇到权限问题:

复制代码
# assuming we mounted the volume in /home/jovyan/stagingarea
# root is the owner of the mounted volume
ls -ld ~/stagingarea/
# drwxr-xr-x 2 root root 4096 Feb  1 12:55 stagingarea/

touch stagingarea/kale.txt
# touch: cannot touch 'stagingarea/kale.txt': Permission denied

在这种情况下,容器的用户 ( jovyan) 和已安装卷的所有者 ( root) 对容器的目录和安装具有不同的权限级别和所有权。以下部分介绍了其中一些场景以及如何修复它们。

一些值得尝试的事情:

  1. 更改卷安装的所有权

    您可以使用该命令更改卷装载的所有权chown。对于 docker-stacks 映像,您可以设置CHOWN_EXTRACHOWN_EXTRA_OPTS环境变量。

    例如,要将卷挂载的所有权更改为jovyan用户(Docker 映像中的非特权默认用户):

    复制代码
    # running in detached mode - can also be run in interactive mode
    docker run --detach \
        -v <my-vol>:<container-dir> \
        -p 8888:8888 \
        --user root \
        -e CHOWN_EXTRA="<container-dir>" \
        -e CHOWN_EXTRA_OPTS="-R" \
        quay.io/jupyter/minimal-notebook

    在哪里:

    • CHOWN_EXTRA=<some-dir>,<some-other-dir>:将更改指定容器目录的所有权和组(默认非递归)。您需要提供以/.

    • CHOWN_EXTRA_OPTS="-R": 将递归地更改 中指定的目录的所有权和组CHOWN_EXTRA

    • --user root:您必须使用 root 用户运行容器才能在运行时更改所有权。

    现在访问挂载应该可以按预期工作:

    复制代码
    # assuming we mounted the volume in /home/jovyan/stagingarea
    ls -ld ~/stagingarea
    # drwxr-xr-x 2 jovyan users 4096 Feb  1 12:55 stagingarea/
    
    touch stagingarea/kale.txt
    # jovyan is now the owner of /home/jovyan/stagingarea
    # ls -la ~/stagingarea/
    # -rw-r--r-- 1 jovyan users    0 Feb  1 14:41 kale.txt

    补充笔记

    • 如果要在目录中安装卷/home/,则可以使用和标志而不是上面示例中的和。-e CHOWN_HOME=yes``CHOWN_HOME_OPTS="-R"``-e CHOWN_EXTRA``-e CHOWN_EXTRA_OPTS

    • 此解决方案应该适用于您创建了 docker 卷(即使用命令并使用中的标志安装它的大多数情况。docker volume create --name <my-volume>-v``docker run

  2. 将容器的 UID/GID 与主机的 UID/GID 相匹配

    Docker 处理挂载主机目录的方式与挂载卷的方式不同,尽管语法本质上是相同的(即-v)。

    当您使用该标志初始化 Docker 容器时-v,主机目录将直接绑定安装到容器中。因此,权限和所有权将被复制,并将与本地主机中的权限和所有权(包括用户 ID)相同,这可能会导致在尝试访问目录或在其中创建/修改文件时出现权限错误**。**

    假设您的本地用户分别有UIDGID12345678要修复本地目录和容器目录之间的 UID 差异,您可以使用显式的NB_UID和来运行容器NB_GID以匹配本地用户的 UID:

    复制代码
    docker run -it --rm \
        --user root \
        -p 8888:8888 \
        -e NB_UID=1234 \
        -e NB_GID=5678 \
        -v "${PWD}"/test:/home/jovyan/work \
        quay.io/jupyter/minimal-notebook:latest
    
    # you should see an output similar to this
    # Update jovyan's UID:GID to 1234:5678
    # Running as jovyan: bash

    在哪里:

    • NB_IUD并且NB_GID应该与本地用户的 UID 和 GID 匹配。

    • 必须 使用来确保 和在运行时更新。--user root``UID``GID

补充笔记

  • 这种方法需要注意的是,由于这些更改是在运行时应用的,因此如果您需要重新创建容器(即在删除/销毁容器之后),您将需要使用适当的标志和环境变量重新运行相同的命令。

  • 如果传递数字 UID,则它必须在 0-2147483647 范围内

  • 此方法仅更新现有jovyan用户的 UID 和 GID,而不是创建新用户。从上面的例子来看:

    复制代码
    id
    # uid=1234(jovyan) gid=5678(jovyan) groups=5678(jovyan),100(users)

更改容器中UID/GID和USER后的权限问题

如果您还创建了新用户,则可能会遇到以下任一问题:

  • 用户root是卷的所有者/home或已安装的卷

  • 启动容器时,您会收到如下错误Failed to change ownership of the home directory.

  • 尝试打包时权限被拒绝conda install

一些值得尝试的事情:

  1. 确保新用户拥有卷的所有权/home和卷安装

    例如,假设您要创建一个callisto具有 aGIDUIDof的用户1234。您必须将以下标志添加到 docker run 命令中:

    复制代码
     docker run -it --rm \
         -p 8888:8888 \
         --user root \
         -e NB_USER=callisto \
         -e NB_UID=1234 \
         -e NB_GID=1234 \
         -e CHOWN_HOME=yes \
         -e CHOWN_HOME_OPTS="-R" \
         -w "/home/callisto" \
         -v "${PWD}"/test:/home/callisto/work \
         quay.io/jupyter/minimal-notebook
    
     # Updated the jovyan user:
     # - username: jovyan       -> callisto
     # - home dir: /home/jovyan -> /home/callisto
     # Update callisto UID:GID to 1234:1234
     # Attempting to copy /home/jovyan to /home/callisto...
     # Success!
     # Ensuring /home/callisto is owned by 1234:1234
     # Running as callisto: bash

    在哪里:

    • -e NB_USER=callisto:将创建一个新用户callisto并自动将其添加到users组中(不会删除jovyan)

    • -e NB_UID=1234and : 将新用户 ( )的and设置为-e NB_GID=1234``UID``GID``callisto``1234

    • -e CHOWN_HOME_OPTS="-R"和:确保新用户是目录和子目录的所有者(设置将确保递归应用此更改)-e CHOWN_HOME=yes``/home``CHOWN_HOME_OPTS="-R

    • -w "/home/callisto"将工作目录设置为新用户的主目录

    补充笔记

    在上面的示例中,该-v标志用于将本地卷安装到新用户的/home目录中。

    但是,如果您在其他地方安装卷,则还需要使用该标志来避免任何权限问题(请参阅本页上的"安装卷时权限被拒绝"部分)。-e CHOWN_EXTRA=<some-dir>

  2. 动态分配用户 ID 和 GID

    上述情况确保该目录由具有特定和/home的新创建用户拥有,但如果您想动态分配新用户的和,可以进行以下调整:UID``GID``UID``GID

    复制代码
    docker run -it --rm \
        -p 8888:8888 \
        --user root \
        -e NB_USER=callisto \
        -e NB_UID="$(id -u)" \
        -e NB_GID="$(id -g)"  \
        -e CHOWN_HOME=yes \
        -e CHOWN_HOME_OPTS="-R" \
        -w "/home/callisto" \
        -v "${PWD}"/test:/home/callisto/work \
        quay.io/jupyter/minimal-notebook

    在哪里:

    • "$(id -u)" and "$(id -g)"将动态地将执行命令的用户的UID和分配给新用户 ( )GID``docker run``callisto

针对与权限相关的错误的其他提示和故障排除命令

  • 将绝对路径传递给-v标志:

    复制代码
    -v "${PWD}"/<my-vol>:/home/jovyan/work

    此示例使用语法${PWD},该语法在运行时替换为当前目录的完整路径。/目标路径也应该是以诸如开头的绝对路径/home/jovyan/work

  • 您可能需要考虑使用 Docker 本机和标志而不是and :--user <UID>``--group-add users``-e NB_UID``-e NB_GID

    复制代码
    # note this will use the same UID from
    # the user calling the command, thus matching the local host
    
    docker run -it --rm \
        -p 8888:8888 \
        --user "$(id -u)" --group-add users \
        -v <my-vol>:/home/jovyan/work quay.io/jupyter/datascience-notebook

    此命令将使用特定用户 UID 启动容器,并将该用户添加到组中以修改默认目录users中的文件。进一步避免尝试附加软件包时出现问题。/home``/opt/conda``conda install

  • 使用并查找该部分 来验证是否已相应地创建并安装了卷:docker inspect <container_id>Mounts

    复制代码
    {
      "Mounts": [
        {
          "Type": "volume",
          "Name": "my-vol",
          "Source": "/var/lib/docker/volumes/stagingarea/_data",
          "Destination": "/home/jovyan/stagingarea",
          "Driver": "local",
          "Mode": "z",
          "RW": true,
          "Propagation": ""
        }
      ]
    }

从特定渠道安装 conda 包时出现问题

默认情况下,docker-stacks 映像的 conda 通道优先级设置为strict。当尝试从优先级较低的通道安装软件包时,这可能会导致问题。

复制代码
conda config --show | grep priority
# channel_priority: strict

# to see its meaning
conda config --describe channel_priority

# checking the current channels
conda config --show default_channels
# default_channels:
# - https://repo.anaconda.com/pkgs/main
# - https://repo.anaconda.com/pkgs/r

从其他渠道安装软件包:

您可以bioconda通过禁用该channel_priority设置来安装来自其他 conda 频道(例如 )的软件包:

复制代码
# install by disabling channel priority at еру command level
conda install --no-channel-priority -c bioconda bioconductor-geoquery

通用功能页面的使用替代渠道部分提供了更多详细信息。

令牌被拒绝

如果您是 VSCode 和 Jupyter 扩展的常规用户,则在使用任何 docker-stacks 映像时可能会遇到以下任一问题:

  • 单击命令行日志中显示的 URL 时,您会在 Web 浏览器上看到"无法访问此站点"页面

  • 使用生成的令牌和/或 URL 会导致 Jupyter"令牌身份验证已启用"页面上出现"无效凭据"错误

    复制代码
    # example log output from the docker run command
    
    # [...]
    # Or copy and paste one of these URLs:
    #   http://3d4cf3809e3f:8888/?token=996426e890f8dc22fa6835a44442b6026cba02ee61fee6a2
    #   or http://127.0.0.1:8888/?token=996426e890f8dc22fa6835a44442b6026cba02ee61fee6a2

一些值得尝试的事情:

  1. 在后台查找挥之不去的 Jupyter 进程

    您要尝试的第一件事是检查后台是否没有其他 Jupyter 进程正在运行:

    复制代码
    ps aux | grep jupyter

    如果存在正在运行的现有进程,您可以使用以下命令终止它们:

    复制代码
    # example output from the above command
    # my-user 3412 ... --daemon-module=vscode_datascience_helpers.jupyter_daemon
    
    # using the pid from the above log
    kill 3412
  2. 在 VSCode 中关闭 Jupyter 自动启动

    或者 - 您可能需要确保打开该设置以避免将来出现此问题。Jupyter: Disable Jupyter Auto Start

    您可以通过VScode 中的菜单实现此目的:Settings > Jupyter

  3. 将容器路由到未使用的本地端口

    不要将 Docker 端口映射8888到本地端口8888,而是映射到另一个未使用的本地端口。您可以看到映射到本地端口的示例8001

    复制代码
    docker run -it --rm -p 8001:8888 quay.io/jupyter/datascience-notebook

    当终端提供访问Jupyter的链接:http://127.0.0.1:8888/lab?token=80d45d241a1ba4c2...8888时,将URL中的默认端口值修改为命令映射的端口值。docker run

    在本例中,我们使用 8001,因此编辑后的链接将是:http://127.0.0.1: 8001/lab?token=80d45d241a1ba4c2 ... 。

    注意:Jupyter 的端口映射在 Docker 之外还有其他应用程序。例如,当使用 SSH 控制云设备时,它可用于允许多个 Jupyter 实例。

相关推荐
市场部需要一个软件开发岗位4 分钟前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
忆~遂愿8 分钟前
GE 引擎进阶:依赖图的原子性管理与异构算子协作调度
java·开发语言·人工智能
MZ_ZXD00112 分钟前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
PP东15 分钟前
Flowable学习(二)——Flowable概念学习
java·后端·学习·flowable
ManThink Technology20 分钟前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络
invicinble24 分钟前
springboot的核心实现机制原理
java·spring boot·后端
人道领域32 分钟前
SSM框架从入门到入土(AOP面向切面编程)
java·开发语言
大模型玩家七七1 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
CodeToGym1 小时前
【Java 办公自动化】Apache POI 入门:手把手教你实现 Excel 导入与导出
java·apache·excel
凡人叶枫2 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发