Dockerとは?【初学者向けメリット、デメリットについてまとめてみました】

Dockerとは?【初学者向けメリット、デメリットについてまとめてみました】

どうもこんにちはkoheiです。

2年前ほど前から実際に参加したプロジェクトでDockerを使ってきました。

今回はある程度の知見ができたのでDockerについて書きたいと思います。

 

Dockerってよく聞くけどどういうもの?

従来の仮想化技術と何が違うの?

 

そんな初学者向けの記事になります。

Dockerを使うことになった理由

以前、はじめてDockerを使ったときの記事を書きました。

以下の記事です。

気になる方はぜひ読んでみてください。

【Docker】Dockerを使うことになった経緯

Dockerとは

Linuxコンテナ技術を利用したコンテナ型の仮想化環境を提供するオープンソースソフトウェアです。

Dockerを使うことによって様々なメリットが存在しますが、今回は以下3つのメリットについて説明します。

【メリット①】リソース消費を抑えられる

従来の完全仮想化環境(以下ではVMと記載)と比較するとリソース消費を最小限に抑えられるメリットがあります。

VMでは仮想化マシンをインストールし、その仮想化マシン上でゲストOSを更にインストールする必要があります。

一方、Dockerの仮想化環境はホストOSを分割するような技術なので、Dokcerをインストールする必要はありますが、VMのようにゲストOSをインストールする必要がなくなるのでその分リソース消費を抑えられます。

つまり、Dockerは複数のコンテナを起動したところでホストOSのプロセスを使います。

なので、コンテナ内に存在するプロセスはコンテナ内で動かしたいアプリケーションに必要なプロセスのみ存在することになります。

コンテナと言われている由良だと思いますが、コンテナ同士がホストOSのリソースを共有し、外から影響を受けない(独立した)環境をつくることができます。

リソース消費量比較!

大体以下のような感じだと思います。

従来の仮想化技術:ホストOS + 仮想化マシン + (ゲストOS+アプリケーション) × 仮想化環境数

Dockerによる仮想化技術:ホストOS + Docker+ アプリケーション × 仮想化環境数

Dokcer自体も軽量な印象なので、リソース消費の差が一目瞭然だと思います。

【メリット②】Dockerの環境は使い捨てが可能

2つ目のメリットはDockerのコンテナ環境は使い捨て可能です。

そもそもDocker自体が使い捨て前提で作られているといっても過言ではありません。

理由は今流行のDevOpsで使われている技術であることが答えになっているかと思います。

つまり、

infrastructure as code=インフラのコード化

を実現した技術がDockerだからです。

従来はインフラ環境を構築するためには手順が存在し、手動で構築する必要がありました。

一方。Dockerではインフラをコードとして書くことで、自動でインフラ構築を可能にしてます。

よって、誰しもが経験したことがある「開発してたら環境を壊してしまった」という絶望的な状況であってもコマンド1つで環境を捨てることができ、コマンド一つで環境を作成することができます。

もっとインフラのコード化について知りたい方!

インフラの自動化については、DevOpsで使われているAnsibleについて書いた以下の記事でメリットを詳しく書いてます。

気になる方は確認してみてください。

Ansibleを現役エンジニアが使用してみた感想(Dockerとの使い分けも解説!)

【メリット③】開発に集中できる(インフラと開発を明確に分割できる)

3つ目のメリットは、メリット②と関連した内容になります。

・Dockerはコマンド1つでインフラ環境を構築できるので、手動で構築するのと比べると爆速です。

・開発者によって環境が異なることを防ぎます。

よって、開発者は開発環境を構築することを意識する必要がありません。※これが一番のメリットだと思ってます。

「Dokcerでインフラ構築(インフラをコードで記述)する人」と「開発する人」を明確に分けることができるので、各々が自分の作業に集中することができますし、余計な工数を消費するのを防ぐこともできます。

動作環境

2020年1月現在、以下のプラットフォーム(上記で言うホストOS)で利用可能です。

  1. Ubuntu
  2. Debian
  3. Red Hat Enterprise Linux
  4. CentOS
  5. Fedora
  6. Oracle Linux
  7. SUSE Linux Enterprise Server
  8. Microsoft Windows Server 2016
  9. Microsoft Windows 10
  10. macOS
  11. Microsoft Azure
  12. Amazon Web Services

種類(エディション)

以下、2種類のエディションがあります。

  1. コミュニティ版(CE; Community Edition)→stable(安定版)とedge(エッジ)が存在。
  2. エンタープライズ版(EE; Enterprise Edition)→BasicとStandardとAdvancedが存在。

私はOSがRed Hat Enterprise Linuxに限られた環境で開発をしていたので、エンタープライズ版を使ってました。

要確認事項!

以下の内容は公式ページで確認したほうがいいです。

  • ホストOSによって使えるエディションが異なります。
  • コミュニティ版とエンタープライズ版のBasicとStandardとAdvancedそれぞれで使える機能が違います。

いいことばかり?デメリットってあるのか

今まで書いてきた内容はDockerについてのメリットばかりを書いてきました。

よく言われていることではありますが、デメリットは以下です。

【デメリット①】同一のOSを共有する

同一のOSを利用するので、使うOSごとの動作検証(テスト)が必要です。

【デメリット②】WindowsOSだと100%Dockerの良さが発揮できない

一部のWindowsOSだとVirtual Box(仮想マシン)上にDockerを立ち上げる必要があります。

このVirtual Box(仮想マシン)上に動作するDockerコンテナはVirtual Box(仮想マシン)上で動作するゲストOSを共有します。

これはOSを共有するのでDockerの利点を使えてますが、「Virtual Box(仮想マシン)+ゲストOS」の分だけリソースが追加で必要になるので、100%Dockerの利点を使えきれてないです。

結論:Dockerは使うべし!

メリット、デメリットについて書いてきましたが、私が思うにメリットが大きすぎるのもあって積極的に使われるべき技術だと思いますし、使われていく技術であると思います。

とにかくDockerは速い。。これだけで使うメリットはあるかと思います。

昨今、自動化技術の進歩が著しいと思いますし、時代の流れに合わせていくと、Dockerは必須なスキルかと思います。

余談

2,3年前まではDockerを使うというと、テストもしくは開発環境のリソース削減を目的とした使い方が多かった印象ですが、近年はDockerを本番環境で使う場合が増えてきた気がします。

ユーチューバーのケンタさんの動画で知ったkubernetes(詳しくはわかりませんがDockerクラスタ管理ツールだそう)についても勉強してみたいななんて思っています。

また、最近契約更新のタイミングだったので登録している派遣とフリーランスエージェントの方々と今後について面談しました。

フロントエンドの技術が単価が高いみたいで、スキルにあると差別化できるみたいです。

ほとんど未知の領域ですが少しづつ勉強していこうと思ってます。

 

人気記事:Docker学習におすすめの本5選【初心者向け入門書~実践向けまで】