pcの環境を汚したくないし、ラズパイに簡単に移行できるようにdockerを使ってwebアプリを作ってみたい。


dockerの公式サイト(https://docs.docker.com/get-started/)からdockerでnodejsを使ったtodoアプリの立ち上げ方が書いてある。

このアプリを元にdockerとnodejsの両方の勉強を一気にしようと思ったが、todoアプリの構成がnodejs初心者の自分には理解が難しかった。

そのためdockerで最小限のnodejsの環境を用意して、0からnodejsの勉強をする。


docker

dockerのチュートリアルとかqiitaとか読んでみた。

作る必要があるのは以下のファイル。

・Dockerfile

コンテナという仮想環境を作る土台であるイメージの設定を書くファイル。

・compose.yml

複数のコンテナをまとめて実行できるようにするファイル。1つでも実行が楽になる。

・package.json

nodejsのパッケージをまとめたファイル。

・app.js

nodejsで動かすサーバーのプログラム。


Dockerfileをつくる

FROM node:18-alpine
WORKDIR /app
COPY . .
RUN npm install
CMD ["node", "app.js"]
EXPOSE 3000

alpineという軽量なlinuxにnodejsをインストールした環境がdockerによって用意されているのでそのイメージを使う。

イメージの中のappというフォルダを作業ディレクトリに設定。

ホスト側のファイルをappにコピー

npm installでpackage.jsonに記載したライブラリをインストール。

app.jsを実行

ポート3000を開放

compose.yamlをつくる

services:
app:
build:
dockerfile: Dockerfile
working_dir: /app
ports:
- 127.0.0.1:3000:3000
volumes:
- ./:/app

dockerfileの内容でビルド

appディレクトリにcdしておく

ポートは3000

./のディレクトリをコンテナのappディレクトリにマウント。

変更が反映されるようになる。

app.jsをつくる

const http=require('http');
var server=http.createServer(
(request,response)=>{
response.end('Hello Node.js!');
}
);
server.listen(3000);

Hello Wold

package.jsonをつくる

{
"dependencies": {
"express": "^4.21.1",
"sqlite3": "^5.1.7"
}
}

とりあえずexpressろsqliteをインストールするようにしといた。

実行

compose.yamlファイルがあるディレクトリで

docker compose up -d


localhost:3000にアクセスすると

Hello Node.js!と表示される。



あとから追加するパッケージ

vscodeでpackage.jsonに追加しようとすると勝手に最新verを教えてくれる。


・nodemon

これは開発の時しか使わないためdevDependenciesに加える。

dependenciesに加えるとデフォルトだとエラーが出る。

自動で編集したところを更新してくれる。--watch機能があるみたいだが更新してくれる範囲がのーどもんのほうが広いらしい。nodeで起動する代わりにnodemonで起動する。

CMD ["node", "app.js"]をCMD ["nodemon", "app.js"]に変える。


パッケージを追加したらビルドし直す

docker compose up --build -d

コマンド操作

コマンドで操作するとき

nano ファイル名 :ファイル編集。vimコマンド覚えてないから

touch ファイル名 :ファイル作成

ctrl+K :カーソルから行末まで削除

ctrl+U:カーソルから行頭まで削除

ctrl+A: カーソルを行頭へ移動

ctrl+E:カーソルを行末へ移動

rm ファイル名:ファイル、ディレクトリ削除

mkdir ディレクトリ名:ディレクトリ作成