こんにちは、FUUです。
最近では、複数の開発案件や自分で開発を行う際にDocker環境を使っています。
しかし、Dockerfileを書くときに苦労したり、思い通りにコンテナが立ち上がらなかったりと毎日奮闘中。
それだけならいいんですけど、コンテナ同士が干渉しあって本業の環境にまで影響したら大変。
そこで、もう一度Dockerの基本を学ぶためにDockerをサラッと学び直しました。
・そもそもDockerとは何?
・Dockerのメリットは何?
と思っている人にはピッタリの内容だと思います。
それでは早速ヒュイゴ。
Dockerの正体は何?
「dockerは軽い」とか「コンテナ」とか、色々と言われていますが、「結局何なの?」と思っている人もいるでしょう。
そんな方へ、dockerの便利さを活かしてもらうために、dockerの特徴をお伝えします!
Dockerは「隔離」するためのもの
Dockerの大きな特徴は「隔離」するという概念です。
私たちが色んなサービスと使うには、
WEBを表示するためにはWEBサーバー、メールを使うためにはメールサーバー(今回はSMTPやPOPをまとめてメールサーバーと呼ぶことにします)など、用途に合わせたサーバーが必要です。
開発をしない人は意識しないかもしれませんが、私たちが普段使っているPCやサーバーの中には色んなサーバーが入っています。
ちなみに、サーバーって何かというとここでの意味では専用ソフトを言います。
メールを使いたいならメールサーバー用ソフトを、データベースを使いたいならデータベース用ソフトウェアをインストールして使います。
Dockerはこのサーバーを1個ずつ隔離することができます。
この1個のサーバーの区切りを「コンテナ」と言います。
「コンテナ」が倉庫とか部屋とか言われているのは、Dockerの隔離して使う概念から来ているのですねぇ。
Dockerは半分だけ仮想環境
Dockerと言うと、「仮想環境」と思うかも知れませんが、正確には半分正解で半分不正解です。
仮想環境とは、PCの中にもう1個PC環境を作って、その中にサーバーをインストールしていくようなもの。
例えば、MAMPとかXAMPの場合は、最初からOS+Apache(WEBサーバー)+MySQL(データベースサーバー)が入っている仮想環境です。
そのため、ソフトウェアをインストールするだけでPCの中にもう1個PCの環境ができるという訳です。
Dockerも使う時には
・ソフトウェアをインストール
・使いたいサーバーのイメージを取得する
と言う使い方をしますが、MAMPやXAMPのようにPCを丸っと1個作るようなやり方ではありません。
どこが違うかと言うと、イメージとOSの使い方が違ってきます。
Dockerの最大の特徴は「イメージ」と「OSの使い方」
Dockerを語る上で「イメージ」と言う仕組みはかなり重要です。
「イメージ」とは、Dockerを動かしたり、共有したりするときに使う原料のようなものです。
お菓子を作る時の型番を想像すると良いかもしれません。
「じゃあ、イメージだけでプログラム動くじゃん!」と思いきや。
プログラムで実行を命令しても、OSを通さないと実行されません。
ーーーーちょっとここでOSの説明、OSが分かる人はスキップして下さいねーーーーーー
OSの仕事をざっくり言うと、プログラムからの命令をハードウェア(PC)でも実行できるように詳しく翻訳してハードウェアに伝えることです。
実はプログラムからの命令って「だいたいこんなことをやって欲しいな」みたいなざっくりしたもの。
他のプログラムとの兼ね合いだったり、細かい命令は出しません。
それでも、ハードウェアが実行できるなら問題ないのですが、ハードウェアは言われたことを言われた分だけやるもの。
「だいたいこんなことをやって」と言われても「?」となってしまいます。
それを、仲介してくれるのがOSです。
OSは実行する順番や実行に使う容量、を細かくハードウェアが分かる言語に翻訳してハードウェアに命令します。
さらに、言うとOSは「周辺機器(ディストリビューション)」と「カーネル」に分かれています。
それぞれ役割があり、
・周辺機器(ディストリビューション)=プログラムの指令をカーネルに伝える
・カーネル=周辺機器(ディストリビューション)から受けた指示を実行する
と言う処理をそれぞれ行います。
つまり、どっちが欠けていてもOSとして成りたりません。
・「とにかくOSなしではプログラムは動かない」
・OSは「周辺機器(ディストリビューション)とカーネルに分かれている」
この2つを覚えておいて下さい。
ーーーーーーOSの説明終わりです。ーーーーーーー
「じゃあイメージにはOSも入っている!」と言いたいところですが、そうでもないんです、、、。ややこしいですね。
実は、イメージの中には「OSの周辺機器(ディストリビューション)」が入っています。
じゃあ、カーネルは?というと、カーネルはDockerをインストールした私たちのPCで使います。
たまに、「DockerはOSに依存するデメリットがある」と言う噂を聞きますが、この仕組みがあるためです。
しかし、このような仕組みになったのには理由があります。
次の章でこのDockerを使うことでのメリット、デメリットをご紹介します!
Dockerのメリットとデメリット
ここまでDockerの仕組みを解説しました。
では、なぜDockerはこのような仕組みなのでしょうか?
これには、メリットがあるからです!
これからDockerのメリットとデメリットを解説します。
Dockerのメリット①:カーネルが無いので軽い
Dockerの最大のメリットと言えば開発環境の軽さでしょう。
vagrantなどの仮想環境を使っている人は特にその速さを実感できるかもしれません。
その理由は、先ほど説明したOSの仕組みです。
Dockerのイメージの中にはOSの周辺機器のみが入っていてカーネルは入っていません。
そのため、Dockerの中に複数イメージを作ってもカーネルは増えないので、PC内の使う容量は比較的少なく済みます。
Dockerのメリット②:共有しやすい
チームで開発する時など、Dockerの共有のしやすさは役に立ちます。
DockerはDockerHubからイメージを取得して、サーバーを構築していきます。
この作業をDockerfileとdocker-compose.ymlファイルに書いて、ファイルを共有することによって複数の人がDockerで開発環境を構築できます。
他にファイルで設定を共有して開発環境を構築できるソフトウェアもありますが、Dockerは比較的簡単にファイルを設定できます。
そのため、ここ数年でDockerを使う制作会社は増えてきたと思います。
Dockerのメリット③:作成、削除、更新が簡単
先ほども言ったように、DockerのイメージはDockerhubからダウンロードするだけです。
さらに、不要の場合は削除も簡単にできます。
そして、もしも設定を更新する場合(結構スキルがある人がいいかもしれません)もDockerのファイル類を共有するだけです。
これって、チーム内で別アプリケーションを作る時に、開発環境の試作を作るときなどにかなり役立ちます。
ダメだったら消して、更新して、適切なイメージを共有する。
開発環境のPDDAをより早く回すことができます。
Dockerのデメリット①:イメージが溜まりやすい
これは人によりますが、Dockerのイメージの管理を怠るとすぐに不要なイメージが溜まります。
何度も言いますが、Dockerのイメージを作るのは結構簡単です。
でも、その分不要なイメージもすぐにできます。
「これ作ったけど結局いらないな」とか「今はこのイメージは使わないな」というイメージが溜まりがちです、、、。
Dockerは軽いと言っても、不要なイメージが溜まり続けると結果Dockerは重くなります。
Dockerを運用するには基本「使わないイメージは消す」運用をしましょう。
Dockerのデメリット②:Dockerを使うにはLinuxが必要
DockerはPCのカーネルを使うと言いましたが、Dockerが使えるOSはLinux限定です。
しかし、「PCにLinuxをインストールしていないとDockerが使えない」と言う訳ではありません。
Windows用、Mac用のDockerをインストールすることによって、Dockerは使えるようになります。
しかし、Windows用とMac用ではイメージを共有して開発する時に、エラーが発生する場合があります。
ここはエラーを調べながら対応する必要があるため、開発仲間と話し合いながら開発を進めましょう。
Dockerを運用する時に気を付けること
いくら使いやすいDockerでも、運用する時には注意が必要です。
私自身、Dockerは開発メインで使っているため、Dockerで開発する時に的を絞ってご紹介します。
Dockerのイメージはこまめに消す
Dockerは複数持てると言えど、いらないイメージが溜まると、不要なイメージで容量を使います。
また、立ち上げも遅くなるためDockerの良いところを消してしまいます。
Dockerの良いところは作成と削除が簡単にできること、更新よりも削除→作成を意識しましょう。
Windowsの場合はHyper-Vとの兼ね合いも考える
例えば、WindowsのPCを使っている人でHyper-Vにすでに仮想環境を割り当てる場合は、Dockerの実行スピードは極端に遅くなります、、、。
特にVirtualBoxなどの仮想環境とは相性が悪い気がしますね。
Dockerの最新版ではこの問題は解消されていると言われていますが、Windowsユーザーではないので確証はありません。
先にVirtualBoxなどの仮想環境を使っている人は、Docker環境が遅くなる可能性もあることを頭の隅に入れておきましょう。
Dockerを活かすにはOSがキーになっていることを理解する
正直、サーバーをあたかも隔離しているように振る舞う仮想環境はDocker以外にもあります。
しかし、Dockerの軽さや扱いやすさを実現しているのは「イメージ」と言う仕組みです。
そして、このイメージを活かすにはOSの理解が重要です。
しかし、開発環境を構築したり、共有した環境を使ったりする時には、このOSの役割はほとんど理解せずに使うことができるでしょう。
だからこそ、Dockerで予想外のエラー発生時や運用を考える時には、DockerとOSとの関係を知っておくことが重要だと感じました。
自分もまだまだ勉強します!
最後まで読んでいただきありがとうございました!
コメント