使用 Docker 容器持久化挂载本地路径避免数据丢失
使用 Docker 容器持久化挂载本地路径避免数据丢失
引言
不久前,我在进行数据分析时遇到了一个令人头疼的问题。由于工作需要,我频繁地在不同的环境中切换和测试代码。某天,在一次容器重建后,我突然发现所有的 Jupyter Notebook 环境配置和代码文件都不见了。把我给气死了、这不仅打断了我的工作流程,还让我意识到,必须找到一种方法来确保我的数据和环境不会因为容器的重建而丢失。
经过一番摸索和学习,我发现通过正确配置 Docker 的绑定挂载可以完美解决这个问题。今天,我想分享一下我的经验和心得,希望对同样遇到类似问题的朋友们有所帮助。
使用 Docker 容器持久化挂载本地路径避免数据丢失
1. 理解 Docker 数据持久化
Docker 容器默认情况下是无状态的,这意味着每次容器停止或重建时,容器内的数据都会丢失。为了防止这种情况发生,我们需要将容器内的数据持久化到宿主机上的一个目录中。这可以通过 Docker 的卷(Volumes)或绑定挂载(Bind Mounts)来实现。
2. 使用绑定挂载(Bind Mounts)
绑定挂载允许我们将宿主机上的一个目录直接挂载到容器内的指定路径。这样做的好处是可以直接访问宿主机上的文件系统,并且更容易管理数据。
步骤 1: 创建宿主机上的持久化目录
首先,在宿主机上创建一个用于持久化存储的目录:
mkdir -p /home/luke/jupyternotebook
步骤 2: 设置正确的权限
确保该目录及其内容具有适当的权限,以便容器内的用户可以读取和写入这些文件。假设容器内的 jovyan
用户的 UID 是 1000
,GID 是 100
:
sudo chown -R 1000:100 /home/luke/jupyternotebook
sudo chmod -R 755 /home/luke/jupyternotebook```
步骤 3: 启动容器并挂载本地路径
使用 -v 参数将宿主机上的目录挂载到容器内。同时,使用 -e NB_UID 和 -e NB_GID 指定容器内的用户 ID 和组 ID,确保容器内的用户与宿主机上的用户匹配:
深色版本
docker run -d \
--name datascience-notebook \
-v /home/luke/jupyternotebook:/home/jovyan/work \
-p 8888:8888 \
-p 5000-5020:5000-5020/tcp \
--restart=on-failure:3 \
-e NB_UID=1000 \
-e NB_GID=100 \
-u 1000:100 \
jupyter/datascience-notebook
- 验证数据持久化
启动容器后,进入容器并验证挂载点的权限是否正确:
docker exec -it datascience-notebook /bin/bash
ls -la /home/jovyan/work
你应该看到类似如下的输出,确认所有者和组是 jovyan 或 1000:100,并且权限是可读写的:
深色版本
total 12
drwxr-xr-x 2 jovyan users 4096 Dec 17 08:42 .
drwsrws--- 1 jovyan users 4096 Dec 17 08:56 ..