💡

【Docker】コンテナをcommitして更新内容をDockerimageにしてみる

2024/04/07に公開

0.はじめに

今回は、「コンテナをcommitして更新内容をDockerimageにする」方法を解説します。

本記事の内容に沿って、ハンズオンいただくと以下を習得できます。

  • コンテナを再起動する方法
  • 実行中のコンテナ内でコマンドを実行する方法
  • 更新したコンテナから新しいDockerimageを作成する方法

前提として、以下は準備できているものとして解説をしていきます。

  • ✅Linux基礎の理解
  • ✅DockerHubの登録
  • ✅Dockerのインストール

まだご準備できていない方は、以前書いた記事をご覧いただければと思います。
https://zenn.dev/gachigachi/articles/2f28e96cc26774

では、次の章から具体的な解説を進めます!!

1.UbuntuのDockerimageをrunしてみる

この章で、図のようにUbuntuイメージをrunしてログインする方法を解説します。

ホストOS上のターミナルを立ち上げて、以下コマンドを実施します。

  • $ docker run -it ubuntu bash(Ubuntuのコンテナを起動しbashでログインする)

では、docker runしてみましょう。

$ docker run -it ubuntu bash

すると、以下のような表示結果となり、Ubuntuのコンテナを起動しbashでログインした状態となります。

root@a8f40efabba4:/# ←ログインユーザー@コンテナIDで表示される

ちなみに、docker runをした際、ホストOS上に指定したイメージがない場合は、DockerHubから自動的にpullしてきてくれます(今回だとUbuntuイメージ)。

次の章で、ログインしたUbuntu上で新しいファイルを作成し、コンテナを更新していきます。

2.Ubuntuのコンテナを更新してみる

前章でログインしたUbuntuのコンテナ内に新しいファイル(test)を作成し、コンテナを更新してみます。

具体的には、以下コマンドを実施していきます。

  • $ touch <file>(新しいファイルを作成)
  • $ exit(Ubuntuのコンテナ上からログオフしてホストOS上へ戻る)

早速、touchコマンドを実行しましょう。

root@a8f40efabba4:/# touch test

lsコマンドでtestファイルが作成されていることを確認しましょう。

root@a8f40efabba4:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var
root@a8f40efabba4:/#

testファイルが作成されていることを確認したら、exitコマンドでコンテナ上から抜けましょう。

root@a8f40efabba4:/# exit
$

ホストOS上に戻ってこれたと思います。

次の章で、今回更新したUbuntuコンテナを再起動する方法を見ていきます。

3.コンテナを再起動してログインしてみる

前章で変更を加えた、Ubuntuのコンテナを再起動してみます。

具体的には、以下コマンドを実施していきます。

  • $ docker restart <container>(コンテナを再起動する)
  • $ docker ps -a(コンテナの起動状態を確認する)
  • $ docker exec -it <container> bash(起動しているコンテナ対して、指定したプログラムを実行する)
  • $ exit(Ubuntuのコンテナ上からログオフしてホストOS上へ戻る)

まず、$ docker ps -aコマンドでコンテナの状態を確認してみます。

$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                     PORTS     NAMES
a8f40efabba4   ubuntu         "bash"                    54 minutes ago   Exited (0) 5 minutes ago             fervent_ardinghelli
$ 

STATUS欄を見ると、「Exited (0)」になっていることが確認できると思います。

では、以下コマンドで上記コンテナを再起動してみましょう。

$ docker restart a8f40efabba4
a8f40efabba4
$ 

再度、$ docker ps -aコマンドで該当コンテナの起動状態を確認してみます。

$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                     PORTS     NAMES
a8f40efabba4   ubuntu         "bash"                    59 minutes ago   Up About a minute                    fervent_ardinghelli
$ 

STATUS欄を見ると、「Up」になっていることが確認できると思います。

では、以下コマンドを実施して再度コンテナへログインしてみましょう。

$ docker exec -it a8f40efabba4 bash
root@a8f40efabba4:/#

ログインできましたら、lsコマンドを実行して、testファイルがあるか確認してみましょう。

root@a8f40efabba4:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var
root@a8f40efabba4:/#

testファイルが作成されていることを確認したら、exitコマンドでコンテナ上から抜けましょう。

root@a8f40efabba4:/# exit
$

ホストOS上に戻ってこれました。

以上のことから、前回更新したtestファイルの存在が確認できたと思います。

次の章で、コンテナをcommitして更新内容をDockerimageにしてみましょう。

4.コンテナをcommitして更新内容をDockerimageにしてみる

更新したUbuntuのコンテナから新たなDockerimageを作成してみます。

具体的には、以下コマンドを実施していきます。

  • $ docker commit <container> <new image>(コンテナをcommitして更新内容をDockerimageにする)

では、実際に$ docker commitを実行してみましょう。新しいイメージ名は「タグ名:イメージ名」で指定します。

$ docker commit a8f40efabba4 ubuntu:update                                   
sha256:7737b7f797e25f4b003a331fd4b546baf5f0286c280c13390921377299e471bd

上記のように、作成した新しいイメージのハッシュ値が出力され、正常終了すると思います。

作成されたことを確認するために、docker imagesコマンドを実行してみましょう。

$ docker images
REPOSITORY                     TAG       IMAGE ID       CREATED         SIZE
ubuntu                         update    7737b7f797e2   6 seconds ago   77.9MB

指定した「タグ名:イメージ名」で作成されていることが確認できると思います。

今回はtestファイルを追加しただけですが、本当はミドルウェアの追加など、もっと複雑な更新を行なって新しいイメージにします。

5.おわりに

今回はコンテナの理解を深めるために、Ubuntuのコンテナを使って以下を学びました。

  • コンテナを再起動する方法(docker restart
  • 実行中のコンテナ内でコマンドを実行する方法(docker exec
  • 更新したコンテナから新しいDockerimageを作成する方法(docker commit

一回で覚えるのは難しいと思うので、何度かトライして覚えるで全然大丈夫です。

次回以降、「DockerHubにDockerimageをpushする」方法などを解説していきたいと思います。

おわりっ!!

あわせて読んでいただきたい記事

https://zenn.dev/gachigachi/articles/b4a54d57d4e2c5

コマンドラインのリファレンス(Docker-docs-ja)

Discussion