【Docker速攻入門】「docker commit」でコンテナイメージをカスタマイズする

2021年2月12日

前回の記事ではdockerでubuntuのコンテナを起動してコマンドを追加インストールする方法を説明しました。

前回の記事でも説明しましたが、起動中のコンテナに対してインストールしたコマンドやソフトウェアは次回のコンテナ起動時には破棄されてしまいます。

これは使用するコンテナイメージ自体にインストールなどの作業内容が反映されていないためです。

せっかくインストールしたのですから継続して使いたいと思いますよね。

こんな時は作業を行った状態のコンテナをコンテナイメージに保存する「commit」と言うコマンドオプションがあります。

この「commit」でコンテナイメージを更新すれば作業内容が反映された状態のコンテナを使用することが出来ます。

ではやり方を見て行きましょう。

1.コンテナを起動する。

まず、前回のコンテナ起動ですが、フォアグランドで起動したのでubuntuから抜けると同時にコンテナも終了していました。

今回はバックグラウンドで起動することでubuntuから抜けてもコンテナが終了しないように起動します。

バックグランドで起動するには「-d」オプションを指定します。

1)ubuntuのコンテナ起動

コマンドプロンプトで以下のコマンドを入力してubuntuのコンテナを起動します。

C:\Users\user01>docker run -it -d ubuntu bash
8192b1138668d39e0c659cdcd15c3c6cce5d83a76e5c476abec67d7111517a9a

ここで表示された「8192b1138668d39e0c659cdcd15c3c6cce5d83a76e5c476abec67d7111517a9a」はコンテナIDです。これは毎回変わります。
コンテナIDを指定するには先頭から一意で判別できる長さの文字列で指定することが出来ます。
この場合「8192b」としても十分大丈夫です。

2)バックグランド動作しているコンテナの確認

続いて「docker ps」コマンドでバックグラウンドで動いているコンテナの状態を確認します。

C:\Users\user01>docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
8192b1138668   ubuntu    "bash"    7 seconds ago   Up 6 seconds             fervent_chandrasekhar

先程も表示されたコンテナIDが先頭の一部分で表示されていることが分かります。

3)バックグランドのコンテナに接続

「docker exec」コマンドでバックグラウンドで動作しているコンテナに接続します。

C:\Users\user01>docker exec -it 8192b1138668 bash --login
root@8192b1138668:/#

スポンサードサーチ

2.コンテナイメージを更新して新たなコンテナイメージを作成

1)コンテナに「ip」コマンドをインストール

コンテナ上のubuntuに接続できたのでコマンドをインストールしてみましょう。

前回同様「ip」コマンドをインストールします。

apt-get upgrade
apt-get update
apt-get install iproute2 -y

コマンドの実行を確認してみます。
ipコマンドが正常に実行されることを確認しておいてください。

ip addr show

2)「docker commit」で対象のコンテナイメージを更新する

①ubuntuから「exit」で抜けてコマンドプロンプトに戻ります。
フォアグランドで起動したときは即コンテナも終了していましたが、今回はバックグランドで動かしているのでコンテナは継続して動いています。

②「docker images」コマンドで現在PC上に存在するイメージの一覧を表示してみます。

C:\Users\user01>docker images
REPOSITORY     TAG       IMAGE ID       CREATED          SIZE
ubuntu         latest    f643c72bc252   1 days ago      72.9MB
hello-world    latest    bf756fb1ae65   1 days ago    13.3kB

③「docker ps」で稼働中のコンテナを確認します。

C:\Users\user01>docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
8192b1138668   ubuntu    "bash"    14 minutes ago   Up 14 minutes             fervent_chandrasekhar

稼働中のコンテナIDが「8192b1138668」であることが確認できました。

④コンテナID「8192b1138668」を「docker commit」コマンドでコンテナイメージとして書き出して新たに「ubuntu_01」として保存します。

C:\Users\user01>docker commit 8192b1138668 ubuntu_01
sha256:c0b93bce7b4d21396b1aa223b021658a16436ca86c2007f9d5fb3f8cab6aeace

⑤イメージの一覧を確認してみます。

C:\Users\user01>docker images
REPOSITORY     TAG       IMAGE ID       CREATED          SIZE
ubuntu_01      latest    c0b93bce7b4d   14 seconds ago   104MB
ubuntu         latest    f643c72bc252   5 weeks ago      72.9MB
hello-world    latest    bf756fb1ae65   12 months ago    13.3kB

「ubuntu_01」というコンテナイメージが作成されたことが確認できました。

⑥作成したコンテナイメージで起動してipコマンドが実行できることを確認します。

C:\Users\user01>docker run -it ubuntu_01 bash
root@4fea950e03c3:/# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group defaul
t qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
27: eth0@if28: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
 group default
    link/ether 02:42:ac:xx:xx:xx brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
root@4fea950e03c3:/#

今度はipコマンドが作成されたコンテナイメージで起動することで、作業内容が反映されたコンテナイメージで起動できることが確認できたと思います。

スポンサードサーチ

3.まとめ

このように必要な環境を構築したコンテナイメージを作成することが理解いただけたと思います。

作成したコンテナイメージはローカル環境に格納された状態です。
これをdockerハブにアップロードして他の利用者に公開することも可能です。(アップロードする場合はコメントや作成者情報などを追記したほうがいいでしょう)

 

docker

Posted by garnet