IT教程 ·

用Docker布置本身的JupyterHub

PBFT 算法 java实现(下)

【话在前头】

用 Docker 布置 JupyterLab 觉得是布置 JupyterLab 最轻易的体式格局了,官方供应了许多可选的镜像,也可以自身从  中继承打包,镜像启动敕令加上“--NotebookApp.password”就可以直接用暗码登录用了。虽然只是自身一个人用,然则假如放在互联网上接见的话,总觉得不是那末平安,照样希望能像其他效劳一样,能自力治理用户信息,能设置二次考证(2FA)。不过搜了下网上关于 JupyterHub 的材料比较少,甚至于官方的申明文档写的也不是很细致,有些设置和参数只能去源码里扒。

 

【文章索引】

 

【一、打包 JupyterHub 镜像】

架构的引见和道理中形貌的异常清晰了,这里不再赘述了,简单说就是 JupyterHub 把 认证 和 单用户 JupyterLab 的治理 离别拆成了 Authenticator 和 Spawner 模块,可以依据差别的须要设置差别的认证体式格局或治理体式格局。不过官方的 JupyterHub 镜像只包括了 自身,只要最基本的认证和治理(如经由过程 Linux 下 PAM 举行认证、经由过程当地历程运转 JupyterLab 等)。假如想经由过程自定义账号暗码、而且开启 2FA 的话,JupyterHub 实在也已完成了一个官方的  模块,照样比较细致的,默许用户信息存储在 JupyterHub 的 sqlite 数据库中,可以经由过程数据源设置改成 Mysql,假如须要衔接 Mysql 的话,官方的镜像也不包括相干模块,也须要自行装置。

除此之外,假如 JupyterHub 治理的 JupyterLab 也想在 docker 中运转的话,还须要运用官方供应的  举行治理,不过官方文档不是迥殊细致,幸亏代码不多,扒扒代码也能看邃晓详细应当怎样设置。

所以,假如我们须要完成能自力治理的用户信息、支撑2FA、运用Mysql数据库存储用户数据,用户的 JuyterLab 也经由过程 docker 镜像举行运转和治理的话,我们可以经由过程以下的 Dockerfile 在官方镜像之上打一个更完全的镜像。

 1 ARG BASE_IMAGE=jupyterhub/jupyterhub:1.2
 2 FROM $BASE_IMAGE
 3 
 4 LABEL maintainer="MaysWind <i@mayswind.net>"
 5 
 6 # Install Dependencies
 7 RUN apt-get update 
 8   && apt-get install -y --no-install-recommends unzip 
 9   && rm -rf /var/lib/apt/lists/* 
10   && rm -rf /tmp/*
11 
12 # Install Mysql
13 RUN pip3 --no-cache-dir install mysql-connector 
14   && rm -rf /tmp/*
15 
16 # Install NativeAuthenticator
17 RUN curl "https://github.com/jupyterhub/nativeauthenticator/archive/master.zip" -L -o /tmp/nativeauthenticator.zip 
18   && unzip /tmp/nativeauthenticator.zip -d /tmp 
19   && mv /tmp/nativeauthenticator-master /usr/local/bin/nativeauthenticator 
20   && pip --no-cache-dir install -e /usr/local/bin/nativeauthenticator 
21   && rm -rf /tmp/*
22 
23 # Install DockerSpawner
24 RUN pip --no-cache-dir install dockerspawner 
25   && rm -rf /tmp/*

注:写这篇博客的时刻,JupyterHub 的最新 Release 版本是 1.1.0,然则 1.1.0 的 docker 镜像存在问题(静态资本没有编译等),所以这里运用的是还在开发中的镜像(1.2 tag 现在与 1.2.0dev tag 一致)。

 

【二、设置 JupyterHub 启动参数】

打完镜像后后实在就可以启动了,不过一般另有些设置须要调解下。我经由过程 docker-compose 启动 JupyterHub 容器,一切设置参数都经由过程参数或环境变量举行设置,同时因为 JupyterHub 在 docker 容器中,还须要把宿主机的 docker.sock 挂载到容器内,以便 JupyterHub 可以治理 JupyterLab 容器。而且为 JupyterHub 和以后的 JupyterLab 建了一个零丁的收集,轻易以后对 JupyterLab 的要求举行断绝,假如没有需求的话实际上按默许的收集设置也是可以的,相干的 yml 示例设置以下

 1 version: "2"
 2 networks:
 3   jupyter-network:
 4     driver: bridge
 5     ipam:
 6       config:
 7         - subnet: 192.168.254.0/24
 8           gateway: 192.168.254.1
 9 services:
10   jupyterhub:
11     image: 你的 JupyterHub 镜像称号 
12     container_name: jupyterhub
13     hostname: "jupyterhub"
14     networks:
15       - "jupyter-network"
16     command:
17       - "jupyterhub"
18       - "--JupyterHub.hub_bind_url='http://:8081'" # JupyterHub 默许绑定 127.0.0.1,须要改成绑定一切 IP 使 JupyterLab 能跨容器接见
19       - "--JupyterHub.db_url='mysql+mysqlconnector://Mysql用户名:Mysql暗码@数据库地点/数据库称号'" # 设置 Mysql 数据库,假如运用默许 Sqlite,可以挂载目次到 /srv/jupyterhub 完成数据库耐久化
20       - "--JupyterHub.authenticator_class='nativeauthenticator.NativeAuthenticator'" # 运用 NativeAuthenticator
21       - "--JupyterHub.spawner_class='dockerspawner.DockerSpawner'" # 运用 DockerSpawner
22       - "--JupyterHub.admin_access=True" # 启用治理员功用
23       - "--Authenticator.admin_users={'治理员账户称号'}" # 治理员称号
24       - "--Authenticator.allow_2fa=True" # 开启 2FA 功用
25       - "--DockerSpawner.remove_containers=True" # 每次启动 JuypyterLab 容器时都删除之前的容器,假如经由过程 docker-compose 设置的收集,docker-compose 从新设置收集后一定要从新建立容器才启动
26       - "--DockerSpawner.notebook_dir='/home/jovyan/work'" # 设置笔记本默许目次(默许是 ~)
27       - "--DockerSpawner.image='你的 JupyterLab 镜像称号'"
28       - "--DockerSpawner.network_name='JupyterLab 收集称号'" # 假如是经由过程 docker-compose 设置的收集,与第3行大概不一致,须要经由过程 docker network ls 检察
29       - "--DockerSpawner.args=['--Application.log_level=WARN']" # 设置日记默许输出级别
30       - "--DockerSpawner.environment={
31              'JUPYTER_ENABLE_LAB': 'yes' # 开启 JupyterLab
32            }"
33       - "--DockerSpawner.volumes={
34              '/etc/localtime': {'bind': '/etc/localtime', 'mode': 'ro'},
35              '本机 Jupyter 笔记存储途径': '/home/jovyan/work'  # 可以运用 “{username}” 占位,示意用户名,如 '/mnt/data1/jupyter/{username}/work': '/home/jovyan/work'
36            }"
37     volumes:
38       - "/etc/localtime:/etc/localtime:ro"
39       - "/var/run/docker.sock:/var/run/docker.sock"
40     restart: on-failure

个中,JupyterHub 设置文件中的设置都可以经由过程启动参数的体式格局举行设置,如上述设置中 command 中的设置项,一切 JupyterHub 设置可以参考。关于 NativeAuthenticator,也分外供应了一些其他参数,如自身注册完账号,可以设置“Authenticator.open_signup”参数为 False,封闭开放注册功用,“Authenticator.ask_email_on_signup” 注册时须要供应邮箱账号等,这些参数可以如上附到启动参数中,或许也可写入到设置文件中,更多参数和用法可以参考。关于 DockerSpawner,有些参数是完成了基本类 Spawner 中定义的,可以查阅  举行设置,也有部份是其自身零丁完成的,可以查阅其,例如其支撑限定内存 “DockerSpawner.mem_limit”、限定CPU “DockerSpawner.cpu_limit”等参数,都是完成基本类 Spawner 中定义的,Docker 收集称号 “DockerSpawner.network_name ”、启动容器前删除已有容器的参数 “DockerSpawner.remove_containers” 等都是其自身自身完成的。

假如之前也是经由过程 docker 布置的 JupyterLab,大概下述几个参数能迁徙大部份之前的个性化设置,

  • DockerSpawner.args 可以追加 JupyterLab 容器的启动参数,默许启动敕令是“start-notebook.sh --ip=0.0.0.0 --port=8888”,可以追加多个参数(如上述设置了设置了日记输出级别为WARN,JupyterLab 设置文件中的设置都可以运用此体式格局举行设置,相干设置可以参考),参数花样是 python 的 dict。
  • DockerSpawner.environment 可以设置 JupyterLab 容器的环境变量,如上述设置了开启 JupyterLab 功用,容器一切环境变量可以参考,参数花样是 python 的 dict。
  • DockerSpawner.volumes 可以设置 JupyterLab 容器的挂载设置,供应了两种设置体式格局(读写形式:'source_path': 'target_path',或自定义读写形式(如只读):'source_path': {'bind': 'target_path', 'mode': 'ro'}),花样是 python 的 dict。

 

【三、启动 JupyterHub】

依据第二步的设置,就可以经由过程 docker-compose 或许其他体式格局启动 JupyterHub 的 docker 镜像了,只不过很有大概会失利,主如果因为 NativeAuthenticator 对 Mysql 的兼容性问题,用于治理注册用户信息的那张表没有自动建立胜利,不过我们可以帮他完成这个使命,即编写相似以下的SQL(详细存储引擎、编码可以依据自身实际状况调解)。

CREATE TABLE `users_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `password` blob NOT NULL,
  `is_authorized` bit(1) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `has_2fa` bit(1) DEFAULT NULL,
  `otp_secret` varchar(16) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

建立完 users_info 表后 JupyterHub 应当就可以一般启动了,接下来就可以自身举行注册账号了,假如没有封闭开放注册功用或许注册的账号名在设置中的治理员用户名中的话,账号直接就可以登录,不然须要自行去数据库中找到自身注册的纪录,并将 “is_authorized” 字段设置为1。

登录后应当会默许启动 JupyterLab,或许也可以自行挑选启动,启动胜利后会自动跳转到 JupyterLab,下次接见时直接就会接见 JupyterLab,而不会再显现 JupyterHub 的界面了。假如启动失利,也可以经由过程 docker 检察 JupyterLab 的容器状况。

 

【四、断绝 JupyterHub/JupyterLab 收集】

JupyterLab 里什么都醒目,能实行代码,能运转剧本,总觉得布置了 JupyterLab 后,直接把内网环境对外打开了,所以还想再对 JupyterHub/JupyterLab 的收集举行断绝,不许可其接见内网。这块经由过程 iptables 就可以完成,比方上述我定义了 jupyter-network 收集,IP 是 192.168.254.0/24,我内网 IP 是 192.168.1.0/24,路由(网关)是 192.168.1.1,所以我在宿主机上定义以下 iptables,制止来自 jupyter-network 的 IP 要求内网 IP(但许可经由过程路由接见互联网)。固然,假如 Mysql 效劳器不与 JupyterHub/JupyterLab 在一台宿主机上的话,别忘了许可 JupyterHub 的 IP 地点接见 Mysql 端口。

iptables -I DOCKER-USER -s 192.168.254.0/24 -d 192.168.1.0/24 -j DROP
iptables -I DOCKER-USER -s 192.168.254.0/24 -d 192.168.1.1 -j ACCEPT

另外,假如宿主机上另有其他效劳或 docker 实例,假如须要制止 JupyterHub/JupyterLab 接见他们,还须要再定义一条

iptables -I INPUT -s 192.168.254.0/24 -p tcp -j DROP

 

如许,应当就相对平安了一些吧。

3.【Spring Cloud Alibaba】声明式HTTP客户端-Feign

参与评论