はじめに
こんにちはpiyovateです!
Raspberry Pi 上で git clone したプロジェクトを触っていたところ、
リポジトリ内に Dockerfile が用意されていました。
せっかくなので Docker でビルドして起動し、
ブラウザから静的サイトにアクセスできるところまで確認してみました。
この記事では、そのときに行った手順を
あとから見返す用の備忘録としてまとめています。
環境
- Raspberry Pi(Raspberry Pi OS)
- プロジェクト構成
- Dockerfile あり
- 静的 HTML / CSS / JS
- nginx で配信する構成
1. プロジェクトディレクトリへ移動
まずは git clone 済みのプロジェクトディレクトリへ移動します。
cd ~/path/to/project
2. Dockerビルド(最初は権限エラー)
Dockerfile があるので、まずはそのままビルドしてみます。
docker build -t myapp .
すると、以下のようなエラーが出ました。
ERROR: permission denied while trying to connect to the Docker daemon socket
Docker を操作する権限が、
現在のユーザーに付与されていない状態でした。
3. dockerグループへユーザー追加(権限対応)
Raspberry Pi ではよくある対応として、
pi ユーザーを docker グループに追加します。
sudo usermod -aG docker pi
※ この設定は 次回ログインから有効 になります。
4. 今のターミナルに権限を反映(newgrp)
ログアウトせず、今のシェルで反映したい場合は newgrp を使います。
newgrp docker
反映されているか確認。
groups
出力例:
docker adm dialout ...
docker が含まれていればOKです。
5. Dockerイメージをビルド
権限が通ったので、改めて Docker イメージをビルドします。
docker build -t myapp .
6. コンテナ起動(ホスト8080番で公開)
最初は -p 8080:3000 で起動しましたが、
コンテナ内では nginx が 80番ポートで待ち受けていることが分かりました。
そのため、今回は以下のようにポートを指定して起動します。
docker run -d --name myapp -p 8080:80 myapp
-
-d:バックグラウンドで起動 -
--name myapp:コンテナ名を固定 -
-p 8080:80:ホスト8080 → コンテナ80
(※ 8080 は空いている任意のポートでOK)
7. 起動確認
コンテナが起動しているか確認します。
docker ps
8. コンテナ内の待ち受けポート確認
念のため、コンテナ内でどのポートが LISTEN しているか確認。
docker exec -it myapp sh -lc "ss -lntp || netstat -lntp"
結果例:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1/nginx
nginx が 80番ポートで待ち受けていることが分かります。
※ ss: not found と表示されても問題ありません
(コンテナ内に ss が入っておらず、netstat が実行されています)
9. curlでHTTP疎通確認
まずは Raspberry Pi 上からアクセスできるか確認します。
curl -I http://localhost:8080
成功すると、以下のように 200 OK が返ってきます。
HTTP/1.1 200 OK
Server: nginx
Content-Type: text/html
10. ブラウザからアクセス
ブラウザからも確認します。
-
Raspberry Pi 上
http://localhost:8080 -
同一LAN内の別PC / スマホ
http://<RaspberryPiのIP>:8080
IPアドレスは以下で確認できます。
hostname -I
11. python -m http.server 8000 は必要?
今回は不要 です。
コンテナ内で nginx が Web サーバとして起動しており、
すでに静的ファイルを配信できているため、
python -m http.server 8000
を追加で起動する必要はありません。
12. 停止・再起動・削除
作業後の操作メモです。
停止:
docker stop myapp
再起動:
docker start myapp
削除(作り直す場合):
docker rm myapp
まとめ
- Dockerfile があるプロジェクトは、そのまま Docker で起動できる
- Raspberry Pi では dockerグループの権限設定でハマりやすい
- 静的サイトの場合、nginx は 80番ポート待ち受けが多い
-
curl -Iで200 OKが返れば配信できている - nginx で配信できているなら
python -m http.serverは不要 - いいね 👍 やストック 📦 してもらえると励みになります!
- それでは、また次回の記事でお会いしましょう✨