dockerに入門してみる(その1)

普段はAndroidとQAの勉強をしている。
まだその2分野も初心者だけど、7月くらいから自分でJenkinsでCI/CD環境を作りたいと思って着手できていなかったから、息抜きも兼ねて入門してみる。

前にDesktop版を入れたときにTutorialを少しやったような気もするけど、改めて「docker tutorial」で調べてみた。 www.docker.com 公式で、もう少し詳しめのTutorialがあるらしい。

案内に従って、さっそくWindowsPowershellからdocker run -dp 80:80 docker/getting-startedを打ってみた。

C:\Users\530lo> docker run -d -p 80:80 docker/getting-started
Unable to find image 'docker/getting-started:latest' locally
latest: Pulling from docker/getting-started
188c0c94c7c5: Pull complete                                                                                             617561f33ec6: Pull complete                                                                                             7d856acdaa9c: Pull complete                                                                                             a0d3c6e28e6d: Pull complete                                                                                             af69a9b963c8: Pull complete                                                                                             0739f3815ad8: Pull complete                                                                                             7c7b75d0baf8: Pull complete                                                                                             Digest: sha256:......

何かを引っ張ってきたらしい。そのままhttp://localhost/を開くと、"Getting Started"というタイトルのそれっぽい画面が表示された。

f:id:renkataoka:20201215223415p:plain
docker_tutorial_localhost
さっそく、今打ったばかりのコマンドについて解説がある。

-d : デタッチモードでコンテナを実行します。
-p 80:80 : ホストPCのport80とコンテナのport80を結びつけます
docker/getting-started : 使用するイメージです。

つまり、docker/getting-startedというイメージをデタッチモードで実行し、そのとき用いるポートはホストとコンテナともに80番を指定している。ということらしい。
ちなみに、-d-pといったオプションは組み合わせることができ、docker run -dp 80:80 docker/getting-startedといった書き方もできるそう。

ホストPCのポート指定は分かるけど、コンテナのポートって何だろう。
と思ったら、その下に"What is a container?"パラグラフがあった。

コンテナとは、ホストマシンの他プロセスから独立した、ホストマシン上の1つのプロセスです。この分離は、Linuxで長年利用されてきた機能であるkernel namespaces and cgroupsを利用して実現されています。

medium.com ホストPC内の1つのプロセスを使用して、仮想環境を作っている…という理解で良さそう。プロセスが仮想環境になる、凄い。
つまり、「コンテナのポート」は「仮想環境のポート」ということですね。

ついでに、コンテナイメージについても説明されている。

コンテナを実行しているとき、そのコンテナは独立したファイルシステムを使っています。このカスタムファイルシステムを提供するのがコンテナイメージです。
イメージはコンテナのファイルシステムを含むため、dependenciesやconfigurationなどアプリケーションの実行に必要な全ての要素を含んでいなければなりません。
そのほかにも、環境変数やデフォルトで実行するべきコマンドなどのコンテナのための設定情報も含んでいます。

引き合いに出されているchrootには詳しくないけど、コンテナを構築するために必要な全てがコンテナイメージに入っていて、独立性も保てるからスゴイ!ということみたい。

まだ序盤も序盤しか触っていないけど、「docker便利」をやっと認識できてきた気がする。