見出し画像

コンテナ開発って実際のところどうなの?

ここ1年ほど、実案件でAWSのECS(Fargate)を使って開発をしています。
たまに周りから「コンテナ開発ってどうなん?」という質問をもらったりするので、コンテナ開発の「すげー」ってところとか、「これはいけてない…」と思ったところを考察してみようと思います。

そもそも「コンテナ開発」って何?

「コンテナ開発」という単語でググってみましたが、この呼び方は俗称のようで、正式には「コンテナ型仮想技術を用いた開発手法」ということになります。

「コンテナ型仮想技術」は、従来の「ホスト型仮想化」や「ハイパーバイザ型仮想化」と異なり、その環境にゲストOSを立ち上げることなくミドルウェアなどのサーバー環境を整えることができる仕組みです。
これによりゲストOSに割かれていたリソースを使うことができるので、圧倒的に軽量に動作することが特徴です。

また、「コンテナ型仮想技術」では「コンテナイメージ」という「アプリケーション実行環境」が詰まった設計図のようなものを扱います。この「コンテナイメージ」を「コンテナ エンジン」という、「コンテナイメージ」から実際の環境「コンテナ」を構築する機構をつかって環境を構築していきます。

この「コンテナイメージ」を他のマシンにも共有して利用することで、複雑なアーキテクチャを用いた環境であってもそれを他のマシンで容易に再現することができるようになります。

これを実現できるプロダクトの代表がDockerであり、同様にコンテナを扱うことのできるサービスとして、AWSのECS(Fargate)やGCPのKubernetesがあったりします。

*この辺りの仕組みや、実際にDockerでできることなどについては以下の記事詳しいのでそちらを参照ください。
【図解】Dockerの全体像を理解する -前編-

この「コンテナイメージ」を開発者が使用するマシンの環境、開発サーバ、ステージングサーバ、本番サーバと共有して、同じ環境にしながら開発することを「コンテナ開発」と呼んでいます。

私とコンテナ開発との出会い

私がコンテナ型仮想技術を初めて知ったのは、Webエンジニアとして独立した2015年ころでした。当時はまだVirtualbox(ホスト型仮想化技術)を使っていて、自分の開発マシン(買ったばかりのMacbook Pro)の中にもう一つのOSを動かしていました。
ホストOSの上にゲストOSを動かして、さらにIDEを起動しながらブラウザで確認なんて作業をしていたのて、必然的にマイパソコンのメモリ&CPUのリソースを持っていかれ、動作がもっさりしながらも、それが当たり前だと思って開発をしていました。

そんな時に「従来のハイパーバイザ型の仮想化環境と異なる、新しい仮想化技術=コンテナを使ったサービスができました!Dockerです!」という感じで、そのニューウェーブの洗礼を受けました。
第一印象は「何を言っているのかわからん」だったんですが、何度も何度もビルドしようとしては怒られ、ネットワークをつなごうとしては怒られを繰り返しているうちに、なんとなくその輪郭が朧げながらに見えてきたような気がしていました。

そんな私の心をぽっきりと折ってくれたのが、Windows端末を持った友人の登場です。苦労して作成したDockerイメージを「使ってみて」と渡してみたところ、「全然使えん」とけんもほろろに言われました。
DockerはゲストOSを立ち上げずにそのマシンのOS環境を使用するので、OSが異なる端末ではコンテナ開発の大きな利点である「簡単に他のマシンで同じ環境を共有する」ができなかったのです。(注

『だったらVirtualboxを使ってWindows端末でMacOSのゲストOSを立ち上げてその中でDockerを使えばいいのでは!?』と思い立ったのですが「それなら最初からVirtualboxで作った方がいいじゃん」という身も蓋もない意見に打ちのめされ、しばらくはVirtualboxを使って開発する日々が続きました。

コンテナ開発への目覚め

そこからコンテナ開発が息を吹き返したのは、2017年にMicrosoft Azureが「Azure Container Service(AKS)」を発表し、Amazon Web Serviceが「Amazon Elastic Container Service for Kubernetes(Amazon EKS)」を発表したあたりからでした。

これまで主要クラウドプラットフォームではGoogleのGCPにあるKubernetesでのみコンテナサービスが展開されていましたが、これで3大プラットフォーム(AWS、GCP、Azure)でコンテナが使えるようになりました。

それまでは「簡単に他のマシンで同じ環境を共有する」程度の利用価値だったコンテナ技術が、「ローカルと各ステージのサーバーを簡単に同じ環境でつくることができる」という新しい価値を引っ提げて帰ってきたのです。

Amazon EKSなどのサービスが展開される前は、各ステージごとのEC2にDockerをいれて、コンテナイメージをアップロードして、コンテナを起動してといった作業を手動でおこなう必要がありました。これらのサービスを使用することことでそのあたりの手間がなくなるので、「コンテナ開発」の優位性がかなりが高まったと思います。

私もこの辺りで「使ってみたい!」という心持ちになったんですが、如何せん新しい技術で知見もなかったため、実際に案件で使うのはそれから少し経った2020年からになりました。

コンテナ開発をやって感じたメリット

「ローカルと各ステージのサーバーを全く同じ環境でつくることができる」
上記でも書いた通り、ローカルと各ステージの環境を簡単に同期できる技術は革新的でした。この利点だけでもコンテナ開発を行う意味があると思います。

「開発環境を一瞬で立ち上げられ、かつローカル環境をクリーンなまま保持できる」
新しい開発現場に入ると、まずはそのプロダクトの環境にあわせてローカルで環境構築することが最初の業務でした。以前はその作業に数日使うこともありましたが、コンテナ開発であれば一瞬で構築可能になります。
また、色々な開発案件を同時進行していると他のプロダクトで使用したミドルウェアが影響してプログラムがうまく動かないということもありましたが、コンテナ開発であれば他のプロダクトへの影響を抑えることができます。

「先達が作成した環境をもとに環境を作ることができる」
DockerHubなどのレジストリサービスや、開発ブログで紹介されているイメージファイルなどをもとに新しい環境を作ることができます。それらの環境をそのまま使うことはあまりないですが、それでも構築にかかる工数をかなり削減することが可能です。

「スケーラビリティのある環境を作りやすい」
これはAWSのFargateを使った上での感想になりますが、Fargateではコンテナイメージを使用したリソース管理が容易にできます。リソースがたりなくなったときに自動で新しいコンテナ(タスク)を作成して負荷分散をし、リソースがあまったら自動的にそのコンテナを削除してくれます。

コンテナ開発をやって感じたデメリット

「コンテナ開発の学習コストが高い」
これまで地道にサーバー構築をしていた身からすると、コンテナの概念は理解するために一定の時間がかかると思います。そのプロジェクトに参加するメンバーがある程度コンテナ開発についての理解があることが求められるため、開発経験の浅いメンバーが多いチームでは導入コストが高くなります。

「ローカルの環境を揃える必要がある」
上記でもすこし書きましたが、コンテナ型仮想技術ではホストOSをそのまま利用するため、開発者のOSが異なっているとその差異を埋める必要が出てきます。MacOSとWindowsOSが入り混じった現場で採用しようとすると、あっちでもこっちでもアラートが出てくるので、ある程度開発者の環境を揃えておいた方がやりやすくなります。
(注

「必ずしも一瞬で開発環境が立ち上がるわけではない」
上記メリットで書いたことと矛盾しますが、その端末の環境によっては簡単に立ち上がらないことがあります。典型的な例としては最近増えてきた「M1チップを搭載したMacbook」などで、なんの対策もしないでDockerを立ち上げるとうまく動きません。こういった部分の対応が必要になることもリスクとして考えておいたほうがいいです。

まとめ

おもったより長い記事になってしまいました。これまでコンテナ開発についてつらつらと書いてきましたが、結論として「これからのWeb開発で主流になっていく技術」だと私は思っています。

まだ技術として過渡期なので思いがけないエラーに出くわしたり、理解・習得するまでにある程度時間はかかったりしますが、そのデメリットを押しのけるだけのメリットがあります。今後多くの現場でとりいられるようになっていく技術だと思いますので、これからWeb開発に携わっていく、もしくはまだコンテナ開発に触れていないという方はぜひ一度触ってみてください。

それでは良い週末を。

注)
Dockerの知識について、基本的な部分が間違っていたので訂正します。
まずDockerではゲストOSを立ち上げずにホストOSで処理をする、という部分についてですが、DockerはLinuxOS上でしか起動することはできず、このホストOSは常にLinuxになるとのことでした。
なのでDockerを直接動かせないのはMacOS(Unix)もWindowsOSも同じで、DockerDesktopではLinuxOSを起動するための仮想化ツール(MacOSはHyperKit、WindowsOSならHyper-v)が必要とのことです。

ただ、私がWindowsOSだとまともに動かない!とおもっていたのにも理由があって、その辺りは今度また別の記事で書こうと思います。
参考: Dockerについて整理してみる/


この記事が気に入ったらサポートをしてみませんか?