Algunha vez tivo que experimentar con código ou utilidades do sistema en Linux para non preocuparse polo sistema base e non derrubar todo en caso de producirse un erro no código que debería executarse con privilexios de root?
Pero que pasa co feito de que digamos que necesitas probar ou executar todo un clúster de varios microservizos nunha máquina? Cen ou mesmo mil?
Con máquinas virtuais xestionadas por un hipervisor, este tipo de problemas pódense resolver e resolveranse, pero a que custo? Por exemplo, un contedor en LXD baseado na distribución Alpine Linux só consume 7.60MB
RAM e onde ocupa a partición raíz despois do inicio 9.5MB
! Como che parece isto, Elon Musk? Recomendo facer o check-out capacidades básicas de LXD - un sistema de contedores en Linux
Despois de que quedou claro en xeral cales son os contedores LXD, imos máis aló e pensemos, que pasaría se houbese unha plataforma de recolección na que puideses executar código para o servidor de forma segura, xerar gráficos, vincular dinámicamente (interactivamente) widgets da IU co teu código? completar o código con texto con blackjack... formato? Algún tipo de blog interactivo? Vaia... quero! Quere! 🙂
Mira debaixo do gato onde lanzaremos nun recipiente laboratorio jupyter - a próxima xeración de interface de usuario en lugar do anticuado Jupyter Notebook, e tamén instalaremos módulos de Python como numpy, pandas, matplotlib, IPyWidgets o que che permitirá facer todo o que se indica anteriormente e gardalo todo nun ficheiro especial: un portátil IPython.
Navegación
- Plan de engalaxe orbital
- Instalación e configuración do sistema básico
- Instalación de software básico e configuración do sistema
- Instalación e configuración de JupyterLab
- Compartir datos co host
- Ola, mundo!
- Ampliación das capacidades de Python
- Probando módulos en JupyterLab
- Que máis?
Plan de engalaxe orbital ^
Imos esbozar un breve plan de acción para facilitarnos a implementación do esquema anterior:
- Imos instalar e lanzar un contedor baseado no kit de distribución Linux Alpine. Utilizaremos esta distribución porque está dirixida ao minimalismo e instalaremos nela só o software máis necesario, nada superfluo.
- Engademos un disco virtual adicional no contedor e dámoslle un nome:
hostfs
e montámolo no sistema de ficheiros raíz. Este disco permitirá utilizar ficheiros no host desde un determinado directorio dentro do contedor. Así, os nosos datos serán independentes do contedor. Se se elimina o contedor, os datos permanecerán no servidor. Ademais, este esquema é útil para compartir os mesmos datos entre moitos contedores sen utilizar os mecanismos de rede estándar da distribución de contedores. - Imos instalar Bash, sudo, as bibliotecas necesarias, engadir e configurar un usuario do sistema
- Instalemos Python, módulos e compilemos dependencias binarias para eles
- Imos instalar e lanzar laboratorio jupyter, personalizar a aparencia, instalar extensións para el.
Neste artigo, comezaremos co lanzamento do contedor, non consideraremos instalar e configurar LXD, podes atopar todo isto noutro artigo: Características básicas dos sistemas de contedores LXD - Linux.
Instalación e configuración do sistema básico ^
Creamos un contedor co comando no que especificamos a imaxe - alpine3
, identificador do recipiente - jupyterlab
e, se é necesario, perfís de configuración:
lxc init alpine3 jupyterlab --profile=default --profile=hddroot
Aquí estou usando un perfil de configuración hddroot
que especifica crear un contedor cunha partición raíz Piscina de almacenamento situado nun disco duro físico:
lxc profile show hddroot
config: {}
description: ""
devices:
root:
path: /
pool: hddpool
type: disk
name: hddroot
used_by: []
lxc storage show hddpool
config:
size: 10GB
source: /dev/loop1
volatile.initial_source: /dev/loop1
description: ""
name: hddpool
driver: btrfs
used_by:
- /1.0/images/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
- /1.0/profiles/hddroot
status: Created
locations:
- none
Isto dáme a oportunidade de experimentar con contedores no disco HDD, gardando os recursos do disco SSD, que tamén está dispoñible no meu sistema 🙂 para o que creei un perfil de configuración separado ssdroot
.
Despois de crear o contedor, está no estado STOPPED
, polo que necesitamos inicialo executando o sistema init nel:
lxc start jupyterlab
Imos amosar unha lista de contedores en LXD usando a tecla -c
que indica cal cvisualización de columnas:
lxc list -c ns4b
+------------+---------+-------------------+--------------+
| NAME | STATE | IPV4 | STORAGE POOL |
+------------+---------+-------------------+--------------+
| jupyterlab | RUNNING | 10.0.5.198 (eth0) | hddpool |
+------------+---------+-------------------+--------------+
Ao crear o contedor, o enderezo IP escolleuse ao azar, xa que utilizamos un perfil de configuración default
que estaba previamente configurado no artigo Características básicas dos sistemas de contedores LXD - Linux.
Cambiaremos este enderezo IP por outro máis memorable creando unha interface de rede a nivel de contedores, e non a nivel de perfil de configuración como está agora na configuración actual. Non tes que facelo, podes omitilo.
Creación dunha interface de rede eth0
que ligamos ao switch (ponte de rede) lxdbr0
no que activamos NAT segundo o artigo anterior e agora o contedor terá acceso a Internet e tamén asignamos un enderezo IP estático á interface - 10.0.5.5
:
lxc config device add jupyterlab eth0 nic name=eth0 nictype=bridged parent=lxdbr0 ipv4.address=10.0.5.5
Despois de engadir un dispositivo, o contedor debe reiniciarse:
lxc restart jupyterlab
Comprobación do estado do recipiente:
lxc list -c ns4b
+------------+---------+------------------+--------------+
| NAME | STATE | IPV4 | STORAGE POOL |
+------------+---------+------------------+--------------+
| jupyterlab | RUNNING | 10.0.5.5 (eth0) | hddpool |
+------------+---------+------------------+--------------+
Instalación de software básico e configuración do sistema ^
Para administrar o noso contedor, cómpre instalar o seguinte software:
Paquete
descrición
bater
O shell de GNU Bourne Again
bash-completación
Finalización programable para o shell bash
sudo
Dálle a certos usuarios a posibilidade de executar algúns comandos como root
sombra
Paquete de ferramentas de xestión de contrasinais e contas con soporte para ficheiros shadow e PAM
tzdata
Fontes de datos do fuso horario e do horario de verán
nano
Pico editor clon con melloras
Ademais, pode instalar soporte nas páxinas man do sistema instalando os seguintes paquetes − man man-pages mdocml-apropos less
lxc exec jupyterlab -- apk add bash bash-completion sudo shadow tzdata nano
Vexamos os comandos e teclas que usamos:
lxc
— Chamar ao cliente LXDexec
- Método cliente LXD que executa un comando no contedorjupyterlab
- ID do recipiente--
- Unha chave especial que especifica non interpretar máis chaves como claves paralxc
e pasar o resto da corda tal e como está ao recipienteapk
— Xestor de paquetes de distribución de Alpine Linuxadd
— Un método de xestor de paquetes que instala os paquetes especificados despois do comando
A continuación, estableceremos unha zona horaria no sistema Europe/Moscow
:
lxc exec jupyterlab -- cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime
Despois de instalar o fuso horario, o paquete tzdata
xa non é necesario no sistema, ocupará espazo, así que imos borralo:
lxc exec jupyterlab -- apk del tzdata
Comprobando o fuso horario:
lxc exec jupyterlab -- date
Wed Apr 15 10:49:56 MSK 2020
Para non gastar moito tempo configurando Bash para novos usuarios no contedor, nos seguintes pasos copiaremos ficheiros skel preparados do sistema host a el. Isto permitirache adornar Bash nun contedor de forma interactiva. O meu sistema host é Manjaro Linux e os ficheiros que se están copiando /etc/skel/.bash_profile
, /etc/skel/.bashrc
, /etc/skel/.dir_colors
en principio son axeitados para Alpine Linux e non causan problemas críticos, pero pode que teña unha distribución diferente e teña que descubrir de forma independente se hai un erro ao executar Bash no contedor.
Copia os ficheiros skel no contedor. Chave --create-dirs
creará os directorios necesarios se non existen:
lxc file push /etc/skel/.bash_profile jupyterlab/etc/skel/.bash_profile --create-dirs
lxc file push /etc/skel/.bashrc jupyterlab/etc/skel/.bashrc
lxc file push /etc/skel/.dir_colors jupyterlab/etc/skel/.dir_colors
Para un usuario root xa existente, copie os ficheiros skel que se acaban de copiar no contedor no directorio de inicio:
lxc exec jupyterlab -- cp /etc/skel/.bash_profile /root/.bash_profile
lxc exec jupyterlab -- cp /etc/skel/.bashrc /root/.bashrc
lxc exec jupyterlab -- cp /etc/skel/.dir_colors /root/.dir_colors
Alpine Linux instala un shell do sistema para os usuarios /bin/sh
, substituirémolo por root
usuario en Bash:
lxc exec jupyterlab -- usermod --shell=/bin/bash root
Que root
o usuario non tiña contrasinal, necesita establecer un contrasinal. O seguinte comando xerará e establecerá un novo contrasinal aleatorio para el, que verá na pantalla da consola despois da súa execución:
lxc exec jupyterlab -- /bin/bash -c "PASSWD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12); echo "root:$PASSWD" | chpasswd && echo "New Password: $PASSWD""
New Password: sFiXEvBswuWA
Ademais, imos crear un novo usuario do sistema - jupyter
para o que configuraremos máis adiante laboratorio jupyter:
lxc exec jupyterlab -- useradd --create-home --shell=/bin/bash jupyter
Imos xerar e establecer un contrasinal para el:
lxc exec jupyterlab -- /bin/bash -c "PASSWD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12); echo "jupyter:$PASSWD" | chpasswd && echo "New Password: $PASSWD""
New Password: ZIcbzWrF8tki
A continuación, executaremos dous comandos, o primeiro creará un grupo de sistema sudo
, e o segundo engadiralle un usuario jupyter
:
lxc exec jupyterlab -- groupadd --system sudo
lxc exec jupyterlab -- groupmems --group sudo --add jupyter
Vexamos a que grupos pertence o usuario jupyter
:
lxc exec jupyterlab -- id -Gn jupyter
jupyter sudo
Todo está ben, sigamos.
Permitir a todos os usuarios que sexan membros do grupo sudo
usar comando sudo
. Para iso, execute o seguinte script, onde sed
descomenta a liña de parámetros no ficheiro de configuración /etc/sudoers
:
lxc exec jupyterlab -- /bin/bash -c "sed --in-place -e '/^#[ t]*%sudo[ t]*ALL=(ALL)[ t]*ALL$/ s/^[# ]*//' /etc/sudoers"
Instalación e configuración de JupyterLab ^
laboratorio jupyter é unha aplicación de Python, polo que primeiro debemos instalar este intérprete. Ademais, laboratorio jupyter instalaremos usando o xestor de paquetes Python pip
, e non o do sistema, porque pode estar desactualizado no repositorio do sistema e, polo tanto, temos que resolver manualmente as dependencias instalando os seguintes paquetes: python3 python3-dev gcc libc-dev zeromq-dev
:
lxc exec jupyterlab -- apk add python3 python3-dev gcc libc-dev zeromq-dev
Imos actualizar os módulos de Python e o xestor de paquetes pip
á versión actual:
lxc exec jupyterlab -- python3 -m pip install --upgrade pip setuptools wheel
Conxunto laboratorio jupyter a través do xestor de paquetes pip
:
lxc exec jupyterlab -- python3 -m pip install jupyterlab
Desde as extensións en laboratorio jupyter son experimentais e non se envían oficialmente co paquete jupyterlab, polo que temos que instalalo e configuralo manualmente.
Imos instalar NodeJS e o xestor de paquetes para iso - NPM, xa que laboratorio jupyter utilízaos para as súas extensións:
lxc exec jupyterlab -- apk add nodejs npm
Ás extensións para laboratorio jupyter que instalaremos funcionaron, deben estar instaladas no directorio de usuarios xa que a aplicación lanzarase dende o usuario jupyter
. O problema é que non hai ningún parámetro no comando de lanzamento que se poida pasar a un directorio, a aplicación só acepta unha variable de ambiente e por iso debemos definila. Para iso, escribiremos o comando de exportación variable JUPYTERLAB_DIR
no contorno do usuario jupyter
, para arquivar .bashrc
que se executa cada vez que o usuario inicia sesión:
lxc exec jupyterlab -- su -l jupyter -c "echo -e "nexport JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab" >> .bashrc"
O seguinte comando instalará unha extensión especial: o xestor de extensións laboratorio jupyter:
lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter labextension install --no-build @jupyter-widgets/jupyterlab-manager"
Agora todo está listo para o primeiro lanzamento laboratorio jupyter, pero aínda podemos instalar algunhas extensións útiles:
toc
— Índice, xera unha lista de títulos nun artigo/cadernojupyterlab-horizon-theme
- Tema da IUjupyterlab_neon_theme
- Tema da IUjupyterlab-ubu-theme
- Outro tema do autor este artigo :) Pero neste caso, amosarase a instalación desde o repositorio de GitHub
Entón, execute os seguintes comandos secuencialmente para instalar estas extensións:
lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter labextension install --no-build @jupyterlab/toc @mohirio/jupyterlab-horizon-theme @yeebc/jupyterlab_neon_theme"
lxc exec jupyterlab -- su -l jupyter -c "wget -c https://github.com/microcoder/jupyterlab-ubu-theme/archive/master.zip"
lxc exec jupyterlab -- su -l jupyter -c "unzip -q master.zip && rm master.zip"
lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter labextension install --no-build jupyterlab-ubu-theme-master"
lxc exec jupyterlab -- su -l jupyter -c "rm -r jupyterlab-ubu-theme-master"
Despois de instalar as extensións, debemos compilalas, xa que previamente, durante a instalación, especificamos a clave --no-build
para aforrar tempo. Agora aceleraremos significativamente recompilándoos dunha soa vez:
lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter lab build"
Agora executa os dous comandos seguintes para executalo por primeira vez laboratorio jupyter. Sería posible lanzalo cun só comando, pero neste caso, o comando de inicio, que é difícil de lembrar na túa mente, lembrarase mediante bash no contedor e non no host, onde xa hai suficientes comandos. para gravalos na historia :)
Inicie sesión no contedor como usuario jupyter
:
lxc exec jupyterlab -- su -l jupyter
A continuación, corre laboratorio jupyter coas teclas e parámetros indicados:
[jupyter@jupyterlab ~]$ jupyter lab --ip=0.0.0.0 --no-browser
Vaia ao enderezo no seu navegador web http://10.0.5.5:8888 e na páxina que se abre entra símbolo acceso que verás na consola. Copia e pégao na páxina e fai clic Iniciar sesión. Despois de iniciar sesión, vai ao menú de extensións da esquerda, como se mostra na figura seguinte, onde se lle solicitará, ao activar o xestor de extensións, que asuma os riscos de seguridade instalando extensións de terceiros para as que o comando Desenvolvemento de JupyterLab non é responsable:
Non obstante, illamos a totalidade laboratorio jupyter e colócao nun contedor para que as extensións de terceiros que requiran e utilicen NodeJS non poidan, polo menos, roubar datos do disco que non sexan os que abrimos dentro do contedor. Accede aos teus documentos privados no host en /home
É improbable que os procesos do contenedor teñan éxito e, se o fan, terás que ter privilexios nos ficheiros do sistema host, xa que executamos o contedor en modo sen privilexios. En función desta información, podes avaliar o risco de incluír extensións laboratorio jupyter.
Creáronse cadernos IPython (páxinas en laboratorio jupyter) agora crearase no directorio de inicio do usuario - /home/jupyter
, pero os nosos plans son dividir os datos (compartir) entre o host e o contedor, así que volve á consola e detén laboratorio jupyter executando a tecla de acceso rápido - CTRL+C
e respondendo y
baixo pedido. A continuación, finaliza a sesión interactiva do usuario jupyter
completando unha tecla de acceso rápido CTRL+D
.
Compartir datos co host ^
Para compartir datos co host, cómpre crear un dispositivo no contedor que che permita facelo e para iso, executa o seguinte comando onde especificamos as seguintes claves:
lxc config device add
— O comando engade a configuración do dispositivojupyter
— ID do contedor ao que se engade a configuraciónhostfs
- ID do dispositivo. Podes establecer calquera nome.disk
— Indícase o tipo de dispositivopath
— Especifica a ruta do contedor no que LXD montará este dispositivosource
— Especifique a orixe, o camiño ao directorio do host que quere compartir co contedor. Especifique o camiño segundo as súas preferencias
lxc config device add jupyterlab hostfs disk path=/mnt/hostfs source=/home/dv/projects/ipython-notebooks
Para o catálogo /home/dv/projects/ipython-notebooks
o permiso debe establecerse para o usuario do contedor que actualmente ten un UID igual a SubUID + UID
, ver capítulo Seguridade. Privilexios de contedores no artigo Características básicas dos sistemas de contedores LXD - Linux.
Establece o permiso no host, onde o propietario será o usuario do contedor jupyter
, e a variable $USER
especificará o seu usuario anfitrión como grupo:
sudo chown 1001000:$USER /home/dv/projects/ipython-notebooks
Ola, mundo! ^
Se aínda tes unha sesión de consola aberta no contedor con laboratorio jupyter, despois reinicia cunha nova chave --notebook-dir
establecendo o valor /mnt/hostfs
como o camiño ata a raíz dos portátiles no contedor do dispositivo que creamos no paso anterior:
jupyter lab --ip=0.0.0.0 --no-browser --notebook-dir=/mnt/hostfs
Despois vai á páxina http://10.0.5.5:8888 e crea o teu primeiro portátil facendo clic no botón da páxina como se mostra na imaxe de abaixo:
Despois, no campo da páxina, introduza o código Python que mostrará o clásico Hello World!
. Cando remate de ingresar, prema CTRL+ENTER
ou o botón "reproducir" na barra de ferramentas da parte superior para que JupyterLab faga isto:
Neste punto, case todo está listo para o seu uso, pero non será interesante se non instalamos módulos adicionais de Python (aplicacións completas) que poidan ampliar significativamente as capacidades estándar de Python en laboratorio jupyterpolo tanto, sigamos :)
PD O interesante é que a antiga implementación Xúpiter baixo o nome de código Caderno Jupyter non desapareceu e existe paralelamente laboratorio jupyter. Para cambiar á versión antiga, siga a ligazón engadindo o sufixo no enderezo/tree
, e a transición á nova versión realízase co sufixo /lab
, pero non hai que especificalo:
- Caderno Jupyter - http://10.0.5.5:8888/tree
- Laboratorio Jupyter - http://10.0.5.5:8888/lab
Ampliación das capacidades de Python ^
Nesta sección, instalaremos módulos de linguaxe Python tan poderosos como numpy, pandas, matplotlib, IPyWidgets cuxos resultados están integrados en portátiles laboratorio jupyter.
Antes de instalar os módulos de Python listados a través do xestor de paquetes pip
primeiro debemos resolver as dependencias do sistema en Alpine Linux:
g++
— Necesario para compilar módulos, xa que algúns deles están implementados na linguaxe C ++ e conéctese a Python en tempo de execución como módulos binariosfreetype-dev
- dependencia para o módulo Python matplotlib
Instalación de dependencias:
lxc exec jupyterlab -- apk add g++ freetype-dev
Hai un problema: no estado actual da distribución Alpine Linux, non será posible compilar a nova versión de NumPy; aparecerá un erro de compilación que non puiden resolver:
ERROR: Non se puideron construír rodas para numpy que usan PEP 517 e non se poden instalar directamente
Polo tanto, instalaremos este módulo como un paquete do sistema que distribúe unha versión xa compilada, pero un pouco máis antiga que a que está dispoñible actualmente no sitio:
lxc exec jupyterlab -- apk add py3-numpy py3-numpy-dev
A continuación, instale os módulos de Python a través do xestor de paquetes pip
. Ten paciencia xa que algúns módulos compilaranse e poden tardar uns minutos. Na miña máquina, a compilación levou ~15 minutos:
lxc exec jupyterlab -- python3 -m pip install pandas ipywidgets matplotlib
Borrar cachés de instalación:
lxc exec jupyterlab -- rm -rf /home/*/.cache/pip/*
lxc exec jupyterlab -- rm -rf /root/.cache/pip/*
Probando módulos en JupyterLab ^
Se estás correndo laboratorio jupyter, reinicialo para que se activen os módulos recén instalados. Para iso, nunha sesión de consola, fai clic CTRL+C
onde o teñas funcionando e entra y
para deter a solicitude e comezar de novo laboratorio jupyter premendo a frecha cara arriba do teclado para non volver a introducir o comando e despois Enter
para comezalo:
jupyter lab --ip=0.0.0.0 --no-browser --notebook-dir=/mnt/hostfs
Vaia á páxina http://10.0.5.5:8888/lab ou actualice a páxina no seu navegador e, a continuación, introduza o seguinte código nunha nova cela do caderno:
%matplotlib inline
from ipywidgets import interactive
import matplotlib.pyplot as plt
import numpy as np
def f(m, b):
plt.figure(2)
x = np.linspace(-10, 10, num=1000)
plt.plot(x, m * x + b)
plt.ylim(-5, 5)
plt.show()
interactive_plot = interactive(f, m=(-2.0, 2.0), b=(-3, 3, 0.5))
output = interactive_plot.children[-1]
output.layout.height = '350px'
interactive_plot
Debería obter un resultado como na imaxe de abaixo, onde IPyWidgets xera un elemento de IU na páxina que interactúa de forma interactiva co código fonte, e tamén matplotlib mostra o resultado do código en forma de imaxe como un gráfico de funcións:
Moitos exemplos IPyWidgets podes atopalo nos tutoriais aquí
Que máis? ^
Ben feito se quedaste e chegaches ao final do artigo. Non publiquei deliberadamente un script preparado ao final do artigo que se instalaría laboratorio jupyter en "un clic" para animar aos traballadores :) Pero podes facelo ti mesmo, xa que xa sabes como, despois de reunir os comandos nun único script Bash :)
Tamén podes:
- Establece un nome de rede para o contedor en lugar dun enderezo IP escribindoo nun sinxelo
/etc/hosts
e escriba o enderezo no navegador http://jupyter.local:8888 - Xoga co límite de recursos para o contedor, para iso le o capítulo en capacidades básicas de LXD ou obtén máis información no sitio para desenvolvedores de LXD.
- Cambia o tema:
E moito máis podes facer! Iso é todo. Deséxoche éxito!
ACTUALIZACIÓN: 15.04.2020/18/30 XNUMX:XNUMX - Corrixiron erros no capítulo "Ola, mundo!"
ACTUALIZACIÓN: 16.04.2020/10/00 XNUMX:XNUMX — Texto corrixido e engadido na descrición da activación do xestor de extensións laboratorio jupyter
ACTUALIZACIÓN: 16.04.2020/10/40 XNUMX:XNUMX — Corrixíronse os erros atopados no texto e cambiou lixeiramente para mellor o capítulo "Instalación de software básico e configuración do sistema"
Fonte: www.habr.com