Dockerイメージとコンテナの関係として正しいのは?
解説
正解は「イメージからコンテナが作られる」です。Dockerイメージはアプリケーションの実行に必要なファイルや設定をまとめた読み取り専用のテンプレートで、そこからコンテナという実行中のインスタンスが生成されます。イメージがバックアップというのは因果が逆ですし、コンテナからイメージが作られるわけでもありません(docker commit で既存コンテナからイメージを作る操作は存在しますが、それは通常の流れではありません)。「クラスとインスタンス」で考えるプログラミングに馴染みがあるなら、イメージはクラス、コンテナはインスタンスと考えるとわかりやすいです。クラス(イメージ): 設計図。それ自体は動かないインスタンス(コンテナ): 設計図から作った実体。実際に動く1つのイメージから複数のコンテナを作れる点も、クラスから複数のインスタンスを生成できるのと同じです。# 同じイメージから2つのコンテナを起動 docker run -d --name app1 nginx docker run -d --name app2 nginxイメージはどうやって作るのかイメージは Dockerfile というテキストファイルに手順を書き、docker build コマンドで作成します。FROM node:20 WORKDIR /app COPY package.json . RUN npm install COPY . . CMD ["node", "index.js"]FROM でベースとなるイメージを指定し、その上に COPY や RUN で自分のアプリに必要なファイルや処理を重ねていきます。この「重ねる」仕組みがレイヤー構造と呼ばれるDockerイメージの特徴です。各命令が1つのレイヤーになり、変更がないレイヤーはキャッシュされるためビルドが高速になります。コンテナは使い捨てが基本Dockerの重要な考え方として、コンテナは使い捨てという原則があります。コンテナを停止・削除しても、同じイメージからいつでも同じ状態のコンテナを再作成できます。だからこそ、コンテナの中でデータを永続的に保存するのではなく、データベースのファイルやアップロードされたファイルなどはボリューム(docker volume)を使ってコンテナの外に保存するのが定石です。# ボリュームを使ってデータを永続化する例 docker run -d -v mydata:/var/lib/mysql mysqlよく使うコマンドの整理イメージとコンテナの区別がつくと、基本コマンドの意味も整理できます。docker build: Dockerfile → イメージを作成docker run: イメージ → コンテナを作成して起動docker ps: 実行中のコンテナ一覧docker images: ローカルにあるイメージ一覧docker stop / docker rm: コンテナの停止・削除docker rmi: イメージの削除「操作対象がイメージなのかコンテナなのか」を意識するだけで、コマンドの使い分けに迷いにくくなります。