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で作る