はじめに
みなさんはどんなときにdockerを使っていますか?
わたしはdockerを初めて知ったとき、マシン間での環境の差異をなくすというメリットが一番でかいと思って使っていました。
それで思ったことが、もともとローカルで環境を作って開発したあと、その環境をdockerに移行してdockerで動かすことにあまりメリットがないのではということです。
もしかしたら、当たり前だろ。と思った人もいるかもしれませんが、ここでは私がそう考えた理由と経緯をだらだらと書いていきます。
Dockerのメリット
一度整理しておくと、Dockerを使うメリットとしてよく挙げられるのは以下のようなものでしょう。
-
環境の一貫性と分離:
「私のマシンでは動くけど、他のマシンでは動かない」問題を解決する。 -
効率的なリソース利用:
同じハードウェア上でより多くのアプリケーションを実行できる。 -
継続的インテグレーションとデプロイメント:
自動テストやデプロイメントプロセスの一部として使用することができる。 -
バージョン管理と再現性:
特定のバージョンのイメージを再利用することで、過去の状態を再現できる。
最初の開発環境で変わる
一番重要なのはここで、最初に構築した開発環境がローカルマシンかdockerコンテナかによってメリットが左右されると思っています。Dockerで構築した場合、#Dockerのメリットであげたものの全てを持っていますが、ローカルだとどう変わるのでしょうか?
環境の一貫性と分離
「私のマシンでは動くけど、他のマシンでは動かない」問題を解決する。ローカルから移行する場合はもとのファイルがローカルマシンにないと動かないので(COPYとか使うんでしょ?どうせ)、結局ソースを渡してからイメージを作る流れになります。
効率的なリソース利用
同じハードウェア上でより多くのアプリケーションを実行できる。これはローカル移行の唯一のメリットだと思います。例えばフロントとバックで異なるサーバーを持つ場合、別々に動かすことなくコンテナを同時に起動することができます。
継続的インテグレーションとデプロイメント
自動テストやデプロイメントプロセスの一部として使用することができる。自動テストはいいとして、デプロイメントプロセスとしては少し問題がある場合があると思います。例えば、複数のサーバー間でやりとりをするアプリケーションの場合、#効率的なリソース利用のおかげで同時に起動することはできます。ただし、デプロイする場合は複数のコンテナを一つのサーバーに公開することはできない(はず)なので、結局コンテナを分離する必要があるのです。テスト稼働にだけメリットがあるといえるでしょう。
バージョン管理と再現性
特定のバージョンのイメージを再利用することで、過去の状態を再現できる。これはどちらの場合にも適応できますが、ローカルに環境があるならgitで管理する方が手間が少ない気がします。バージョンごとにいちいちコンテナを作っているだけで時間がかかります。
まとめると
- 結局ソースを渡すことになる
- ローカルで開発できるならそれでいい
- 結局サーバーは分けないといけないから、サーバー数が少なければ、テストはローカルで十分
- バージョン管理はgitでいいでしょ。コンテナ作ってたらキリがない
こういう経緯でで、ローカル環境をdockerへ移行すること...いえ、ローカルに環境をつくることに愚かさを覚えました。開発する前にdockerを使うならdocker、ローカルでやるならローカルと開発環境を決めてプロジェクトを推進することに大切さを感じました。
勝手に完結しましたが、わたしの勝手な解釈もあるはずなので、プロフェッショナルな方はコメントで暴露していただけるとありがたいです。ここまで愚痴を読んでくださりありがとうございました。