Dockerのヤバさを再認識

  • 03 January 2022
Post image

 前回の記事に引き続き近年の大前提ツールであるDockerについての説明。この記事は初心者プログラマ、上達できない人向けの記事だ。なのでGitやDockerについて詳しい人は読む必要がない。
 なお前回の記事と同じく、Dockerが存在しなかった時代の不便な実体験を紹介して、その利便性を伝えられたらと思う。今やみんなが当たり前のように使っているDocker。考えてみるとやっぱこいつはプログラミング界の歴史を変えたヤバいツールってことがわかる。


Dockerインストール

 Windowsの場合、Windows Proのみね。Proにアップグレードするのはそれほど高くないので検討してみて。

PowerShellで
docker -v
> Docker version 20.10.7, build f0df350 # すでにDockerがインストールされています。
もしnot foundが出たら、

以下の公式インストーラでインストール

https://docs.docker.jp/docker-for-windows/install.html

Tarminalで
docker -v
> Docker version 20.10.7, build f0df350 # すでにDockerがインストールされています。
もしnot foundが出たら、

以下の公式インストーラでインストール

https://docs.docker.com/desktop/mac/install/

 Dockerとは何か?という単純な知識についてはググってね。ざっくり言うと、Dockerはコンテナ仮想化を用いたアプリケーション環境構築ツールだ。よっしゃ。とりあえずググってみて。


Dockerを使いだしたのはいつごろか?

 Docker自体は2013年から存在するらしい。また、コンテナ技術に関してはGoogleがさらに前から社内で使っていた?とのこと。しかしDockerが一部のエンジニアの間で使われだしたのはおそらく2015年~2016年ごろ、一般に使われだしたのは、おそらく2018年ごろと認識している。というのも私は2016年ごろにはじめてDockerを使いだしたが、そのとき周りのシステム会社でDockerを知っている会社は1つもなかった。また、Dockerのことを書いている技術ブログや書籍もそれほど多くなかった記憶がある。しかし2018年ごろになるとみんながGitを当たり前に使うようにDockerを使い始めていたのだ。

 なのでDockerがなかった時代ってのはごく最近で、そのときの環境は手に取るように思い出せる。その時の失敗や不便がゆえの事故みたいなのを紹介する。


入社日に環境構築で丸一日

 何年も前の話だが、あるアプリ制作会社に転職した。その入社日初日に支給PCのローカルに、APIサーバーの環境を作るように言われた。確かCakePhp1か2によるWebAPIで、DBサーバーはMariaDBだった。当時人気だったVirtualBoxという仮想システム構築方法を知っていたが、その会社では、ローカルにそのまま必要なミドルウェアをインストールして環境を作ってほしいと言われた。

 これは結構大変な作業になった。php5.x、MariaDBx.xをインストールして、しかもサーバー上のiniファイルやconfと同じ設定にしてみたいな泥臭いことをやり、さらにMAMP?とかいう糞みたいなアプリケーションでWebサーバー起動するみたいな。いろいろやって丸1日かかったんだよね。ローカルでもサーバーでも環境構築ってのはよくハマるし、結構大変な作業なわけだ。

 ところがDockerでは、一般的にDockerfileに環境を作成する情報がすべて書かれていて、buildコマンドを1発打つだけで誰でも簡単に必要な仮想環境を構築することができる。私が丸一日かかったCakePHP環境は、Dockerなら5分以内に完了することでしょう。しかもGitリポジトリにこのDockerfileを含めることができるので、簡単に全ての参加者に共有することができるもの素晴らしい。


Dockerを知ったかして実は使ってなかった奴

 これは比較的最近(2017年くらい)のことなんだけど、チームでDockerを利用して開発を進めていて、そのDockerイメージの中にMySQL5.6のイメージが含まれていた。つまりこのプロジェクトでは全員がMySQL5.6を使用して開発を進めていたわけ。そこに外部のフリーランスエンジニアがチームに加わった。彼は前髪の長めのきゃしゃで声高めの子で、 全然かっこよくないクラウド(FF7) って感じの子だった。

「Dockerって知ってますか?」

クラウド君「あ、もちろん知ってます。(ビンボーユスリ)」

「使ったことはありますか?」

クラウド君「自分、いつもドッカーっすね。」

「じゃあDockerfileはリポジトリに含まれているのでそれ使って●●の実装お願いします」

–後日–

「クラウドさんのコミットしたマイグレーションが上手く通らないんだけど?」

クラウド君「最近のMySQLのJSON型を知らないんスカ?便利っすよ。」

「。。(だめだこりゃ)」

 細かいバージョンは覚えてないけど、こんなことがあった。クラウド君は完全にDockerを"知ったか"して使っているふりして、実は自分のローカルPCにインストールされたMYSQLサーバーを使って開発していたってこと。そのせいでチーム全員の環境とズレが生じてみんなの環境が正常に動作しなくなったって話だ。

 これもみんながDockerを使っていればほぼ起こらないことだ。だってDockerによってOSやミドルウェアは同一のものを担保できるからね。(厳密には全く同じものではなかったりするが)


ビッチみたく汚れたローカル環境

 NodeJSやPythonの案件を多くこなしていたころ、それぞれの案件でNodeJSやPythonのバージョンが異なることが通常だった。で、通常ローカルには1つのバージョンのミドルウェアをインストールする。もちろん複数インストールすることは可能だけど、管理が難しくなる。そこで***“nodenv"や"pyenv”***というのをよく使っていた。
 “nodenv"や"pyenv"ってのは、例えば、ある時ははローカルののnodeのバージョンを6にしたり、ある時は8にしたりと、簡単に切り替えられるツールだ。つまりローカルに複数バージョンのミドルウェアをインストールして切り替えして管理できる便利なやつだ。

 しかしxxenvでは、ローカル環境がまるでビッチのあばずれみたいになってしまいがちだった。プロジェクトによって男をコロコロ切り替えるごとくさ。しかも切り替え忘れて開発を進めてしまったりもするの。あと、nodeとかpythonだけじゃなく、DotnetとかSQLサーバーとかそう簡単にバージョンを切り替えられないやつもあるから並行してインストールするとかもしてた。つまり俺のPCがいつのまにか汚れたビッチみたくなっちゃうってことよ。

 これもDockerなら完全に解決。プロジェクトごとにすべて分離されたあらゆる環境を定義できるし、また仮に、Dockerイメージが複数できていくことがビッチみたいだと思う人は、以下のコマンド1発で清楚な少女に戻すことができる。これはDockerに関するすべてのデータを削除するコマンドだが、当然再度Dockerビルドで簡単に復活できる。

docker prune system
# 清楚な少女に戻すコマンド

Dockerを本番サーバ環境で使っちゃう

 Docker以前の開発であるあるだったのが、ローカル開発環境をしっかり作って実装してテストもしっかりして、いざ本番サーバーにアップしたら正常に動かないことがあった。これはOSの違い、ミドルウェアの違い、その他設定の違いなど様々な原因があるが、完全に避けられなかった問題の一つだ。

 当初はDockerコンテナによる仮想環境ってローカルの開発環境構築を便利にするっていうツールだと思い込んでいた。しかし、これまた近年、AWSやGCPなどのクラウドサービスではDockerコンテナをそのまま本番環境として使うサービスが当たり前になってきている。つまり、ローカルでのDocker環境と(ほぼ)同じDocker環境を本番サーバー上で起動するって意味。これにより本番ではなぜか正常に動作しないっていう事故はかなり減った。ローカルと本番の環境差まで吸収してくれるとかどんだけ優秀なんだよDocker。


Dockerってやっぱヤバいよ!

 まとめると、環境構築が簡単Gitと相性が良いみんなの環境を揃えられるローカルPCのビッチ化を防げる本番環境にも使える、というメリットがある。
 当然Dockerにもデメリットというか理想論では語れない部分もあるのは事実だ。さっきから"同一の環境が作れる"って書いているけど、実はDockerがインストールされているOS(特にファイルシステム)やCPUのアーキテクチャによって挙動が異なるものがあったりするので、完全に同じではない。しかしそのような違いはほんの微々たるものであり、前述のメリットの方がはるかにデカいのは言うまでもない。だからこれだけ多くのプログラマがDockerを使っているのだろう。
 個人的に、DotnetなどのVisualStudioで開発すると便利なものは、Dockerを使わない方がよいと感じる。当然VSはDockerも使えるんだけど、開発効率はDocker無しの方が高くなるからだ。

 今回と前回でGitとDockerという避けて通れない2つを紹介してみた。細かい使い方はググって身につけていってほしい。この2つを使えないと正直プログラマとして仕事ができないってくらい必須ツールなんだから。

You May Also Like

Gitがなかった時代はみんな頭悪かった

Gitがなかった時代はみんな頭悪かった

 この記事は初心者プログラマ、上達できない人向けの記事だ。なのでGitやDockerについて詳しい人は読む必要がない。できる限り小難しいことは書かずにその特徴を書きたい。  プログラマをやっていく上で絶対に避けて通れないのが、GitとDockerだ。なぜこの2つをまとめて紹介してい …

リファクタリングが自分を成長させてくれる

リファクタリングが自分を成長させてくれる

 前回の記事では、どんな初心者でも「投票システム(フロント)」を実装できるっていうことを紹介したんだけど、当然ググってコピペ、そのコードをひたすらコピペで量産では、ごみコード(またの名をウンコード)になるのはいうまでもない。なので前回の状態からレビューをしてくれる架空の先輩エンジニ …