docker compose up –buildは何をしているのか?
はじめに
現職で以下の技術を使用する可能性があるため、買い物リスト作成アプリをオリジナルでChatGPT 5の力も借りながら作成している。
- Docker
- Django
- Vue.js
基礎知識は多岐に渡るが、この記事では、アプリを起動する時のコマンド「docker compose up –build」について書いていく。
仮説
AIに聞く前に、自分なりの仮説を立ててみる。
これは、大AI時代にとても大事なこと。
自分の頭で考えることができなければ、AIに適切なプロンプトを入力して、適切な回答を得ることができない。
仮説としては、アプリに必要なファイル一式の依存関係を調整して、アプリを起動させるといったところか?
実際にコマンドを打った様子
現在作成中の以下のアプリで、docker compose up –buildを打った様子をお届けしよう。
https://github.com/ki-hi-ro/shopping_list_app
それがこちら。
hiroki@shibatahiroshitakanoiMac shopping_list_app % docker compose up --build
[+] Building 56.0s (24/24) FINISHED
=> [internal] load local bake definitions 0.0s
=> => reading from stdin 774B 0.0s
=> [backend internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 309B 0.0s
=> [frontend internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 150B 0.0s
=> [frontend internal] load metadata for docker.io/library/node:20-alpine 2.2s
=> [backend internal] load metadata for docker.io/library/python:3.12-slim 2.0s
=> [backend internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [backend 1/6] FROM docker.io/library/python:3.12-slim@sha256:9c1d9ed7593f2552a4ea47362ec0d2ddf5923458a53d0c8e30edf8b398c94a31 0.0s
=> => resolve docker.io/library/python:3.12-slim@sha256:9c1d9ed7593f2552a4ea47362ec0d2ddf5923458a53d0c8e30edf8b398c94a31 0.0s
=> [backend internal] load build context 0.0s
=> => transferring context: 708B 0.0s
=> CACHED [backend 2/6] WORKDIR /app 0.0s
=> CACHED [backend 3/6] RUN apt-get update && apt-get install -y build-essential libpq-dev && rm -rf /var/lib/apt/lists/* 0.0s
=> CACHED [backend 4/6] COPY requirements.txt ./ 0.0s
=> CACHED [backend 5/6] RUN pip install --no-cache-dir -r requirements.txt 0.0s
=> CACHED [backend 6/6] COPY . . 0.0s
=> [backend] exporting to image 0.2s
=> => exporting layers 0.0s
=> => exporting manifest sha256:7b993b1513a3debddd8264daf81bf615394ed4d19e38d89c4c55c0f2b3e7a982 0.0s
=> => exporting config sha256:990f8bde0f9eb3a5afa0fbbcef62eabc8315540a7e4a0601c536d97f94ca9f0b 0.0s
=> => exporting attestation manifest sha256:49aafe8c09ef7758444fc09363d2f34461f3e5ba7ea0f8a805f88e7b63a5b14d 0.0s
=> => exporting manifest list sha256:0b8e2367b4317234a997512951ceae6a5b942315b49e7c20ced91a7525796e41 0.0s
=> => naming to docker.io/library/shopping_list_app-backend:latest 0.0s
=> => unpacking to docker.io/library/shopping_list_app-backend:latest 0.0s
=> [frontend internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [frontend 1/5] FROM docker.io/library/node:20-alpine@sha256:df02558528d3d3d0d621f112e232611aecfee7cbc654f6b375765f72bb262799 0.0s
=> => resolve docker.io/library/node:20-alpine@sha256:df02558528d3d3d0d621f112e232611aecfee7cbc654f6b375765f72bb262799 0.0s
=> [frontend internal] load build context 2.3s
=> => transferring context: 985.91kB 2.2s
=> [backend] resolving provenance for metadata file 0.0s
=> CACHED [frontend 2/5] WORKDIR /app 0.0s
=> CACHED [frontend 3/5] COPY package.json package-lock.json* ./ 0.0s
=> CACHED [frontend 4/5] RUN npm ci || npm i 0.0s
=> [frontend 5/5] COPY . . 17.0s
=> [frontend] exporting to image 33.5s
=> => exporting layers 17.4s
=> => exporting manifest sha256:3e44ab65db695c1fb928be51e2396006c050d1224fab1fae4e02cfd1acf504b4 0.0s
=> => exporting config sha256:4b1dfc90f1cf73d7040486e7b0540a3292e0151b961c52c910ed474c4f614dfe 0.0s
=> => exporting attestation manifest sha256:c8ba01edddf8dc4cf909be87734e845fd53a5c3539ae80e46d5167a26ffd1039 0.0s
=> => exporting manifest list sha256:4a291d921162fdf3ca9461d0d9fa3a1e06a0aa558934971ce3dee2b904cbfedd 0.0s
=> => naming to docker.io/library/shopping_list_app-frontend:latest 0.0s
=> => unpacking to docker.io/library/shopping_list_app-frontend:latest 15.6s
=> [frontend] resolving provenance for metadata file 0.1s
[+] Running 4/4
✔ backend Built 0.0s
✔ frontend Built 0.0s
✔ Container shopping_list_app-backend-1 Recreated 1.7s
✔ Container shopping_list_app-frontend-1 Recreated 2.6s
Attaching to backend-1, db-1, frontend-1
db-1 |
db-1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
db-1 |
db-1 | 2025-08-11 02:20:19.919 UTC [1] LOG: starting PostgreSQL 16.9 (Debian 16.9-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
db-1 | 2025-08-11 02:20:19.950 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
db-1 | 2025-08-11 02:20:19.950 UTC [1] LOG: listening on IPv6 address "::", port 5432
db-1 | 2025-08-11 02:20:19.955 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db-1 | 2025-08-11 02:20:20.019 UTC [29] LOG: database system was shut down at 2025-08-10 09:49:07 UTC
db-1 | 2025-08-11 02:20:20.080 UTC [1] LOG: database system is ready to accept connections
frontend-1 |
frontend-1 | > shopping-frontend@0.0.1 dev
frontend-1 | > vite --host 0.0.0.0
frontend-1 |
backend-1 | Operations to perform:
backend-1 | Apply all migrations: admin, auth, contenttypes, sessions, shopping
backend-1 | Running migrations:
backend-1 | No migrations to apply.
frontend-1 |
frontend-1 | VITE v5.4.19 ready in 4538 ms
frontend-1 |
frontend-1 | ➜ Local: http://localhost:5173/
frontend-1 | ➜ Network: http://xxx.xx.x.x:5173/
backend-1 | Watching for file changes with StatReloader
backend-1 | Performing system checks...
backend-1 |
backend-1 | System check identified no issues (0 silenced).
backend-1 | August 11, 2025 - 11:20:29
backend-1 | Django version 5.0.6, using settings 'shopping_backend.settings'
backend-1 | Starting development server at http://0.0.0.0:8000/
backend-1 | Quit the server with CONTROL-C.
backend-1 |
db-1 | 2025-08-11 02:25:20.080 UTC [27] LOG: checkpoint starting: time
db-1 | 2025-08-11 02:25:20.099 UTC [27] LOG: checkpoint complete: wrote 3 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.004 s, sync=0.001 s, total=0.018 s; sync files=2, longest=0.001 s, average=0.001 s; distance=0 kB, estimate=0 kB; lsn=0/1A2D7E0, redo lsn=0/1A2D7A8
v View in Docker Desktop o View Config w Enable Watch
フロントエンドのURLは以下の2種類。
frontend-1 | ➜ Local: http://localhost:5173/
frontend-1 | ➜ Network: http://xxx.xx.x.x:5173/
機密情報のため、自身のIPアドレスは隠してある。
Localは繋がった。

Networkが繋がらない。

NetworkのURLにアクセスできない問題を解決する
Dockerのアプリを起動してみる。
アイコンをクリックしても何も起こらなかったので、起動中のプロセスをcontrol + Cで停止した。
Gracefully stopping... (press Ctrl+C again to force)
[+] Stopping 3/3
✔ Container shopping_list_app-frontend-1 Stopped 0.7s
✔ Container shopping_list_app-backend-1 Stopped 0.4s
✔ Container shopping_list_app-db-1 Stopped 0.3s
hiroki@shibatahiroshitakanoiMac shopping_list_app %
朝、二つあったDockerアプリのうちの一つを削除したことが原因か?
今あるものをアンインストールしてから、入れ直そう。
と思ったが、アプリを右クリックして、パッケージの内容を表示を押して、

Contents > MacOS の中にあるアイコンをダブルクリックしたら、起動した。


この状態で再度、docker compose up buildを行う。
やはりアクセスできない。
これはGPT 5に聞いてしまおう。
NetworkのURLにアクセスできない問題をAIに相談
膨大な知識があることはわかったが、問題解決には至らなかった。

人間ならではの直感が大事になってくる。
大AI時代において。
接続しているIPアドレスに変更したら、うまく行った。

ログにあったIPとは異なる。
frontend-1 | ➜ Local: http://localhost:5173/
frontend-1 | ➜ Network: http://xxx.xx.x.x:5173/
スマホでも同じURLでアクセスできている。
本題 : Docker compose up –buildは何をしているのか?
docker compose up --build
は、Docker Compose が定義したサービスの イメージを必要に応じて再ビルドし、コンテナを起動してログに接続する コマンドです。
ポイントは3つ:
- 再ビルド:Dockerfileや依存ファイルの変更を反映して新しいイメージを作成
- 起動:
docker-compose.yml
に基づき、すべてのサービスコンテナを立ち上げる - ログ接続:起動したコンテナのログをターミナルにリアルタイム表示
イメージ:アプリの実行環境や必要なファイル一式をまとめた“設計図”のようなもの。Python や Node.js のランタイム、依存ライブラリ、アプリのソースコードなどが含まれる。
サービスコンテナ:そのイメージから作られて実際に動いている“実行中の箱”のこと。アプリやデータベースなど、サービスごとに独立して動作する。
ランタイム:プログラムを動かすための実行環境。例として Python ランタイムなら Python インタプリタや標準ライブラリが含まれ、コードを動かせる状態を提供する。
サービス:アプリや機能の単位として動くコンポーネント。Webアプリのバックエンドやフロントエンド、データベースなど、特定の役割を持ったプロセスやコンテナのまとまり。

おっしゃる通り、3つのコンテナが立ち上がっている。
✔ backend Built 0.0s
✔ frontend Built 0.0s
✔ Container shopping_list_app-db-1 Running 0.0s
✔ Container shopping_list_app-backend-1 Recreated 4.9s
✔ Container shopping_list_app-frontend-1 Recreated 4.9s
Attaching to backend-1, db-1, frontend-1
フォルダ構成はこちら。
// Directory layout:
// .
// ├─ docker-compose.yml
// ├─ backend/
// │ ├─ Dockerfile
// │ ├─ requirements.txt
// │ ├─ manage.py
// │ ├─ shopping_backend/
// │ │ ├─ __init__.py
// │ │ ├─ settings.py
// │ │ ├─ urls.py
// │ │ └─ asgi.py
// │ └─ shopping/
// │ ├─ __init__.py
// │ ├─ models.py
// │ ├─ serializers.py
// │ ├─ views.py
// │ ├─ urls.py
// │ └─ admin.py
// └─ frontend/
// ├─ Dockerfile
// ├─ package.json
// ├─ vite.config.js
// ├─ index.html
// └─ src/
// ├─ main.js
// ├─ App.vue
// └─ components/
// └─ ShoppingList.vue
ルートにあるdocker-compose.ymlの中で、dbが定義されていた。

コメントを残す