简介

JupyterLab是Jupyter Notebook的下一代版本,提供了更强大的用户界面和功能,可用于更复杂的工作流程和项目。

安装

docker安装

在 Docker 中为 pip 指定国内镜像源

Dockerfile 中使用环境变量

这是最简洁、最直接的方法。通过在 Dockerfile 中设置 PIP_INDEX_URL 环境变量,可以为容器内所有的 pip install 命令全局指定镜像源。

步骤 1: 修改 Dockerfile

在你的 Dockerfile 中,在执行 pip install 命令之前,添加 ENV 指令来设置环境变量。

# 使用官方的 Jupyter 镜像作为基础
FROM jupyter/minimal-notebook
# --- 开始设置 pip 源 ---
# 设置中科大的 PyPI 镜像源
ENV PIP_INDEX_URL https://pypi.mirrors.ustc.edu.cn/simple
# --- 结束设置 pip 源 ---
# 设置工作目录
WORKDIR /home/jovyan/work
# 复制 requirements.txt 并安装依赖
# 因为上面已经设置了环境变量,所以这里的 pip install 会自动使用中科大源
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 容器启动时执行的命令
CMD ["start-notebook.sh", "--NotebookApp.token=''"]

解释:

  • ENV PIP_INDEX_URL https://pypi.mirrors.ustc.edu.cn/simple: 这行命令告诉 pip,以后安装任何包时,都去中科大的镜像源地址查找,而不是去官方的 PyPI 源。
  • 这个设置对容器内所有用户和所有 pip 命令都有效。

步骤 2: 构建和启动

现在,你可以像之前一样使用 docker-compose 来构建和启动服务。

# 确保在 docker-compose.yml 所在目录
docker compose up -d --build
  • --build 参数会强制重新构建镜像,以应用你对 Dockerfile 的修改。

如何验证是否生效?

你可以进入正在运行的容器,手动执行一个 pip install 命令,查看其输出日志。

  1. 进入容器:
docker exec -it my-jupyter-container /bin/bash

(请将 my-jupyter-container 替换为你的容器名)

  1. 在容器内执行 pip 命令:
pip install requests -v
  • -v (verbose) 参数会显示详细的安装过程。
  1. 查看输出:

    在输出的日志中,你应该能清晰地看到类似下面这样的行,表明 pip 正在从中科大源下载包:

       Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple
    
       Collecting requests
    
       Downloading https://pypi.mirrors.ustc.edu.cn/packages/.../requests-2.31.0-py3-none-any.whl (62 kB)
    

    pip安装

    使用pipconda等均可安装
    pip示例:

      pip install jupyterlab
    

    conda示例:

      conda install -c conda-forge jupyterlab
    
    启动

    安装完成后, 使用jupyter lab即可启动, 默认端口为8888, 浏览器访问http://localhost:8888/lab就能打开, 进入界面需要输入token才行, 后台日志中会有类似http://localhost:8888/lab?token=af6sg...的日志, 其中token的值就是界面访问所需要的.

    改进

    以上启动方式虽然能够访问, 但是存在如下问题:

  2. 不能轻易关闭终端, 否则jupyter进程将被终止

  3. jupyter一般是给远程用户访问的, 因此需要指定允许远程访问: --ip=0.0.0.0, 另外大概率会安装在类似ubuntu server这种不带界面的系统中, 可以指定参数--no-browser

  4. 容易造成端口冲突(冲突时端口号会自增), 因此最好指定一个固定的端口

  5. jupyter启动默认的工作空间是执行启动命令时所在文件夹, 最好指定一个固定的地方, 比如:~/.jupyter/workspace

  6. 重复执行相同的启动命令, 会因为端口号自增而产生多个实例, 而这一般是不必要的

    基于以上问题, 我们可以写一个启动脚本, 统一解决上述问题

    创建用户

       # 创建jupyter用户并设置登录密码
       sudo useradd -m -s /bin/bash jupyter && sudo passwd jupyter
    
       # 将jupyter加入到sudo群组
       sudo usermod -aG sudo jupyter
       # 登录jupyter用户
       su - jupyter
    

    配置脚本

       cat << "JUPYTER" > ~/start.sh
       # 创建必要目录
       mkdir -p ~/.jupyter/workspace ~/.jupyter/venv ~/.jupyter/scripts
    
       # 创建虚拟环境
       python3 -m venv ~/.jupyter/venv
       source ~/.jupyter/venv/bin/activate
    
       # 安装jupyterlab
       pip config set global.index-url https://pypi.mirrors.ustc.edu.cn/simple/
       pip install jupyterlab
       echo "已安装JupyterLab"
    
       # 生成配置文件
       yes | jupyter lab --generate-config --allow-config
       echo "已生成配置文件"
    
       # 修改配置文件
       # cat > ~/.jupyter/jupyter_notebook_config.py <<CONFIG
       # c.ServerApp.ip = '0.0.0.0'
       # c.ServerApp.port = 8888
       # c.ServerApp.root_dir = '/home/jupyter/.jupyter/workspace'
       # c.ServerApp.allow_remote_access = True
       # c.ServerApp.open_browser = False
       # CONFIG
       # echo "已配置JupyterLab参数"
    
       # 创建启动脚本
       cat > ~/.jupyter/scripts/start_jupyter.sh <<SCRIPT
       #!/bin/bash
       # 检查端口是否被占用
       if ss -tuln | grep -q ":8888 "; then
           echo "JupyterLab已在运行(端口8888)"
           exit 0
       fi
    
       # 激活虚拟环境并启动
       source /home/jupyter/.jupyter/venv/bin/activate
       jupyter lab --ip=0.0.0.0 --port=8888 --notebook-dir='/home/jupyter/.jupyter/workspace'
       SCRIPT
    
       # 赋予执行权限
       chmod +x ~/.jupyter/scripts/start_jupyter.sh
       echo "已创建启动脚本"
    
    
    
       nohup  ~/.jupyter/scripts/start_jupyter.sh 2>&1>~/.jupyter/jupyter.log &
    
       JUPYTER
    
    
       chmod +x ~/start.sh
    
    

    设置访问密码(可选)

       # 安装jupyter-core
       sudo apt install jupyter-core
       # 设置Jupyter密码(按提示操作)
       echo "请设置Jupyter访问密码:"
       jupyter server password
    

    可以不设置, 首次访问界面时, 会要求根据初始token进行密码设置

    启动

       ~/start.sh