Docker の使い方(その1:概要)
最近では、アプリケーションの実行環境の構築に Docker を使うことも珍しくなくなりました。 Docker は便利ではあるのかもしれませんが、難しく感じて敬遠されている人もいるのではないでしょうか。 その感覚はおそらく間違っていません。 実際、知れば知るほど奥が深い技術だと感じてしまいます。 もはや沼というか深淵を覗いている気分です。
Docker とは?
![container_ship_and_docker.png](/img/ja/blog/220220/container_ship_and_docker.png)
コンテナ船というのをご存知ですか? コンテナという大きな箱を大量に積んで輸送する船のことです。 海外から物資を輸出入する際に使用されていたりします。 数百、数千、数万とある大量の物資を1つ1つ数えて管理するのではなく、コンテナという大きな箱の単位でまとめて管理することで、物資の管理が容易になるのです。 コンテナは輸送の途中で開けられませんし、大きくて重くて目立ちますから、誰かが輸送中の物資をこっそり盗んで数が合わなくなるなんてことも発生しないんだそうです。 コンテナが正しく輸送できていれば、その中身もまた正しく輸送できているということですね。
Docker のアイコンを見てください。何かに似ているとは思いませんか? そうです。コンテナ船です。 Docker は仮想化技術を用いて、アプリケーションの実行環境を1つのコンテナのように管理してくれます。 これはつまり、アプリケーションの実行環境を手軽にまるごと入れ替えたりすることができるということです。 便利だとは思いませんか?
コンテナとは?
Docker におけるコンテナとは、アプリケーションの実行環境のことです。 もっと詳しく言えば、ホストマシン上の他の全てのプロセスから分離された(つまり、サンドボックス化された)プロセスのことです。 1つ1つのコンテナ(プロセス)は分離されているため、他に影響を与えません。 分離されているからこそ、入れ替えたりすることができるのですね。 コンテナは、コンテナイメージから作成されます。
コンテナイメージとは?
コンテナイメージは、アプリケーションの実行環境のスナップショットのようなものです。 アプリケーションの実行に必要な全てのもの(全ての依存関係、構成、スクリプト、バイナリなど)が含まれています。
実は、Docker のコンテナはコンテナだけで動作しているわけではなく、コンテナイメージと組み合わさって動作しています。 ファイルシステムなどもコンテナ側にあるのではなく、コンテナイメージ側にあったりします。 これはどういうことかというと、コンテナイメージこそが本体であり、コンテナはコンテナイメージに対する差分でしかないということです。 コンテナを作成する際に、コンテナイメージをまるごとコピーしていたのではストレージの容量を大量に使用してしまいますから、 そうならないようにコンテナは差分だけを管理しているというような形になっています。
このような形になっているおかげで、コンテナを作成したり削除したりするのがとても気軽にできるようになっています。 なんたって差分しかないのですから。 コンテナが簡単に作成できるということは、それはすなわち同じアプリケーションの実行環境が簡単に作成できるということです。
そして、コンテナイメージもまた差分を積み重ねた階層構造(レイヤー構造)で作られています。 そのため、Docker はファイルシステムに、ユニオン・ファイル・システム(UnionFS)という特殊なレイヤー構造をしたファイルシステムを使用しています。 コンテナイメージを Docker Hub(後述)などからダウンロードしたりする際も、この差分(レイヤー)単位でダウンロードされたりします。 少し難しい話ですが、Docker のドキュメントにはこういった話も出てくるので、このことを覚えておくとすんなり理解できると思います。
![layer.png](/img/ja/blog/220220/layer.png)
Docker Desktop のインストール
難しい話ばかりしていてもあれなので、早速ですがインストールしてみましょう。 百聞は一見に如かずです。
Docker Desktop のインストーラーをダウンロード
Docker を動かすには、Docker Desktop が必要です。 公式サイトから Docker Desktop のインストーラーをダウンロードしてインストールします。
![download.png](/img/ja/blog/220220/download.png)
基本的にインストーラーの指示に従っていけば問題ないと思います。 途中で設定画面が表示されますが、基本的にデフォルトで問題ありません。 Docker Desktop のバックエンドには、WSL2 と Hyper-V を使用したものがあるのですが、 WSL2 の方がパフォーマンス的に優れています。
![installer_config.png](/img/ja/blog/220220/installer_config.png)
Windows 起動時に自動で Docker Desktop が起動しないようにする
デフォルトでは、Windows が起動すると自動で Docker Desktop も起動する設定になっています。 とはいえ、それだと困る人もいるのではないでしょうか。
設定を変更するには、ヘッダーの右上の歯車ボタンをクリックして Settings 画面を開き、 「General」の「Start Docker Desktop when you log in」のチェックを外して、「Apply & Restart」ボタンをクリックします。
![start_when_you_log_in.png](/img/ja/blog/220220/start_when_you_log_in.png)
Docker Hub とは?
![docker_and_docker_hub.png](/img/ja/blog/220220/docker_and_docker_hub.png)
Docker Hub はコンテナイメージの置き場(レジストリ)です。 Docker がコンテナ船だとすれば、Docker Hub はさしずめコンテナヤードといった感じでしょうか。
Docker Hub には大量のコンテナイメージがアップロードされています。 Docker でコンテナを作成する際は、Docker Hub にアップロードされているコンテナイメージがダウンロードされて使用されます。
![docker_hub.png](/img/ja/blog/220220/docker_hub.png)
Docker ID
Docker Hub のアカウント(Docker ID)は必須ではありませんが、 Docker Hub にコンテナイメージをアップロードしたい場合は Docker ID が必要になります。 必要であれば「Sign up」より作成してください。 Docker Hub にコンテナイメージをアップロードしない場合は不要です。
Docker IDでログインする
Docker Hub にコンテナイメージをアップロードしたい場合は、Docker ID でのログインが必要になります。 Docker Hub にコンテナイメージをアップロードしない場合は不要ですので、このセクションは読み飛ばしても問題ありません。
Docker ID でログインするには、Docker Desktop から行う方法と、コマンドで行う方法の2種類があります。
Docker Desktop でログインする
Docker Desktop でログインするには、ヘッダーの右上の「Sign in」をクリックします。
![sign_in.png](/img/ja/blog/220220/sign_in.png)
コマンドでログインする
コマンドでログインするには、docker login
コマンドを使用します。
このコマンドを実行すると、認証情報を聞かれるので入力します。
ログインしないと docker image push
のような Docker ID が必要なコマンドが使用できませんが、
それ以外の認証が不要なコマンドはログインしなくても問題なく使用できます。
Docker ID(ユーザー名)を先に指定するには、-u
オプションを使用します。
docker login
docker login -u test-user
コマンドでログアウトする
コマンドでログアウトするには、docker logout
コマンドを使用します。
docker logout
参考サイト
- Orientation and setup | Docker Documentation
- What is a Container? | App Containerization | Docker
- Install Docker Desktop on Windows | Docker Documentation
- Docker 概要 — Docker-docs-ja 19.03 ドキュメント
- Part 1:概要説明とセットアップ — Docker-docs-ja 20.10 ドキュメント
- イメージ、コンテナ、ストレージ・ドライバについて — Docker-docs-ja 19.03 ドキュメント
- UnionFS - Wikipedia
- docker login | Docker Documentation
- docker logout | Docker Documentation