Docker:
2026年6月7日コンテナ:
Dockerエンジンが動いているPC上ではDockerエンジンの上にコンテナをプロセスとして立ち上げることができる。
コンテナは「ホストOSのカーネルを共有」する。カーネル = OSの基礎部分
Docker-Desktop
Docker-DesktopをインストールするとDockerに必要なDocker EngineやDocker Cli、Docer Composeもインストールされる。UbuntuではPCの起動時にDocker エンジンが起動する(sudo systemctl status dockerで確認)。
インストール:https://docs.docker.com/desktop/setup/install/linux/ubuntu/
devファイルをDLしインストール
sudo docker loginでワンタイムパスワードが表示されるので、ブラウザにペーストしてデバイスを承認
image
コマンド:
imageの確認:
docker imagesimageの削除:
docker rmi image名imageの削除は
rmirmはコンテナの削除。docker stop コンテナIDでコンテナを停止してから行う。
Dockerfile
Dockerfileはイメージを作るためのファイル
// Dockerfile
FROM node:20FROMはベースにするイメージ。公式イメージだけでなく自分で作ったイメージを指定することもできる。
imageの作成:
docker build -t node-base .Dokerfileがあるディレクトリでコマンドを実行し、node-baseという名前のカスタムイメージを作成-t:イメージにタグをつける。付けないとdocker imagesで <none>と表示される。
コンテナの実行:
docker run -it node-base:latest bashdocker psでコンテナの確認bashorshをつけることでコンテナ内でShellが起動し、操作できる。-itの部分が無いとコンテナ内のShell操作が出来ないので、bashorshをつける場合は-itがセットで必要既に起動しているコンテナのShell操作をしたい場合は以下のコマンド
docker exec -it <CONTAINER ID or NAMES> bash(or sh)例
Nodejs:ファイルの実行
コンテナのNodejs環境でconsole.logを出力するファイルを実行する。
app/
├─ Dockerfile
├─ package.json
├─ index.jsDockerfile:
FROM node:20
WORKDIR /app
COPY index.js .
RUN apt update && apt install -y git
CMD ["node", "index.js"]WORKDIR:コンテナ内に /appフォルダを作成し、この行以降の命令のカレントディレクトリする。COPY:ホスト側のパスを指定しコンテナにコピー。WORKDIRで/appをコンテナのカレントディレクトリにしているので、.だとコンテナの/appにindex.jsがコピーされる。RUN:イメージのビルド時に実行パッケージのインストール、ファイルの作成など
CMD:コンテナの起動時に実行アプリケーションの起動など
ビルド / コンテナの起動:
docker build -t test-1 . && docker run test-1今回はconsole.logを出力するnodeプロセスが起動した後にコンテナは終了するので
docker psには表示されない。docker run -it test-1 shでコンテナを起動する場合はShellのプロセスが続くのでdocker psにコンテナが表示される。
Nodejs:サーバー
Nodejs環境のコンテナでHTTPサーバーを起動する例
app/
├─ Dockerfile
├─ package.json
├─ index.jsindex.js:
import express from "express";
const app = express();
app.get("/", (req, res) => {
res.send("from Docker");
});
app.listen(3000, () => {
console.log("Server is running on port 3000");
});Dockerfile:
FROM node:20
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["npm", "run", "dev"]ビルド / コンテナの起動:
docker build -t test-2 . & docker run test-2コンテナの3000番ポートでサーバーが起動しているのは確認できるが、ホストPC側のブラウザでアクセスすることは出来ないので開発には不便な状態
ポートマッピング:
docker run -p 3000:3000 test-2-p:コンテナの中のポートにホスト経由でアクセスできるようにする。
0.0.0.0:8080->80/tcp, [::]:8080->80/tcpdocker psを見るとPORTSが上記のような表示になっている。
ホットリロード:
docker run -p 3000:3000 -v $(pwd):/app test-2-v ホスト側パス:コンテナ側パス:ホストのディレクトリをコンテナ内にマウントする。bindマウントという
Docker-Compose
imageの例でimage用のDockerfileを作り build・runコマンドでオプションを付けてコンテナを起動していた一連の流れはDocker-Composeのみで実現できる。
docker-compose.yml:
services:
app:
image: node:20
working_dir: /app
ports:
- "3000:3000"
volumes:
- .:/app
command: >
sh -c "npm install && npx nodemon index.js"expressサーバーをコンテナで起動し、ポートマッピングを3000にしてホットリロード可能にする
docker compose up -d上記のコマンドでコンテナを起動する。
-d:これを付けないとログがターミナルに流れ続ける為、composeでコンテナを起動するときはデフォルトで付ける。
docker compose downコンテナの終了コマンド
例
Postgres
コンテナでPostgresを起動することでNeonやSupabaseのような外部DBを使わずにテストすることができる。本番ではDBの接続URLを変えるだけで済む。
docker-compose.yml:
services:
db:
image: postgres:16
container_name: test-db
ports:
- "5432:5432"
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: dev_db
volumes:
- dev_db:/var/lib/postgresql/data
volumes:
dev_db:.env:
DATABASE_URL="postgresql://user:pass@localhost:5432/dev_db?schema=test"volumes
bindマウント:目的 - ファイル共有
volumes:
- .:/appホスト側のディレクトリやファイルをそのままコンテナにマウント
ホストで編集したらコンテナに変更が反映される。
コンテナ側からnano等でファイルを変更するとホスト側のファイルに変更が反映される。 = コンテナ内でsrcを削除するような事に気をつける必要がある。
named volumes:目的 - データ永続化
volumes:
- dev_db:/var/lib/postgresql/data
volumes:
dev_db:Docker が管理するフォルダ(
/var/lib/docker/volumes)にデータを保存できる。上記の実態はホスト側の
/var/lib/docker/volumes/dv_dbにある。
.dockerignore
Docker ビルド時にコピーしたくないファイルやフォルダを指定するためのファイル
COPY . .でホストのカレントディレクトリを丸ごとコンテナにコピーするとき、不要なファイルまでコピーされてしまう例:
node_modulesや.git、ログファイルなど
=====================ーー
保留 TODO : node_modules関係
=====================ーー