[PYTHON] Comment organiser un séminaire pratique à l'aide de Jupyter à l'aide de Docker

Ce que vous voulez faire

――Supposons que vous souhaitiez organiser un séminaire pratique utilisant Jupyter, etc.

  • L'environnement d'exécution sera préparé par docker.
  • Comme Tmpnb, lancez et utilisez dynamiquement des conteneurs Docker pour chaque étudiant.

Image de réalisation

arch.png

  • Démarrez un serveur Web en utilisant le flacon de python.
  • Lorsqu'un participant à un séminaire y accède, il lance automatiquement un conteneur à partir de l'image du séminaire et redirige son adresse. --Dans l'explication ci-dessous, il est confirmé par docker (1.10.2) sur Ubuntu (15.10).

Le serveur Web exécute à la fois le flask et le docker de python. Ceci est fourni par docker, mais de toute façon, docker s'exécute sur l'hôte, alors utilisons l'environnement hôte. python copiera également exe et dll de différentes images vers le volume et l'utilisera.

Step 1. Making volume for python Tsutomu7 / py3flask (Dokcerfile avec environnement d'exécution python et flask Copiez le fichier depuis / blob / master / Dockerfile)) pour créer un volume nommé python. Après avoir copié le conteneur, jetez-le.

bash


docker volume rm python
docker run -it --rm -v python:/usr/local tsutomu7/py3flask sh -c "\
    cp /usr/bin/python3.5 /usr/local/bin/python && \
    cp /lib/ld-musl-x86_64.so.1 /usr/local/lib && \
    ln -s /usr/local/lib/ld-musl-x86_64.so.1 /usr/local/lib/libc.musl-x86_64.so.1 && \
    cp /usr/lib/libpython3.5m.so.1.0 /usr/local/lib/ && \
    cp -r /usr/lib/python3.5/ /usr/local/lib/"

Step 2. Start server tsutomu7 / séminaire (Dockerfile) Utilisez pour démarrer le serveur Web.

  • ** Spécifiez l'image du menu fixe que vous souhaitez que l'élève lance avec la variable d'environnement IMAGE **. --Spécifiez le numéro de port utilisé par l'image dans la variable d'environnement PORT.
  • Si vous n'avez pas "/ lib / x86_64-linux-gnu" comme CoreOS, veuillez prendre cette partie.

bash


docker run -it --rm \
   -v /lib/x86_64-linux-gnu/:/lib/x86_64-linux-gnu/:ro \
   -v /lib64:/lib64:ro \
   -v /usr/bin:/usr/bin:ro \
   -v /usr/lib:/usr/lib:ro \
   -v /var/run/docker.sock:/var/run/docker.sock:ro \
   -v python:/usr/local \
   -p 5000:5000 \
   -e IMAGE=tsutomu7/jupyter \
   -e PORT=8888 \
   tsutomu7/seminar

Step 3. Access Accédez à «Adresse d'hôte du serveur Web: 5000» avec un navigateur à partir d'un PC connecté au réseau. Il lancera automatiquement un nouveau conteneur docker et redirigera son adresse. L'accès à partir du même PC est pris en charge par un conteneur.

Une description du programme serveur.

Cette image de serveur ne fait que 5 Mo car python et docker sont empruntés. Le programme à l'intérieur (séminaire.py) est expliqué.

seminar.py


import os
from flask import Flask, request, redirect
from subprocess import run
app = Flask(__name__)
dct = {}

@app.route('/')
def hello_world():
    addr = request.environ['REMOTE_ADDR']
    if addr not in dct:
        img = os.environ.get('IMAGE', 'tsutomu7/jupyter')
        prt = os.environ.get('PORT', '8888')
        cid = 8001 + len(dct)
        run(['docker', 'run', '-d', '--name', str(cid), '-p', '%d:%s' % (cid, prt), img])
        srvr = request.environ['HTTP_HOST']
        if ':' in srvr:
            srvr = srvr[:srvr.index(':')]
        dct[addr] = 'http://%s:%d' % (srvr, cid)
    return redirect(dct[addr], 302)

if __name__ == '__main__':
    app.run('0.0.0.0', 5000)
  • Utilisez le même conteneur pour accéder à partir du même PC. La correspondance (adresse source d'accès → adresse conteneur) est stockée dans un dictionnaire appelé dct.
  • Entrez l'adresse de la source d'accès dans adr. --Lorsque addr est le premier accès, il effectue les opérations suivantes:
  • Obtenez le nom de l'image de l'élève dans img à partir de la variable d'environnement IMAGE. --Dans prt, récupérez le numéro de port utilisé dans l'image à partir de la variable d'environnement PORT. --Calculez le numéro de port utilisé côté serveur pour le conteneur étudiant dans cid. (Numéro de série à partir de 8001)
  • Démarrez le conteneur étudiant. --Dans srvr, entrez l'adresse du serveur, supprimez le numéro de port d'origine (5000), ajoutez le numéro de port du nouveau conteneur et définissez-le sur dct [addr]. --Redirect vers dct [addr].

c'est tout

Recommended Posts