Dockerイメージを操作してみました。
はじめに
ハローワールド!マイクです。
Dockerはオープンなプラットフォームです。Dockerオブジェクトと呼ばれるイメージ、コンテナ、ネットワーク、ボリュームなどで構成され、これらを操作する事でアプリケーションを開発、配布、実行することが出来ます。
と言いますけど、実際どうなのか試したときの記録です。今回はDockerイメージです。
使ったもの
今回の環境を下記に示しておきます。
・Ubuntu 22.04 LTS Desktop 64-bit
・Docker version 20.10.13 build a224086
あと、Ubuntuはインターネットに繋がっている必要があります。
まず、Dockerイメージとはなんでしょう?
Dockerイメージ(以下イメージ)とはDockerコンテナ(以下コンテナ)を作成・実行する為のテンプレートです。OS(軽量なalpineを使う事が多いですかね。)などのベースイメージの上に”層”(Layer、以下レイア)を積み上げて作成します。各レイアはcopy on writeのもとで管理されているファイルやディレクトリとコマンドの組み合わせです。copy on writeとは、あるレイアが参照したいファイルやディレクトリが他のレイアに既に存在している場合には、その他のレイヤのファイル又はディレクトリをそのまま参照します。また、イメージの作成やコンテナの実行によりそのファイルへの変更を行う場合にはコピーを作成して、そのコピーに変更を加えます。
コンテナを作成し、変更(例、UbuntuにMySQLをインストールする)を加えたあとにイメージとして固めて、配布することができます。変更する→固める→配布するを繰り返していると、そのコンテナはどうやって作成されたのか分からなくなります。何かを直したくても正しく直せなくなる可能性がありますね。それを防止する為にDockerfileを使うことが推奨されています。Dockerfileにはイメージを作成し実行する命令が書かれています。そして命令が実行される度にレイヤ作成されます。例を示したいと思います。
上のDockerfileではalpineという軽量なLinuxイメージを取得したあとapkというパッケージ管理ソフトでbashを追加しています。FROM alpineの行で一つのレイヤです。RUN apkの行でまた別のレイヤです。レイヤが2つローカルに作成されます。このDockerfileから作成されるイメージの名前を”acme/my-base-image:1.0”としておきましょう。もう一つ例を見てみましょう。
ここでは、最初のDockerfileから作成したイメージ”acme/my-base-image:1.0”から別のイメージを作成しています。新しくローカルにはCOPY行のレイヤ、RUN chmod行のレイヤ、CMD行のレイヤが作成されます。このDockerfileからイメージを作成するとき、”acme/my-base-image:1.0”イメージにあるレイヤ2つとDockerfileに記述されているレイヤ3つを使います。2つの別々のイメージで”FROM alpine”と”RUN apk add --no-cache bash”を共有しているんですね。
ここでのまとめとして。
・イメージはレイヤの集まりです。
・Dockerfileはイメージを作成するための命令書です。
・レイヤはローカルで共有されています。
・イメージは必ずDockerfileから作成しましょう。
次にイメージを操作してみます
イメージを操作する基本コマンドを以下に示したいと思います。
・ローカルにあるイメージを表示する
> docker image ls
コンテナを作成するとき、ローカルにイメージが無い場合はパブリックレジストリ(初期設定ではDockerHub)を検索してローカルにダウンロードします。
・イメージの検索をする
> docker search イメージ名(例、nginx)
イメージの検索をパブリックレジストリで行います。パブリックレジストリがDockerHubであれば、DockerHubのウェブページでイメージを検索したときと同じ結果が返ってきます。
・レジストリにログイン
> docker login -u ユーザ名 -p パスワード
レジストリにログインしないと出来ない操作(イメージの公開)などを行うときに必要です。
・レジストリからイメージを取得する
> docker pull イメージ名(例、debian)
レジストリからローカルにイメージを取得します。イメージ名のみを指定した場合、最新のイメージを取得してきます。イメージ名:タグの形式で特定のバージョンを指定することも可能です。(例、debian:jessie)最新のバージョンを指定するときタグに:latestと記述してもOKです。(例、debian:latest)尚、コンテナを作るときにイメージがローカルに存在しない場合には、勝手に最新をレジストリから取得します。
・ローカルからイメージを削除する
> docker rmi イメージ名
このコマンドでイメージを削除しても、このイメージから作成されたコンテナは残ります。
・ローカルにあるイメージの情報を表示する
> docker image inspect イメージ名
タグ名や作成日時、使うポート番号などがjson形式で表示されます。
・ローカルにあるイメージに行われたレイヤへの変更を表示する
> docker image history イメージ名
最後に
今回はコンテナの元になるイメージについて書いてみました。イメージを作成するDockerfileの作り方については別の機会にしたいと思います。最後まで読んで頂きありがとうございます。
参考
履歴
2022年06月25日:投稿
2022年07月10日:体裁の変更。
この記事が気に入ったらサポートをしてみませんか?