7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2017-05-16

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オープンチャットもご利用ください。

Twitter

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?