[PYTHON] Wie man ein praktisches Seminar mit Jupyter mit Docker abhält

Was Sie tun möchten

―― Angenommen, Sie möchten ein praktisches Seminar mit Jupyter usw. abhalten.

  • Die Ausführungsumgebung wird vom Docker vorbereitet.
  • Starten und verwenden Sie wie Tmpnb dynamisch Docker-Container für jeden Schüler.

Realisierungsbild

arch.png

--Starten Sie einen Webserver mit der Python-Flasche.

  • Wenn ein Seminarteilnehmer darauf zugreift, startet er automatisch einen Container aus dem Seminarbild und leitet seine Adresse um.
  • In der folgenden Erklärung wird dies von Docker (1.10.2) unter Ubuntu (15.10) bestätigt.

Auf dem Webserver werden sowohl die Python-Flasche als auch der Docker ausgeführt. Dies wird von Docker bereitgestellt, Docker wird jedoch auf dem Host ausgeführt. Verwenden wir also die Hostumgebung. Python kopiert auch Exe und DLL von verschiedenen Bildern auf das Volume und verwendet es.

Step 1. Making volume for python Tsutomu7 / py3flask (Dokcerfile mit Python- und Flask-Ausführungsumgebung Kopieren Sie die Datei aus / blob / master / Dockerfile)), um ein Volume mit dem Namen python zu erstellen. Entsorgen Sie den Behälter nach dem Kopieren.

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 / seminar (Dockerfile) Verwenden Sie diese Option, um den Webserver zu starten.

  • ** Geben Sie das Docker-Image an, das der Schüler mit der Umgebungsvariablen IMAGE ** starten soll.
  • Geben Sie die vom Image verwendete Portnummer in der Umgebungsvariablen PORT an.
  • Wenn Sie nicht "/ lib / x86_64-linux-gnu" wie CoreOS haben, nehmen Sie bitte an diesem Teil teil.

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 Greifen Sie mit einem Browser von einem mit dem Netzwerk verbundenen PC auf "Hostadresse des Webservers: 5000" zu. Es wird automatisch ein neuer Docker-Container gestartet und seine Adresse umgeleitet. Der Zugriff von demselben PC wird von einem Container unterstützt.

Eine Beschreibung des Serverprogramms.

Dieses Server-Image ist nur 5 MB groß, da sowohl Python als auch Docker ausgeliehen sind. Das darin enthaltene Programm (seminar.py) wird erläutert.

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)
  • Verwenden Sie denselben Container für den Zugriff von demselben PC aus. Die Korrespondenz (Zugriffsquellenadresse → Containeradresse) wird in einem Wörterbuch namens dct gespeichert. --Geben Sie die Zugangsquelladresse in addr ein.
  • Wenn addr der erste Zugriff ist, führt es Folgendes aus:
  • Rufen Sie den Bildnamen für den Schüler in img aus der Umgebungsvariablen IMAGE ab.
  • In prt erhalten Sie die im Image verwendete Portnummer aus der Umgebungsvariablen PORT. --Berechnen Sie die auf der Serverseite verwendete Portnummer für den Schülercontainer in cid. (Seriennummer von 8001) --Starten Sie den Schülercontainer.
  • Geben Sie in srvr die Serveradresse ein, löschen Sie die ursprüngliche Portnummer (5000), fügen Sie die Portnummer des neuen Containers hinzu und setzen Sie sie auf dct [addr].
  • Weiterleiten an dct [addr].

das ist alles

Recommended Posts