/Linuxコマンド

開発ツール

Docker と Docker Compose

コンテナの起動・確認・ログ・中に入る・片付けと、docker compose での複数コンテナの管理。

dockerコンテナを動かす

Ubuntu には最初から入っていません。 で入れられます。

アプリを「コンテナ」という独立した環境で動かします。開発環境やサーバーの構築によく使われます。

起動する

bash
$ docker run hello-world
$ docker run -it --rm ubuntu:24.04 bash          # 使い捨てで中に入る
$ docker run -d --name web -p 8080:80 nginx      # 裏で起動し、8080 → 80 をつなぐ
$ docker run -d -v "$PWD":/app -w /app node:22 npm run dev   # 今のディレクトリをつないで実行
$ docker run --env-file .env myimage
オプション意味
-d裏で起動する
-it対話的に使う(シェルに入るとき)
--rm終了したらコンテナを消す
--name名前を付ける
-p ホスト:コンテナポートをつなぐ
-v ホスト:コンテナディレクトリやボリュームをつなぐ
-e KEY=VALUE環境変数
--restart unless-stopped落ちたり再起動したりしても自動で起動する

様子を見る

bash
$ docker ps                      # 動いているコンテナ
$ docker ps -a                   # 止まっているものも
$ docker logs -f --tail 100 web  # ログを追いかける
$ docker exec -it web sh         # 動いているコンテナの中に入る
$ docker stats                   # CPU・メモリの使用量
$ docker inspect web | jq '.[0].NetworkSettings.IPAddress'

止める・消す

bash
$ docker stop web && docker rm web
$ docker restart web
$ docker images                  # イメージの一覧
$ docker rmi nginx:latest
$ docker system df               # 使っている容量
$ docker system prune            # 止まったコンテナ・使っていないネットワーク・宙ぶらりんのイメージを消す
$ docker system prune -a --volumes   # 使っていないものを全部消す(注意)

イメージを作る

Dockerfile
FROM node:22-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
CMD ["npm", "start"]
bash
$ docker build -t myapp:latest .
$ docker run -d -p 3000:3000 myapp

docker compose複数のコンテナをまとめて管理

Ubuntu には最初から入っていません。 で入れられます。

compose.yaml に書いた複数のコンテナを、まとめて起動・停止します。

compose.yaml
services:
web:
build: .
ports:
- "3000:3000"
env_file: .env
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: example
volumes:
- dbdata:/var/lib/postgresql/data
volumes:
dbdata:
書き方意味
docker compose up -dまとめて裏で起動
docker compose up -d --buildイメージを作り直してから起動
docker compose ps状態
docker compose logs -f webログを追いかける
docker compose exec web sh中に入る
docker compose restart web再起動
docker compose down止めて消す(ボリュームは残る)
docker compose down -vボリュームも消す
docker compose pullイメージを最新にする

docker のその他のサブコマンド

docker cpコンテナとファイルをやり取りする

コンテナと手元の間でファイルをコピーします。

bash
$ docker cp web:/etc/nginx/nginx.conf ./nginx.conf     # コンテナ → 手元
$ docker cp ./index.html web:/usr/share/nginx/html/    # 手元 → コンテナ

docker volumeデータの保存場所

コンテナのデータを保存しておく場所(ボリューム)を管理します。

bash
$ docker volume ls
$ docker volume inspect dbdata
$ docker run --rm -v dbdata:/data -v "$PWD":/backup alpine tar czf /backup/dbdata.tgz -C /data .   # ボリュームをバックアップ
$ docker volume prune                  # 使われていないボリュームを消す(注意)

docker networkコンテナどうしをつなぐ

コンテナどうしを同じネットワークにつなぎます。

bash
$ docker network create mynet
$ docker run -d --name db --network mynet postgres:16
$ docker run -d --name app --network mynet -e DB_HOST=db myapp    # 名前(db)でつながる
$ docker network ls
$ docker network inspect mynet

docker imageイメージを管理する

イメージを取得・タグ付け・送信・ファイル化します。

bash
$ docker pull nginx:1.27
$ docker tag myapp:latest ghcr.io/me/myapp:1.0
$ docker push ghcr.io/me/myapp:1.0
$ docker save myapp:latest | gzip > myapp.tar.gz      # ファイルにする(オフライン移動用)
$ docker load < myapp.tar.gz
$ docker image history myapp                          # 各レイヤーの大きさ
$ docker image prune -a                               # 使っていないイメージを消す

docker loginレジストリにログインする

イメージを置く場所(レジストリ)にログインします。

bash
$ echo "$GITHUB_TOKEN" | docker login ghcr.io -u me --password-stdin

docker events / top / diff様子を詳しく見る

コンテナの中のプロセスや、変わったファイル、起動・停止の記録を見ます。

bash
$ docker top web              # コンテナの中のプロセス
$ docker diff web             # イメージから変わったファイル
$ docker events --since 10m   # 起動・停止などの出来事