本文主要是介绍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: 此镜像包含用于数据科学的各种工具和库。
这些只是一些可用的镜像源的示例。有关更多信息,请参阅以下资源:
- Docker 官方文档: Docker Docs
- Docker Hub: https://hub.docker.com/
- Jupyter Notebooks: Project Jupyter | Home
- Spark: Apache Spark™ - Unified Engine for large-scale data analytics
- Tidyverse: Tidyverse
- SciPy: SciPy
- Shiny: Shiny
- Data Science Stack: <移除了无效网址>
运行容器
使用 Jupyter Docker Stack 之一需要两种选择:
-
您希望使用哪个 Docker 镜像
-
您希望如何从该镜像启动 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
) 对容器的目录和安装具有不同的权限级别和所有权。以下部分介绍了其中一些场景以及如何修复它们。
一些值得尝试的事情:
-
更改卷安装的所有权
您可以使用该命令更改卷装载的所有权
chown
。对于 docker-stacks 映像,您可以设置CHOWN_EXTRA
和CHOWN_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
-
-
将容器的 UID/GID 与主机的 UID/GID 相匹配
Docker 处理挂载主机目录的方式与挂载卷的方式不同,尽管语法本质上是相同的(即
-v
)。当您使用该标志初始化 Docker 容器时
-v
,主机目录将直接绑定安装到容器中。因此,权限和所有权将被复制,并将与本地主机中的权限和所有权(包括用户 ID)相同,这可能会导致在尝试访问目录或在其中创建/修改文件时出现权限错误。假设您的本地用户分别有
UID
和GID
和1234
。5678
要修复本地目录和容器目录之间的 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
一些值得尝试的事情:
-
确保新用户拥有卷的所有权
/home
和卷安装例如,假设您要创建一个
callisto
具有 aGID
和UID
of的用户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=1234
and : 将新用户 ( )的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>
-
-
动态分配用户 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 hostdocker 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
一些值得尝试的事情:
-
在后台查找挥之不去的 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
-
在 VSCode 中关闭 Jupyter 自动启动
或者 - 您可能需要确保打开该设置以避免将来出现此问题。
Jupyter: Disable Jupyter Auto Start
您可以通过VScode 中的菜单实现此目的:
Settings > Jupyter
-
将容器路由到未使用的本地端口
不要将 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 实例。
这篇关于docker数据科学与spark镜像源与使用常见问题疑难解答的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!