―― Angenommen, Sie möchten ein praktisches Seminar mit Jupyter usw. abhalten.
--Starten Sie einen Webserver mit der Python-Flasche.
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.
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.
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)
das ist alles
Recommended Posts