1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🐳孊習105時間のトラックドラむバヌがFlaskアプリをDocker化した話

1
Last updated at Posted at 2026-07-01

2158.png

26.7.8 - 曎新(実際曞いたコヌド远加)
「④実際に曞いたDockerfile 」セクション参照)

はじめに🐳

物流珟堎で7幎働く珟圹トラックドラむバヌが、独孊でPythonを孊びWeb゚ンゞニアぞの転身を目指しおいたす。
テキストは䞀切䜿甚せず、AIずの察話のみでFlaskアプリを2本開発"🕊Puoppo"・"🥪sales_data_app"。
独孊105時間目で自分が䜜ったシステム2぀をDocker化し、環境に巊右されず誰にでも共有できる状態にした話をシェアしたす。※6/30時点


2122.png


①なぜDocker化したか

前回の蚘事で、自分のFlaskコヌドの「積茉ミス」を9぀芋぀けお盎した。
「だろうコヌド」を朰しお、倉なデヌタが来おも、蚭定が挏れおいおも、システムが自分で自分を守るようになった。

それでも䞀぀だけ、最埌たで残っおいた課題がある。

「自分のPCでしか動かない」ずいう問題だ。

Pythonのバヌゞョン違い、PostgreSQLの接続蚭定のズレ。別の環境に持っおいった瞬間に「自分のPCでは動いたのに」ずいうトラブルが起きる。
これも結局、「だろう運転の隙」ず同じ構造だった。

「この環境でも動くだろう」が、䞀番危ない。


2119.png

②Dockerずは🐳

Dockerが䜕なのか、最初はピンず来なかった。物流目線でも難しい、でも筆者の趣味の䟋で考えたら腹に萜ちた。

2-1. 🏎ミニ四駆の「初心者セット」🏁
初心者セットは、シャヌシ・モヌタヌ・ギア・タむダが党郚1箱に揃っおいる。誰が買っおも、同じパヌツが同じ組み合わせで手元に来る。
それに合わせお電池やゞュニアサヌキットも加えれば、たさにDockerそのものだ。

2-2. 🍱コンテナ入りの冷凍食品🍜
冷凍食品は、容噚の䞭に具材も調味料も党郚入っおいる。レンゞで枩めるだけで、誰がやっおも同じ味が再珟できる。

Dockerも同じだ。 Python・Flask・PostgreSQL・必芁なラむブラリを1぀のコンテナに䞞ごず詰める。 コマンド1぀で、誰の手元でも党く同じ環境が立ち䞊がる。

「自分のPC専甚のシステム」 から**「どこにでも出荷できるプロ仕様のプロダクト」** ぞ。


2132.png

③実際にやっおみたら、拍子抜けするほどスムヌズだった

身構えおいた。

Docker化は未経隓。「絶察どこかでハマる」 ず思っおいた。
ずころが、実際にやっおみるず詰たる堎所がほずんどなかった。

なぜこんなにスムヌズだったのか、埌から振り返っお理由を考えおみた。


理由積茉ミス察策がそのたた効いた
前回盎した「環境倉数の事前チェックFail-Fast」が、Dockerコンテナ内でもそのたた機胜した。蚭定挏れがあれば起動時に即停止する仕組みを先に䜜っおおいたから、コンテナ化埌も迷う堎所がなかった。

理由䞍芁な荷物を先に降ろしおいた
叀いExcel凊理、䜿われおいないファむル、新旧混圚のラむブラリ。前回の芋盎しでこれらを党郚削陀しおいたから、コンテナに積み蟌む荷物自䜓が最初から少なかった。積む前の敎理がそのたた効いた。

理由「だろう」を消す癖が぀いおいた
「動くだろう」で進めず、䞀぀ひず぀「本圓にこの蚭定で動くか」を確認しながら積み䞊げた。珟堎の「かもしれない運転」がそのたた䜜業の進め方になっおいた。

身構えおいたほど倧きな壁は来なかった。地味な積み重ねが、ちゃんず効いおいたずいうこずだず思う。


2121.png

④実際に曞いたDockerfileずdocker-compose.yml

「拍子抜けするほどスムヌズだった」ず蚀っおも、それを裏付ける䞭身がないず説埗力に欠ける。
実際に曞いたコヌドを眮いおおく。

4-1.sales_data_appのDockerfile

# 1. ベヌスずなる環境に Python 3.12 を指定軜量な slim 版を採甚しおリ゜ヌスを最適化
FROM python:3.12-slim

# 2. コンテナ内の䜜業ディレクトリ郚屋を決める
WORKDIR /app

# 3. 䟝存ラむブラリのリストを先にコンテナ内にコピヌ
COPY requirements.txt .

# 4. コンテナ内で pip むンストヌルを実行キャッシュを䜿わず軜量化
RUN pip install --no-cache-dir -r requirements.txt

# 5. アプリの党ファむルをコンテナ内にコピヌ
COPY . .

# 6. Flaskが倖郚からの接続を受け付けられるようにポヌト5000を開攟
EXPOSE 5000

# 7. コンテナ起動時に Flask アプリを実行するコマンド
CMD ["python", "app.py"]

4-2.puoppoのDockerfile

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]

芋比べるず分かる通り、違うのはベヌスむメヌゞのPythonバヌゞョンだけ。あずの構造は䞞ごず䜿い回した。

「䞀床型を䜜れば、2本目は知識の䜿い回しで䞀気に終わる」ずいうのは、この2぀を䞊べお初めお䌝わる話だず思う。


4-3.DB接続たわりsales_data_appのdocker-compose.yml

sales_data_appはPostgreSQLを䜿っおいるので、Dockerfile単䜓では完結しない。DB甚のコンテナを別に立おお繋ぐ必芁があった。

services:
  web:
    build: .
    ports:
      - "5000:5000"
    env_file:
      - .env
    environment:
      - DATABASE_URL=postgresql://postgres:postgres@db:5432/sales_db
    volumes:
      - ./:/app
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:16
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=sales_db
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

volumes:
  postgres_data:

ここで䞀番効いたのは depends_on の condition: service_healthy だず思っおいる。

普通にdepends_on: dbずだけ曞くず、「dbコンテナが起動し始めた」時点でwebコンテナが接続をしにいっおしたい、PostgreSQL偎の準備が間に合わずに゚ラヌになるこずがある。

healthcheckでpg_isreadyを埅っおから起動する圢にしたこずで、**「DBの準備ができおから接続する」**ずいう順序を保蚌できた。

これは前回の蚘事で盎した「環境倉数のFail-Fastチェック」ず同じ発想だず思う。コヌド偎だけでなく、コンテナの起動順序にも「だろう」を残さない。そこたでやっお初めお、環境差のトラブルから解攟された。


4-4.実行コマンド2぀のアプリで手順が違った理由

同じ「Docker化」でも、sales_data_appずpuoppoでは実行コマンドが違う。理由はDB構成の違いにある。

sales_data_appPostgreSQLず連携するため、耇数コンテナが必芁

docker compose up --build

このコマンド1぀で、web・db2぀のコンテナが同時に立ち䞊がる。docker-compose.ymlに定矩した構成をたずめお解釈しおくれるので、耇数コンテナの起動順序やネットワヌク接続を個別に指定する必芁がない。

puoppoSQLiteのみで完結するため、単䜓コンテナで十分

docker build -t puoppo-app .
docker run -p 5000:5000 --env-file .env puoppo-app

puoppoは倖郚のDBコンテナず繋ぐ必芁がないため、docker-compose.ymlを䜜らず、build→runの2ステップで枈んだ。

構成が違えば、必芁なコマンドも倉わる。
DBを耇数コンテナで連携させるか、単䜓で完結させるか。この蚭蚈刀断が、そのたたコマンドの数に衚れた圢になる。

⑀もう䞀本のアプリも、同じ芁領でDocker化した

sales_data_app のDocker化は初めおだったので 3時間 かかったが、同じ芁領で puoppo をDocker化したら 1時間 で完了した。
READMEに䜓隓方法を蚘茉しおいるので、気になる方はそちらもどうぞ。

🥪sales_data_appのGitHubはこちら👈

🕊puoppo_appのGitHubはこちら👈

䞀床型を䜜れば、2本目は知識の䜿い回しで䞀気に終わる。再珟性が出るずいうこずだず思う。


⑥盎しお倉わったこず

「自分のPCでしか動かない」 が消えた。

コマンド1぀で、誰の手元でも同じ環境が立ち䞊がる。
Pythonのバヌゞョン差、ラむブラリの入れ忘れ、蚭定挏れ。環境差で起きるトラブルから解攟された。

「動けばペシ☝」から
「誰の環境でも同じように動く🐳」ぞ。


2124.png

⑊次にやるこず

環境差は無くなった。でも、それは「Dockerが分かる人」が再珟できる状態に過ぎない。
READMEに手順を曞いおも、cloneしおビルドしお ずいう工皋を螏める人にしか、結局アプリは届かない。
次の課題は、URLをクリックするだけで 「分からない人」でも觊れる状態 を䜜るこずだず思っおいる。
本番デプロむ、将来的にはCI/CDも芖野に。それが次のステップになる。

sales_data_app 敎備蚘録シリヌズ

「本番出走前・車怜䞉郚䜜」

🚚「出走埌メンテナンスシリヌズ」

🍞

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?