2026年8月15日

2026年8月15日

docker commitでコンテナからイメージを作る方法|設定の変更と含まれないもの・注意点

docker commit は、動かしているコンテナのファイルの変更を、新しいイメージとして保存するコマンドです。コンテナの中で手作業でパッケージを入れたり設定を変えたりした状態を、そのまま別の環境で使いたいときに役立ちます。

この記事では、docker commit の使い方と、作ったイメージの確認・共有の方法、使うときの注意点を説明します。内容は2026年10月時点のDocker公式ドキュメントで確認し、コマンドは手元のDockerで動作を確かめています。

docker commit で保存されるもの・されないもの

コンテナは、元のイメージの上に「書き込み用の層」を重ねて動いています。docker commit は、この書き込み用の層を新しい層としてイメージに追加します。

項目 新しいイメージに含まれるか
コンテナ内で追加・変更・削除したファイル 含まれる
ボリューム(-v・--mount・イメージの VOLUME)に書いたデータ 含まれない
実行中のプロセスやメモリの状態 含まれない
コンテナの起動コマンド・環境変数などの設定 引き継がれる(--change で変更できる)

たとえばMySQLの公式イメージは /var/lib/mysql をボリュームにしているため、データベースのコンテナを commit してもデータは入りません。データの移行には、データベースのダンプやボリュームのバックアップを使います。

手順1:コンテナで変更を加える

例として、Alpine Linuxのコンテナに curl を入れます。

docker run -d --name work alpine:3.20 sleep infinity
docker exec work apk add --no-cache curl

手順2:変更内容を確認する

docker diff で、元のイメージから変わったファイルを確認できます。先頭の A は追加、C は変更、D は削除です。

docker diff work
C /usr
C /usr/bin
A /usr/bin/curl
...

意図しないファイル(作業中に作った一時ファイル、パスワードを書いたファイル、シェルの履歴など)が含まれていないか、ここで確かめてから保存します。

手順3:イメージとして保存する

docker commit \
  -a "Taro Yamada <taro@example.com>" \
  -m "add curl" \
  --change 'CMD ["sh"]' \
  work myname/alpine-curl:1.0
オプション 意味
-a, --author 作成者
-m, --message 変更内容の説明(docker history に表示される)
-c, --change Dockerfileの命令で設定を変える。使える命令は CMD・ENTRYPOINT・ENV・EXPOSE・LABEL・ONBUILD・USER・VOLUME・WORKDIR
--no-pause 保存中にコンテナを一時停止しない

保存中は、初期設定でコンテナのプロセスが一時停止します。書き込み途中のファイルが中途半端な状態で保存されるのを防ぐためで、--no-pause を付けると止めずに保存しますが、データが壊れる可能性が高くなります。

起動コマンドが引き継がれる点に注意

--change で CMD を指定しないと、コンテナを起動したときのコマンドがそのまま新しいイメージの CMD になります。上の例で --change 'CMD ["sh"]' を付けなかった場合、新しいイメージの CMD は sleep infinity になり、docker run するとその場で待ち続けるだけのコンテナになります。保存したら、次のコマンドで設定を確認しておきます。

docker inspect -f '{{.Config.Cmd}} {{.Config.Env}}' myname/alpine-curl:1.0

環境変数や公開ポートも、--change を複数並べて設定できます。

docker commit \
  --change 'CMD ["curl", "--version"]' \
  --change "ENV APP_ENV=production" \
  --change "EXPOSE 8080" \
  work myname/alpine-curl:1.1

手順4:作ったイメージを確かめる

# イメージの一覧
docker images myname/alpine-curl

# 層の履歴(いちばん上が commit で追加した層。-m の説明が COMMENT に出る)
docker history myname/alpine-curl:1.0

# 新しいイメージからコンテナを起動して動作を確かめる
docker run --rm myname/alpine-curl:1.0 curl --version

確認が終わったら、作業に使ったコンテナは削除してかまいません。

docker rm -f work

手順5:イメージを共有する

レジストリにpushする

Docker Hubに公開する場合は、ユーザー名/リポジトリ名:タグ の形の名前にしてからpushします。Docker Hubのリポジトリは公開(public)にも非公開(private)にもできます。

docker login

# commit 時と違う名前を付けたい場合は docker tag で別名を付ける
docker tag myname/alpine-curl:1.0 myname/alpine-curl:latest

docker push myname/alpine-curl:1.0
docker push myname/alpine-curl:latest

pushの手順と、denied などのエラーへの対処は Docker Hubにイメージをプッシュする方法 で詳しく説明しています。

レジストリを使わずにファイルで渡す

インターネットに出られないサーバーへ持ち込む場合などは、イメージをファイルに書き出して読み込ませます。

# 書き出す
docker save -o alpine-curl.tar myname/alpine-curl:1.0

# 別のホストで読み込む
docker load -i alpine-curl.tar

似たコマンドに docker export(コンテナのファイルシステムだけを書き出す)がありますが、こちらは層の履歴や CMD などの設定が失われます。イメージとして渡すなら docker save を使います。

docker commit を使う場面・使わない場面

docker commit で作ったイメージは、「どの操作で今の状態になったか」がイメージの中に残りません。同じイメージを作り直したり、ベースイメージのセキュリティ更新を取り込んだりするのが難しくなるため、公式ドキュメントでも、継続して使うイメージはDockerfileで作ることが勧められています。

向いている場面 Dockerfileを使うべき場面
調査中のコンテナの状態を一時的に保存する 本番環境で使うイメージ
障害が起きたコンテナを、調査用に別の場所で再現する チームで共有し、更新し続けるイメージ
手作業での試行錯誤の途中経過を残す CI/CDで自動的にビルドするイメージ

commit で試行錯誤した内容は、最終的にDockerfileの RUN などに書き起こしておくと、後から同じイメージを作れます。書き方は Dockerfileの書き方ガイド を参照してください。

注意点

  • 秘密の情報が残る:コンテナ内に置いたパスワード・APIキー・SSHの鍵などは、そのままイメージに入ります。後から別の層で削除しても、前の層には残ります。pushする前に docker diff で確認してください。
  • イメージが大きくなりやすい:パッケージのキャッシュや作業中の一時ファイルも保存されます。保存の前に削除しておきます(Alpineなら apk add --no-cache、Debian系なら apt-get clean と rm -rf /var/lib/apt/lists/*)。
  • 層が増え続ける:commit したイメージから起動してまた commit すると、そのたびに層が1つ増えます。

うまくいかないときの確認

症状 確認すること
新しいイメージを docker run するとすぐ終わる、または待ち続ける CMD が作業時のコマンドのまま。docker inspect で確認し、--change 'CMD [...]' を付けて保存し直す
入れたはずのデータが入っていない そのディレクトリがボリュームになっていないか。docker inspect -f '{{.Config.Volumes}}' 元のイメージ で確認する
docker push で denied になる docker login しているか。イメージ名の先頭が自分のユーザー名か
イメージが想定より大きい docker history でどの層が大きいかを見る。キャッシュや一時ファイルを消してから保存し直す

まとめ

  • docker commit はコンテナの書き込み用の層を新しいイメージとして保存する。ボリュームのデータとプロセスの状態は含まれない
  • 保存前に docker diff で変更されたファイルを確かめ、秘密の情報や不要なファイルを消しておく
  • 起動コマンドが引き継がれるので、--change 'CMD [...]' で設定し、docker inspect で確認する
  • 共有は docker push、レジストリを使わない場合は docker save と docker load
  • 継続して使うイメージは、再現できるようにDockerfileで作る

関連記事

お気軽にご相談ください

お見積りへ お問い合わせへ
▲