Docker实现Python的Jupyterhub远程开发环境集成

python可以有多种编程环境,notebook简单好用,基本代码块的编写调试是不错的。如果能将整个环境打包成docker容器,并部署成远程多用户安全连接就更好了,实现这个过程克服了不少问题,这里记录一下基本实现方法。

基本目的:

1、全部docker安装,这样所有组件与本地系统隔离,不容易搞乱操作系统而且可以移植、保存,实现一次部署分发使用。

2、用jupyterhub实现多用户远程外网使用。

3、用系统反向代理实现https安全连接。

实现方法:

1、docker安装一个有linux环境的基础镜像,并完成基础配置

linux的一般发行版都可以,最好已经带了python环境,如果没有python自己安装。基本步骤是:

1.1 拉取一个有linux环境的镜像。

1.2 按要求启动容器。

1.3 从终端进行容器内部,update linux操作系统到最新列表,添加系统用户并设置密码,以后notebook就用这些系统用户帐户登录。

1.4 在容器内安装python、安装pip(或者conda)。

2、docker容器中安装notebook

2.1 pip3 install jupyterhub安装jupyterhub服务器,这一步要做一些配置,按网上教程。配置以下几项就可以了。

c.JupyterHub.ip = '172.17.0.***'
c.JupyterHub.port = ****
c.JupyterHub.statsd_prefix = 'jupyterhub'
    
# 白名单用户
c.Authenticator.whitelist ={'user_name_1','user_name_2','user_name_3'}

因为安装在docker中,这里的ip地址要填容器内部真实ip,如果不清楚可终端进入容器内部,用ifconfig查看,如果系统提示未找到命令,可以先安装net-tools工具,因为容器都是极简系统有可能没有集成网络工具。

注:系统运行很长一段时间后进行了Docker版本的升级,再次运行容器时发现JupyterHub无法运行,在Supervisor工具的管理下反复重启,多处查看都不清楚原因,认为可能是Docker升级造成容器不兼容,准备重装该容器,再读这篇文章,“这里的ip地址要填容器内部真实ip”,想到系统更新可能造成内部ip变化,进入系统查看果然如此,修改配置文件中的参数,容器立刻稳定运行。

2.2 pip3 install jupyter安装notebook服务器。如果系统提示缺少依赖,一样pip install。如何不想启动本地的notebook编辑器,则notebook可以不配置。

3、退出容器,并停止容器运行,用容器管理工具将c.JupyterHub.ip指定的端口映射到宿主机的本地端,这一步可以提前在启动基础镜像时就映射好,有可能有些系统容器运行后不好再添加端口。

4、再次运行容器,进入容器,启动notebook服务。

cd 到jupyterhub配置文件目录,输入

nohup jupyterhub > jupyterhub.log & 让服务后台运行

打开浏览器输入ip:port验证系统是否真正已部署好,这里有可能会有问题,按网上教程应该都能解决。

5、利用宿主机的nginx反向代理实现SSL安全连接

5.1 准备需要SSL连接的域名和证书,按网上教程自行注册购买,都有免费的,一样好用,如果已有就没问题了。

5.2 宿主机安装nginx服务器,配置好wss,将jupyterhub容器的http连接配置成通过https反向代理。按通用配置就可以,不用考虑jupyterhub的特殊性,这是docker安装jupyterhub的一大优点,如果在主机上直接安装jupyterhub就必须按官网要求对nginx的配置进行修改,非常麻烦。

6、几点提醒:

6.1 容器内部相当于一个独立的操作系统环境,安装过程中缺少组件可以直接安装,python环境库比较多,必须满足依赖要求。

6.2 安装了pip3后,最好装一下conda,有极少数软件只有conda可以装。

6.3 基本安装完成后先局域网调试通过,确保运行常,如何连接有问题建议重新安装jupyter

6.4 用命令让jupyterhub后台运行,这样不会因为终端退出服务也跟着退出,用ps -a 命令检查进程是否真正运行,如果命令不能挂起可先回车再查看,不行再次运行挂起命令。少数时候因内部端口冲突会造成挂不起来,但每次运行挂起命令会用不同的端口,这样就可以避开冲突了。

6.5 在内网可以正常连接jupyterhub的情况下,用域名可以登入jupyterhub但显示无法连接python内核是因为nginx配置中没有正确设置好websocket。

6.6 最好在开始安装阶段将linux和pip的源改成国内的,否则有些安装可能无法进行下去。

6.7 现在可参考资料都要求安装anaconda配置虚拟环境,本文没有涉及,不同系统是否有不同没有更多的测试。

群晖安装homeassistant并连接iphone手机

一、利用docker管理工具直接安装

docker可以较好地与系统隔离,重新配置方便,运行性能也可以。比较推荐用群晖自己的管理工具安装,启动镜像后除了映射一下config目录,全部默认。用命令安装过一次,好像要端口映射,运行后发现智能开关等也有问题。

二、连接苹果HomeKit不用安装homebridge

最新版的homeassistant带有各种智能家居的网桥,其中就有HomeKit的,添加后手机扫描二维码就可以建立与homeassistant的连接。

1、进入配置,选集成

2、选择右下角的添加集成,并搜索homekit,添加homekit

3、后面默认添加,成功后界面左下角显示有新的通知,点开后用手机的homkit扫描,连接完成。

Docker中的pycharm增加中文编码支持

以linux系统为例

1、安装中文字体

由于docker与操作系统隔离,一般docker不能直接使用系统字体文件,所以首先要在docker内部安装好中文字体。

(1)查看docker是否自带中文字体

进入docker终端后台,用fc-list命令检查是否已安装中文字体,如有,直接进入pycharm设置。

(2)在linux系统建立一个字体夹,将需要的中文字体拷入其中。

(3)将该文件夹剪切到docker容器映射的文件夹中。

(4)进入docker容器后台,ls刚才拷入的文件夹所在目录,确保能正确显示。

将该字体文件夹移动到docker系统默认的字体文件夹中,默认的字体文件夹的路径一般为 /sur/share/fonts/

(5)更新字体缓存

输入命令 fc-cache 然后退出后台。

(6)重启容器

2、设置编辑器支持中文

将show only monospaced fonts旁边的选择去掉,Fallback font选择中文字体。

3、设置文件编码支持中文

红线框内的三个地方都改成UTF-8编码支持。

全部设置工作完成。进入代码编辑区,应该就可以输入中文注释了。