見出し画像

StreamlitアプリをDockerでAWSにデプロイする

DockerでWebアプリを構築する練習メモ(私的備忘録として)
ローカル環境 Windows10 home

2022年GWを利用して集中して行った。
Dockerの内容は、かめさんのUdemy講座を参考にしてます。

とても分かりやすい講座で、ありがたいです。

Windowsで、Linux仮想環境とDockerを使えるようにする。
 
こちらを参照。

ローカル(WindowsPC)でStreamlitを動かす
DockerFileの記述内容

FROM python:3.7.13
RUN pip install streamlit
ENTRYPOINT ["streamlit"]
CMD ["hello"]
EXPOSE 8501

※ ENTRYPOINTはdocker runの時に上書きできないコマンド
※ ENTRYPOINTがある場合は、CMDはコマンドの引数を指定する

docker buildしてrun
> Powershellで実行

>docker build .
>docker run -it -d -p 8888:8501 imageID
※ -d runしたらdetuchする(動いたままにする)
※ -p HostのポートとCoitainerのポートをつなげる

ブラウザで、localhost:8888 にアクセスしたら、Streamlitのデモが動いた!

次に、簡単なpythonプログラミングをstreamlitで動かしみる。

プログラムファイル write_hello.py

import streamlit as st
st.write('Hell World !')

をdocker fileのあるフォルダに保存して、docker imageにCopyする。

DockerFile内容

FROM python:3.7.13
RUN pip install streamlit
RUN mkdir /code # コンテナにディレクトリを作る
COPY write_hello.py /code/ # プログラムをdocker imageにコピーする
CMD ["bin/bash"]
EXPOSE 8501

buildしてrunする。
>docker build .
>docker run -it -p 8889:8501 imageID bash

Ubuntuが立ち上がり、codeフォルダにwrite_hello.pyがコピーされていることを確認。
# コンテナubuntuで実行
# ls code/

stremalitを動かしてみる。
# streamlit run code/write_hello.py

おー、http://localhost:8889/に streamlitでHello World! が表示された!

DockerFileを編集して、Docker runしたら、このプログラムが立ち上がるようにしてみよう。
DockerFileの内容

FROM python:3.7.13
RUN pip install streamlit
RUN mkdir /code
COPY write_hello.py /code/
ENTRYPOINT ["streamlit"]  # コマンド
CMD ["run", "code/write_hello.py"] # 引数が2つ
EXPOSE 8501

>docker build .
>docker run -it -d -p 8889:8501 imageID

おー、http://localhost:8889/に streamlitでHello World! が表示された!

このコンテナをAWSで動かしてみる。
AWSへの登録する
詳細は省略。
AWSでインスタンスを作成し、アクセスするkeyを作成して、ダウンロードしておく。
keyファイル xxxxx.pem

作成したインスタンスにログインする
SSHでアクセスする。
>Powershellで実行
> ssh -i xxxxx.pem ubuntu@パブリック IPv4 アドレス
 パブリック IPv4 アドレス:AWSのインスタンス管理ページからコピペ)
 xxxxx.pemはkeyファイル。
 適当なディレクトリに保存して、sshの引数(path+ファイル名)で指定する。
AWSにログインできたら、ちょっと確認してみる。
$ ls
$ pwd
ubuntuが動いているのを確認する。

awsにdockerをインストールする
$ sudo apt-get update
$ sudo apt-get install docker.io
dockerのバージョン確認、兼、インストール完了確認。
$ dokcer --version

dockerコマンドをsudoなしでubuntuユーザでできるようにdockerグループを作る
dockerは、rootでないと動かせない(デフォルト)。
$ sudo gpasswd -a ubuntu docker      ※有効にするには、この後、再ログインが必要
$ docker images        で、sudoなしで動くのを確認

Dockerfileを送って、buidする
※GithubでDockerfileを管理するのが一般的。

AWSにsftpでログインする。
> sftp -i xxxxx.pem ubuntu@パブリック IPv4 アドレス

ローカルhostにあるDockerfileとpythonコードをAWSに送る。
sftp> put C:\...省略...\Dockerfile streamlit_build
sftp> put C:\...省略...\write_hello.py streamlit_build 
 streamlit_buidはAWS側に事前に作成しておいたビルドコンテキスト用の
 ディレクトリ
sftp> exit

sshでログイン
> ssh-i xxxxx.pem ubuntu@パブリック IPv4 アドレス
$ cd streamlit_build 
$ ls        Dockerfileとpythonプログラムが転送されてるのを確認
buildする
$ docker build .

docker run する
$ docker run  -p 8501:8501 imageID

ブラウザでアクセスする。
パブリック IPv4 アドレス:8501   つ、つ、繋がらない...。
タイムアウトのようだ。
AWSインスタンスのセキュリティの設定が悪いのかもしれない。
セキュリティのインバウンドルールを確認すると、タイプが「SSH」になっていた。
これを、「すべてのトラフィック」に変更して、再チャレンジ。
ブラウザで、パブリック IPv4 アドレス:8501 にアクセスしたら、
streamlitが立ち上がって、Hello World !    と表示された。

Yes! Yes! Yes! Yes!!!


次は、CICDでパイプラインでデプロイするのを試したい。


この記事が気に入ったらサポートをしてみませんか?