🖥

Docker 初心者 | python サーバーを起動してローカルからアクセスする | 公式チュートリアル part2 より

2023/08/26に公開

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/ が表示できたら成功だ。

image

(手元ではなぜか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オープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2017-05-16

Discussion