🐋

Dockerはただの仮想環境じゃないアプリケーションそのものだ

2021/11/09に公開

Dockerはただの仮想環境じゃないアプリケーションそのものだ

記事の背景

今までDockerのことを仮想環境を構築するための技術として捉えてたけど、
イメージを作ってアプリケーションそのものを作る技術だと理解して一気に視野が広がった気がする。
これがパラダイムシフトってやつか!!ってなって興奮しているのでポエムとしてまとめています。

この思考の切り替わりについて、なるべく言語化して自分と同じようなDockerに対するモヤモヤを抱えていた人の役に立てば嬉しい。

本題

ちょうど昨日までの私はDockerをただの仮想環境としてしか捉えていなかった。つまり、よく使うライブラリやフレームワークがバージョンが固定された状態で格納された環境のテンプレートであるイメージを元にして、コンテナという仮想環境を元の環境に左右されずに立てることができて、その中で動作確認や作業をすれば、環境の違いによるエラーの発生や挙動の食い違いなどが生まれなくて便利に開発できる。これがDockerを使うことのメリットなんだと理解していた。
だから、イメージの中にソースコードを埋め込んで、イメージ(コンテナ)自体をアプリケーションそのものとして使うという発想があまりピンときていなかった。
もちろん、FargateとかCloudRunなどのフルマネージドコンテナサービスが何やってるのかも具体的にイメージできていなかったし、DockerHubなどのイメージレジストリサービスの有効性もよくわかっていなかった。
もっと言うと、イメージそのものも独自の仮想環境を作る時に出てくるゴミみたいなもので、ホスト環境の要領を圧迫するだけの無駄な存在とさえ思っていた節がある。

けど、この理解は全く違っていた。
完全にDocker初心者の考え方だった。
今朝自分の中でパラダイムシフトが起きて、上記のような考え方はガラッと変わった。
Docker中級者以上にとってはイメージこそがメインと製作物であって、コンテナこそ副次的な生産物なんじゃないかと思えるようになった。

ここでいう初心者とは、dockerコマンドやdocker-composeコマンドは理解していて既製品のDockerイメージやDockerfileは使いこなせるが、自分でDockerfile書いて、 DockerHubなどのレジストリにイメージを保存しておくことのメリットが腹落ちしていない人のことを言う。
中級者以上とは、Dockerfileをゴリゴリ書いて、レジストリにpushして、CI/CDの仕組みに組み込んだり、コンテナ実行サービス(CloudRunやFargateなど)を活用したり、Kubernetesなどを使いこなしている人のことを呼んでいる。

Dockerイメージこそが主たる製作物だと理解することこそDocker初心者から中級者へとステップアップする鍵なんだと思う。

Dockerはコンテナではなく、イメージがメイン。
だからこそ、「イメージレジストリサービスのプライベートレジストリにも需要がある」というのもめちゃくちゃその通りだと納得できた。なぜなら、ソースコードをイメージに含めてアプリケーションそのものを作るのであれば、非公開な状態でそれらを保存しておきたいのは当然だから。

初心者の時の自分はこう考えていた、実行環境に含めるのってフレームワークやライブラリくらいなんだからわざわざプライベートなレジストリなんて必要なくない? Dockerfileなんてライブラリやのインストール自動化するだけでしょ?(ソースコードやデータの保管にはバインドマウントを使う)

確かに、この考え方でも単なる軽量な、仮想環境としてDockerを使う分にはなんの支障もなかった。
けれど、本番環境での活用を考えると全然不十分だった。

今朝、自分の中で以上のようなパラダイムシフトがあったのだけどそのきっかけになったのが以下の本のこの一節を読んでいたことがきっかけだった。

Docker は単なる仮想環境ではなくアプリケーションのデプロイを意識したプロダクトになっています。
Docker が提供するメリットを十分に享受するためには、コマンドを実行するだけでアプリケーションが動作するような、アプリケーションがデプロイ済みの Docker イメージを準備しておく必要があります。
docker-paragraph

https://www.amazon.co.jp/dp/B07FY9NR5S/ref=cm_sw_r_oth_api_glt_624J04XV49D0PEVGP8GG?_encoding=UTF8&psc=1

何気ない一文なんだけど、まさに単なる仮想環境としてDockerを理解していた自分にとってはめちゃくちゃタメになる一文だった。

これからはバンバンイメージの中にソースコード組み込んでいって、Fargateとか CloudRunとかフルマネージドなサービスにデプロイするだけで動くようなイメージをバンバン作っていくことを目指したい。

以上まとめると

  • Dockerを単なる仮想環境だと理解している内は初心者
  • 中級者以上はアプリケーションそのものだと捉える
  • Docker使えば、デプロイするだけで動くアプリが気軽に作れるようになる
  • Dockerサイコー

Discussion