勉強中の学生です。
centosでサーバー構築をしているのですが
Dockerで構築を行っていてふと疑問です
Dockerのサイトなどをみていて皆さん機能やパッケージごとにコンテナを構築してそれぞれを連携されているようですがコンテナを1つ立てて、そこに複数のパッケージを入れるのはあまり良くないのでしょうか?
例えば1つのコンテナにMySQLやアパッチ等をいれて実装するなど
Dockerについてまだ認識不足なところもあるので
なにかおかしい点が有りましたらご指摘いただけたら嬉しです
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
コンテナを1つ立てて、そこに複数のパッケージを入れるのはあまり良くないのでしょうか?
はい。
理由は、Dockerの恩恵を最大限に受けることができない
からです。
じゃあ、その恩恵って何なの?ってなりますよね。
それはEach container should have only one concernに書かれています。
ここでは主に水平方向スケーリングの容易性
、コンテナの再利用性
が挙げられています。
主に開発環境で利用想定であれば、特に後者のコンテナの再利用性なんかは重要になってくると思います。
例えば、アプリAの開発のためにMySQLとApacheを1コンテナで作成した場合、
急にアプリBをPostgreSQLとApacheで開発するぞってなって時にApacheコンテナの再利用性が失われますよね?
MySQLとApacheを別コンテナにしていれば、Apacheコンテナだけ流用できるわけです。
あと、個人的にはトラブルシューティングがしやすい
、パッチやアップグレードの影響を最小限にできる
等も大きな恩恵だと思っています。
投稿2018/04/24 08:13
総合スコア4258
0
正確にはパッケージごと、機能ごとではなく、プロセスごとです。
https://eng-entrance.com/linux-command-ps
http://gihyo.jp/admin/serial/01/linux_containers/0002
まあ、大体のケースでは「機能ごと」で捉えても弊害はないような気がします。
自分の端末でプロセスを確認するにはターミナル上でps
コマンドを実行します。
(Macの場合。WindowsならLinux仮想マシン上を起動する必要があります)。
Dockerでは「プロセスごとにコンテナを分ける」というのが模範的な作法(ベストプラクティス)とされています。
ただ、作法は絶対ではないので、コンテナに全てのプロセスを詰め込んで動かすことは可能です。
Linuxを軽くかじっていないと「そもそもプロセスって何?」となるので、Dockerを扱うにあたっては最低限のLinuxの知識が前提とされているように思います。
私もDockerがさっぱりわからなかったのですが『新しいLinuxの教科書』を読んでから大分楽になりました。
Dockerに入門するにはまずLinuxに入門することが遠回りなようで近道だと思っています。
投稿2018/04/24 05:39
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
そこに複数のパッケージを入れるのはあまり良くないのでしょうか?
YESかNOかで言えばその通りなのでYES。
結論から言えばDockerはオーバヘッドがほぼ無くてコンテナを沢山作れます。
じゃあPHPとMySQLはわざわざ同じコンテナで動かさなくても良いよねという文化なのです。
以下ちょっと詳細な解説
Dockerは大枠で見ればVirtualBOXと同じく仮想マシンを生成する技術です。
VirtualBOXでは1台のマシンに「MySQLやアパッチ等をいれて実装する」のが一般的ですね。
Dockerでも同様の事がしたくなりますが事情が異なります、
参考サイト: 今からでも間に合うDockerの基礎。コンテナとは何か、Dockerfileとは何か。Docker Meetup Tokyo #2
Dockerは別に仮想マシン(コンテナ)を何台立ち上げても(ローレベルでは)仮想マシンではないのでオーバーヘッドが殆どありません。
ポコポコとこれはApache(+PHP)専用マシン、MySQL専用マシンという風に機能毎にコンテナを作っても構いません。
例えばPHPは7.2.1の新しい構文を使いたいけど、
MySQLは枯れてる方が嬉しいから5.6使おう…みたいな選択も簡単に出来るわけですね。
各サーバソフトはDcokerHubというサイトでバージョン別に管理されてますので、
特殊なモジュールを導入しない限りはDockerHubから落として使うだけで事足ります。
VirtualBOXはCPUから切り出した仮想CPU、メモリから切り出した仮想メモリ、という風にホストマシンから様々な機能を切り出して専有します。
その切り出した能力を集めて1台の仮想マシンを作るので非常にコストが重く低速であり、ホストマシンにも多大な負荷をかけてしまいます。
Dockerと同じようにApacheで1台、MySQLで1台という構成は不可能ではありませんが、
重いIDEやブラウザとセットで利用する場合はそれなりに高性能なスペックのマシンが要求されます。
従って、実際の開発環境構築時は1台だけ立ち上げて、
その1台にシステムを構築する全てのソフトウェアをぶち込む設計が一般的でしょう。
投稿2018/04/24 05:28
編集2018/04/24 09:16総合スコア21194
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/24 09:01
0
マイクロサービスとかをキーワードにして検索してみてはいかがでしょう。
開発環境の閉じ込めなら全部突っ込んでもいいかも。
これは1つの機能ということに分類されるかもしれませんが。
https://github.com/Kaggle/docker-python/blob/master/Dockerfile
投稿2018/04/24 09:58
総合スコア8562
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
良い悪いではなく、
分けることにメリットがあっても
分けないことにメリットがありません。
例えば1つのコンテナにMySQLやアパッチ等をいれて実装するなど
これって開発に限った話をしていますか?
開発に限った話であれば、dockerの恩恵はあまり大きくないかと思います。
(開発環境構築という話であれば大きいですが、1人での開発なると。。。)
ホストOSにそのまま環境作ったほうが簡単です。
(以下、dockerに限った話ではありませんが)
一般的なシステムは、apacheやdatabaseなどでサーバを分けて運用されています。
なおかつ正副の2台構成だったりします。
運用視点で、簡単な理由のいくつかとして、
・どれか1つのサーバが落ちた場合も障害の影響を最小限にするため
・障害の切り分け(調査)を早くするため
・復旧までの時間を最短にするため
などが挙げられます。
基本的にシステムは作ることより
どれだけ安定して運用できるかが重要になります。
こういったことを考えると、
1つのコンテナに全部入れてしまうとメリットが感じられません。
投稿2018/04/24 08:16
総合スコア1400
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。