Dockerfileを作成
ローカルの適当なディレクトリに Dockerfile を作る。
Dockerfile
# ベースとなるイメージの指定
# 自動的に docker hub からダウンロード出来る
FROM python:2.7-slim
# コンテナのワークディレクトリの指定
WORKDIR /app
# ローカルのカレントディレクトリの中身を全て コンテナのワークディレクトリにコピーする
# コンテナ実行時ではなく、イメージ作成時にコピーされる
ADD . /app
# python スクリプトでモジュールをインストールするための処理
RUN pip install -r requirements.txt
EXPOSE 80
# 環境変数の指定
# Docker コンテナで export NAME=World した状態になる
ENV NAME World
# コンテナ実行時に走らせるコマンドの指定
# この例では $ python app.py というコマンドが走る
CMD ["python", "app.py"]
スクリプト作成
同じディレクトリにpythonスクリプトを作る。
app.py
from flask import Flask
from redis import Redis, RedisError
import os
import socket
# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)
app = Flask(__name__)
@app.route("/")
def hello():
try:
visits = redis.incr('counter')
except RedisError:
visits = "<i>cannot connect to Redis, counter disabled</i>"
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>" \
"<b>Visits:</b> {visits}"
return html.format(name=os.getenv('NAME', "world"), hostname=socket.gethostname(), visits=visits)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
requirements.txt
Flask
Redis
イメージの作成
Dockerfile を元に、名前付きでイメージを作る。
docker build -t python-server .
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python-server latest c3907742b08f 7 seconds ago 195 MB
コンテナの作成
ポートを指定してコンテナを走らせる。
この例では docker上の80番を、ローカルの4000番からアクセスできるようにする。
docker run -p 4000:80 python-server
ローカルからアクセス
http://localhost:4000/ が表示できたら成功だ。
(手元ではなぜかredisが動いていなかった…あとで調べる)
dockerサーバーに入る
コンテナ実行中であれば、dockerサーバーに直接入ることが出来る。
プロセスIDの確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c7b95a8a2a22 python-server "python app.py" About a minute ago Up About a minute 0.0.0.0:4000->80/tcp examole-server
exec
コンテナIDを指定して docker exec
する。
例:
docker exec -it c7b95a8a2a22 /bin/bash
ファイルの確認
dockerコンテナ上にファイルが展開されているのが分かる。
$ ls
Dockerfile app.py requirements.txt
環境変数の確認
Dockerfileに記述した環境変数が export されている。
$ echo $NAME
World
参考
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。