2023/02/24
Dockerを用いたStreamlitの環境構築
Streamlitの実行環境をDockerを使って作成した。MySQLとも接続し、phpmyadminにてデータベースの内容を確認できるようにしている。
Dockerのコード
docker-compose.yaml
version: '3'
networks:
python_network:
driver: bridge
ipam:
driver: default
config:
- subnet: 192.168.2.0/24
gateway: 192.168.2.1
services:
db:
image: mysql:8.0
# コンテナ名
container_name: "db"
# コンテナの作成に使用するDockerfileのパス
# ホスト側のポート:コンテナ側のポートを指定
expose:
- "3306"
ports:
- "3306:3306"
# 環境変数の指定
environment:
- "MYSQL_ROOT_PASSWORD=password"
- "MYSQL_DATABASE=streamlit_database"
- "MYSQL_USER=wander"
- "MYSQL_PASSWORD=password"
volumes:
- "../db:/var/lib/mysql"
networks:
python_network:
ipv4_address: 192.168.2.2
asdf:
hostname: wander-server
container_name: asdf
build:
dockerfile: "Dockerfile"
volumes:
- ../:/root/ws # app.pyがあるフォルダをマウントしています
expose:
- "8501"
ports:
- "8888:8501"
links:
- db
depends_on:
- db
working_dir: "/root/ws"
tty: true
restart: always
networks:
- python_network
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
- PMA_ARBITRARY=1
- PMA_HOST=db #mysqlサービス名を指定
- PMA_USER=wander
- PMA_PASSWORD=password
links:
- db
ports:
- 4040:80
volumes:
- ./phpmyadmin/sessions:/sessions
tty: true
restart: always
networks:
- python_network
Dockerfile
FROM python:3.10
RUN apt-get update && apt-get install -y --no-install-recommends \
apt-utils git curl vim unzip openssh-client wget \
build-essential cmake \
libopenblas-dev \
libglib2.0-0 \
libsm6 \
libxext6 \
libxrender-dev \
sudo
RUN sudo apt-get upgrade -y && sudo apt-get update
RUN pip install --upgrade pip
RUN pip install streamlit mysql-connector-python
build
buildするには、以下のコマンドでできる。
docker compose build
Streamlitのコード
下記のように書くことで、データベースにつなげることができる。ほぼ公式のチュートリアルと同じです。
app.py
import streamlit as st
import mysql.connector
import time
# mysqlとの接続
@st.cache_resource
def init_connection():
return mysql.connector.connect(**st.secrets["mysql"])
conn = init_connection()
@st.cache_data(ttl=600)
def run_query(query):
with conn.cursor() as cur:
cur.execute(query)
return cur.fetchall()
rows = run_query("SELECT * from pets;")
データベースとの接続情報が書かれたsecrets.tomlは下記のようである。hostのip addressはdocker-compose.yamlに書いてあるものに合わせてある。
[mysql]
host = "192.168.2.2"
port = 3306
database = "streamlit_database"
user = "wander"
password = "password"
実行
下記のコマンドでコンテナを作成する。
docker compose up -d # コンテナ作成
docker compose exec asdf bash # streamlitのコンテナに入る
# コンテナ内
cd /path/to/app.py
streamlit run app.py
localhost:4040にアクセスすると、phpmyadminのページに移動する。そこでpets tableを作成し、データを入れておくこと。
localhost:8888にアクセスすると、streamlitのページが開く。
参考文献
下記のサイトが非常に参考になった。