ローリングコンバットピッチなう!

AIとか仮想化とかペーパークラフトとか

Dockerでflask環境のコンテナイメージを作る

そろそろmicrok8sでも動かしてみようか

家の実験用Ubuntu18.04 LTSのVMにログインする度に以下のメッセージが出てくるので、microk8sが気になっていました。

 * Pure upstream Kubernetes 1.21, smallest, simplest cluster ops!

     https://microk8s.io/

dockerはOSSの公式イメージを引っ張ってインストールの手間省くために使い、kubernetesは興味はあるものの他にもやることあって放置していたのですが、microk8s、うちの貧弱環境で割と動きそうな感じなので試したいモチベーションが湧いてきました。

で、それは良いのですがmicrok8sインストールしても動かすものが無いなと。
ネットをググるとnginxでhello worldとか表示させるコンテナを動かしているのですが、自分が実験用にHTTPサーバーやAPIサーバー作る時はpython3*+flaskなので、とりあえずflaskが使えるなるべくクリーンなdockerイメージを準備しておこうと思い立ちました。

まずは手動で作ってみる

Ubuntuのバージョンでは18.04で行きます。21.04とかも出ていますが、18.04が使い慣れているのでそれで行きます。
Docker Hubから18.04の公式イメージを引っ張ります。

$ docker pull ubuntu:18.04

コンテナ内の実行プログラムとしてbashを指定して引っ張った18.04のdockerイメージを起動します。

$ docker run -it ubuntu:18.04 /bin/bash

あとはコンテナ内で下記の順序で必要なパッケージをインストールします。

# apt -y update
# apt -y upgrade
# apt -y install python3
# apt -y install python3-pip
# pip3 install flask

CTRL-p,CTRL-qでコンテナを起動したまま抜けます。
抜けたらdocker psで起動中のコンテナIDを確認の上で、docker commitで新しいdockerイメージにUbuntu 18.04 + python3 + flask環境を保存します。(なお、上記の手順ではpythonは3.6がインストールされます。)

docker commit <コンテナID> myubuntu:python3-flask

「myubuntu:python3_flask」の部分は「リポジトリ名:タグ」なので好きに決めます。
docker imagesで保存されたイメージを確認する。

$ docker images
REPOSITORY   TAG             IMAGE ID       CREATED       SIZE
myubuntu     python3-flask   767e79b43ccb   7 days ago    486MB
ubuntu       18.04           4eb8f7c43909   3 weeks ago   63.1MB

作ったコンテナイメージを動かしてみる。

$ docker run -it myubuntu:python3-flask python3
Python 3.6.9 (default, Jan 26 2021, 15:33:00) 
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from flask import Flask
>>> 

自動でやる

基本的には手動でやった手順をDockerfileに書くだけです。
適当にワークディレクトリを作り、そこにcdしたら、vi Dockerfileでファイルを作ります。

FROM ubuntu:18.04

RUN apt -y update
RUN apt -y upgrade
RUN apt -y install python3
RUN apt -y install python3-pip
RUN pip3 install flask

後はdockerコマンドでイメージをビルドします。

$ docker build -t myubuntu:python3-flask .

【2021/05/30追記】python3 + flaskのコンテナに自作アプリを入れたコンテナイメージを作る

python3 + flaskのdockerイメージが出来たのでこれに簡単な自作アプリを加えたコンテナイメージを作ります。

適当なディレクトリを掘って、hello.pyというファイルを作ります。
hello.pyはこんな感じのflask版hello worldです。起動して設定したポート(下記の例では5000)にhttpアクセスとすると"Hello World!!"という文字列が返却されます。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from flask import Flask

PORT=5000

app = Flask(__name__)

@app.route('/')
def hello():
    name = 'Hello World!!'
    return name

if __name__ == '__main__':
    app.run(host='0.0.0.0',port=PORT)

更に同じディレクトリにDockerfileを作ります。

Dockerfile

FROM myubuntu:python3-flask
EXPOSE 5000

ENV APPDIR /flaskapp
RUN mkdir -p ${APPDIR}
COPY ./hello.py ${APPDIR}/hello.py
RUN chmod +x ${APPDIR}/hello.py
WORKDIR ${APPDIR}

ENTRYPOINT ["./hello.py" ]

内容としてはローカルに事前に作成したpython3 + flask環境のコンテナをベースにしてコンテナ内に/flaskappというディレクトリを作成し、hello.pyをコピーして実行権限を付与します。
ENTRYPOINTでコンテナ起動時にhello.pyが自動的に立ち上がる様に指定します。

Dockerfileとhello.pyを同じディレクトリに置いて、

$ docker build -t myubuntu:flask-hello .

docker imagesでイメージが作成された事を確認します。

$ docker images
REPOSITORY   TAG             IMAGE ID       CREATED       SIZE
myubuntu     flask-hello     275e4319eedc   3 weeks ago   486MB
myubuntu     python3-flask   767e79b43ccb   3 weeks ago   486MB
ubuntu       18.04           4eb8f7c43909   5 weeks ago   63.1MB

コンテナを実行してみます。

$ docker run -p 5000:5000 -itd myubuntu:flask-hello
b8d30b706d81262e263a9fe50dcbc950b5aec9a9dc93397d0c018d92cc509ee1
$ docker ps
CONTAINER ID   IMAGE                  COMMAND        CREATED         STATUS         PORTS                                       NAMES
b8d30b706d81   myubuntu:flask-hello   "./hello.py"   9 seconds ago   Up 4 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   pensive_mcclintock
$ curl http://localhost:5000
Hello World!!

docker runでコンテナ起動後、docker psで起動確認、curlを使って実際にコンテナにアクセスして動作確認しています。
docker runの-p 5000:5000はコンテナのポート5000をlocalhostのポート5000にマップするというおまじないです。

次回はmicrok8sで作ったコンテナを制御してみます。

次回:
rc30-popo.hatenablog.com