――Supposons que vous souhaitiez organiser un séminaire pratique utilisant Jupyter, etc.
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.
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.
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)
c'est tout
Recommended Posts