そろそろ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で作ったコンテナを制御してみます。