はじめに
Docker の面白さ・便利さに気づき始めたので、他の人にも伝えるべく記事を書きます。
(2025/03/30 追記)
↓ たいへん勉強になった本。Docker のホストマシン上での動きが基礎から解説されています。まずこれを読みましょう。
実践 Docker - ソフトウェアエンジニアの「Docker よくわからない」を終わりにする本
Docker よく使うコマンド
# イメージ一覧
docker images
# コンテナ一覧
docker ps
docker ps -a
# 内部一覧
docker image inspect <イメージ名>
docker container inspect <コンテナ名>
docker volume inspect <ボリューム名>
# コンテナ全停止
docker stop $(docker ps -aq)
# イメージ・コンテナ・ボリューム一括全削除(ただし使用中のものは消せない)
docker system prune -a
# イメージ・コンテナ・ボリュームそれぞれ全削除
docker image rm $(docker image ls -aq)
docker container rm $(docker container ls -aq)
docker volume rm $(docker volume ls -q)
# 状態確認
docker system df
# Docker Hub からイメージを持ってくる
docker pull <イメージ名>
docker pull ubuntu:20.04
# Hub から持ってくるのではなく、自分でイメージを作成(Dockerfile と同階層でコマンドを実行)
docker build -t <任意のイメージ名> .
docker build -t my_image .
# イメージのレイヤー(構成要素)を確認
docker history <イメージID>
# イメージからコンテナを起動する(create + start)
docker run <イメージ名>
# ↓ これはすぐ停止状態になる(理由は下のメモ参照)
docker run ubuntu:20.04
# ↓ これは起動状態を維持する
docker run -it ubuntu:20.04 bash
# ↓ これも維持
docker run --name <任意のコンテナ名> -p <任意のホスト側ポート番号>:<任意のコンテナ側ポート番号> <イメージ名>
docker run --name docker-getting-started -p 80:80 docker/getting-started
# コンテナを作るだけ(start待ち)
docker create <イメージ名>
docker create --name my_ubuntu_container ubuntu:20.04
# コンテナを一時停止・再開する
docker stop/start <コンテナ名>
docker start my_ubuntu_container
# 起動状態のコンテナの中に入る。bash がダメなら sh など試す
docker exec -it <コンテナ名> bash
コンテナが run した瞬間停止状態になる理由
大事なコンテナ原則
・コンテナはメインプロセスを実行するために起動する
・メインプロセスが終了したコンテナは自動で停止する
(実践 Docker - ソフトウェアエンジニアの「Docker よくわからない」を終わりにする本より)
具体例として、「docker run ubuntu:20.04」でコンテナ作成&起動はされるが、メインプロセスを指定していないので終了扱いですぐ停止される。
一方「docker run -it ubuntu:20.04 bash」はメインプロセスとして「bash」を指定しているので、私たちがコンテナ内で bash 操作している間は停止しない。bash から exit したらメインプロセス終了で停止される。
nginx イメージとか、ものによってはデフォルトでメインプロセスが指定されているものもあり、そういうのは起動した瞬間停止されることがない。
オプション | 説明 |
---|---|
-d | --detach。デタッチモード。コンテナがバックグラウンド実行され、ターミナルはブロックされない |
-p | --publish。-p 5000:5001なら、ホストの5000番はコンテナ内の5001につながっている |
-f | --force。起動中のコンテナを、停止を経由せずいきなり消すときに使う |
--rm | コンテナが停止されたとき自動的にコンテナを削除する |
-e | 環境変数(例:-e PASSWORD=password) |
-v | ボリュームの設定(例:-v my-volume:/my-data) |
-it | --interactive と --tty。コンテナに入るときに使う |
--network | 使用ネットワーク指定(例:--network networkname) |
Dockerfile と compose.yaml を動かしてみる
こちらのリポジトリ に、React + FastAPI + postgreSQL の最小構成テンプレートを公開しています。
お手元にクローンしていただき、Dockerfile や compose.yaml をご確認ください。
Dockerfile その他できること
テンプレートリポジトリでは使わなかったけれど、他で使えそうなことをまとめます。
# apt-get コマンドを「&&」で連結する。
# RUN RUN RUN と1個ずつ書いてしまうと、レイヤー数が増えてイメージが大きくなってしまうため。
# さらにメリットとして、Docker のキャッシュのせいで2回目以降一部 RUN されないといったエラーも回避できる。
RUN apt-get update && \
apt-get install -y --no-install-recommends \
build-essential \
libpq-dev \
curl \
&& rm -rf /var/lib/apt/lists/*
# root ユーザではなく、新しく作ったユーザ(appユーザ)で作業することができる。
RUN addgroup --system app && adduser --system --ingroup app app
RUN chown -R app:app /app
USER app
# root ユーザにも戻せる
USER root
compose.yaml その他できること
テンプレートリポジトリでは使わなかったけれど、他で使えそうなことをまとめます。
services:
service-1:
# Dockerfile の CMD や ENTRYPOINT の上書きができる。
command: bundle exec rails s -p 3000 -b '0.0.0.0'
entrypoint: "/bin/sh -c 'npm install && npm run start'"
# 使うネットワークを指定できる。
networks:
- coffee
# 使うネットワークを指定できる。
networks:
coffee:
ipam:
driver: default
config:
- subnet: "192.168.92.0/24"
関連:compose.yaml
- composerizeで docker run コマンドから compose.yaml を作成することができる。
- ボリュームマウントのファイルの保存場所は \wsl.localhost のdocker-desctop-data 配下にある(こちらのYoutubeで詳しく解説されています)← Mac では Finder からは見られないようです…。
おわりに
Docker に関する知識を整理できてよかったです。
知らないオプション設定がたくさんあるので、また必要に応じて勉強したいです。
参考にさせていただいた記事
- Docker Crash Course Tutorial
- Docker In One Shot - Part 1 & 2
- Docker Compose will BLOW your MIND!! (a tutorial) / .yamlファイル例
- Run Docker in Windows - Setup, Docker Compose, Extensions
- Docker Compose Tutorial
- Docker Tutorial for Beginners
- Learn Docker in 1 Hour | Full Docker Course for Beginners
- Ultimate Docker Compose Tutorial
- Docker-compose tutorial
- DOCKER COMPOSE | Complete Guide with Hands-On Examples
- Docker Compose Tutorial for Beginners (Networks - Volumes - Secrets - Postgres - Letsencrypt)
など