インフラ

【Docker】コンテナ仮想化って知ってるの?知らないよね?

dockerってなんだ

あなたは『Docker』使えるの?

ちなみに僕は使えません。

『Docker』っていったい何?

『Docker』をざっくり知りたい!

こっそり『Docker』デビューしたい!

こんな僕と同じ悩みをお持ちのあなたに、僕なりの理解をアウトプットします。

たわしむし
たわしむし
インフラの話は眠たくなるわ。
ユウキ
ユウキ
どうも、ユウキです。
「Docker」とは?的な内容とメリット、デメリットそれと僕なりの感想をまとめたらか読んでみてください。

概要を解説してるだけで、実際のチュートリアル的な要素はありません。

その代わり参考になりそうなサイトと、書籍のリンクを最後に貼ってます。

docker概要

Dockerはこのコンテナ仮想化を核としたアプリケーションのためのオープンプラットフォームである。環境およびアプリケーションをDockerイメージとしてバンドルし、DockerエンジンによりDockerコンテナとして配備・実行できる。Linux・Windows・Macすべてに対応したDockerエンジンは開発・テスト・本番・デバッグなど様々な状況で容易かつ高速なアプリケーション配備・実行を可能にする。またDockerイメージのレジストリ登録・Dockerイメージに基づいた派生イメージ生成・差分管理による派生イメージの低容量化により、容易な独自イメージ生成と高速/低負荷なコンテナ生成が可能になる。かつ標準仕様化を含むDockerソフトウェアのコンポーネント化により、コンテナ仮想化レベル自体の制御を含む独自コンテナ仮想化システムが構築可能になっている。このようにDockerは広範なアプリケーション開発のためのプラットフォームとして現在では機能している。
引用元:https://ja.wikipedia.org/wiki/Docker

仮想化環境

Docker仮想イメージ

引用元:https://docs.docker.com/get-started/ ※←コンテナ、→ハイパーバイザー

Windowsマシン上に、Linuxを動作させてテスト環境を作ったりするのが僕の中ではイメージしやすい仮想化環境。

この場合は、PCを丸ごと動かすイメージで、ハイパーバイザーを使う「VirtualBox」や「Virtual PC」などがあり、現在もよく使う。

Dockerも仮想化を実現する仕組みで、たとえば「Nginx」だけが仮想化されててDocker経由で簡単に環境を作ることができる。

他にも公式サイトには「MySQL」「Postgres」「Apache」などアプリケーションはもちろん、「Ruby」「PHP」などランタイムもDockerのイメージとして利用できる。

Dockerが動けば、これらのアプリケーションのインストールせずに動かすことができちゃう。

イメージとコンテナ

Dockerは公式アイコンのクジラの上に箱が乗ってるアイコンになっていて、まさしくそのまんまの機能を提供する。

コンテナ型仮想化といわれる技術を利用し、1サービス1コンテナを基本として1つのPC上(OS)で複数起動することができる。

Dockerさえ動く環境であれば、他の依存関係は考慮なくコンテナを動すことが可能ってことですね。

なので、Ruby、Rails、Nginx、Unicoon、Postgresのイメージを使ってそれぞれのコンテナを動かして(連携の設定はもちろんいるけど)あげるだけで、Railsが動く環境ができあがる。

また、起動したコンテナから独自のイメージを作成することができるのも特徴的な点。

1つのイメージさえあれば、複数のコンテナを起動することも可能。

DockerHub

DockerHub

さらに、Dockerを便利にしているのが、DockerHub(https://hub.docker.com/)クラウドのリポジトリサービス。

Docker公式がサービスを提供していて、オープンソースのアプリケーションはだいたい公式が各Dockerイメージを用意してくれている。

自由にダウンロードして使うことを可能にしているのがDockerが便利な理由。

また、「公式イメージ取得→コンテナ起動&変更→オリジナルイメージ作成」とすることも可能で、公開リポジトリ(だれでもみれる)でよければ無料でアップロードすることもできる。

  • STEP1
    公式イメージ取得
  • STEP2
    コンテナ起動&変更
  • STEP3
    オリジナルイメージ作成
  • STEP4
    DockerHubにアップロード

有料プランを利用すれば、プライベートリポジトリも利用できる。

DockerHubを使えばアプリケーションを手軽に持ち運びすることが可能なのでアプリケーションのポータビリティ性が高い。

例えば、社内環境で新人用に新しいテスト環境を作成しないといけない場合、いままでは毎回手順書にしたがってアプリをインストールしてたけど、DockerHubを利用してオリジナルイメージをアップロードしておけば、簡単にテスト環境を再現することが可能になる。

ちなみに、DockerHubはGitHubと連携することが可能です。

GitHubについてはこちらの記事で触れてます。

Gitについて
「Git・GitHub・GitLab」SVN信者が勉強がてらまとめてみた!「Git」「GitHub」「GitLab」についてまとめてます。SVNから移行したくなりました!...

プロセスとして稼働

ここが僕自身理解するのに(したつもり。。)苦労した仕組みの部分です。

コンテナ内は実行環境として独立しているただのプロセスである。

つまり、一番特徴的なのがDockerイメージ自体はステートレス(揮発性)なので、イメージから作成したコンテナを削除してしまうとデータは消えてしまう。

例えば、PostgresはDockerで動かすことはできるけど、あくまでホストマシン上のプロセスとして動くので、データを登録しても更新しても削除しても、コンテナが動いている間(コンテナを削除してない状態)だけその値は保持されるってこと。

この点はデータファイルをホスト側にマウントする機能を利用することで、ステートフル(永続性)なサービスとして利用することができる。

例えば、Postgresコンテナなら、データファイルをホストとマウントして使う。

Tomcatコンテナなら、webappsディレクトリやログディレクトリをホストとマウントして使う。

ただ、テストで動かすだけのときは、使い捨てで利用できるので、ステートレスがいい面でもあったりする。

動作環境

DockerはもともとLinuxで動作していたが、現在はWindows、Mac上でも動作することができる。

だけど、アーキテクチャ(CPU)によっては動かないとこがあるらしいので、Dockerが動く環境であれば環境に依存しないといわれている。

たわしむし
たわしむし
セール対象外以外、全部セールですみたいなやつやん!

dockerのデメリット

Dockerデメリット

Dockerのデメリットを3つ挙げてみました。

  • 1サービス1コンテナなので粒度が増し構成は複雑になる
  • 学習コスト
  • 無理してDockerを導入する必要はない

1サービス1コンテナなので粒度が増し構成は複雑になる

ホストまたは仮想OSにそのままアプリケーションをインストールした場合と比べると、どうしても構成は複雑になる。

まあ、理解できてしまえば大したことないかもしれないけど、Dockerが1つ挟まることは違いないわけで。

たとえば、Tomcatのセッション情報を共有するセッションレプリケーション機能とか元々ややこしいのに、Dockerで複数コンテナ運用したときどうしたらいいのとか。

学習コスト

結局、学習して理解して使いこなせるまでリソース使うよね。

そもそも使いこなさないとだめな業務に携わることがあるのか。

ちなみにDockerを理解するとインフラ周りをもっと色々知りたくなちゃいます。

知らないことが色々見えてきちゃうんで、覚悟して学習しないといけなさそう。

僕にとってはモダンな技術なのは間違いなくて、同じような方には好奇心がモチベーションとしてあるのであればインフラ(AWSかGCP)も合わせて学習するといい。

てことで、学習コストはどうしてもかかっちゃう。

無理してdockerを導入する必要はない

デメリットってわけではないですが、現状動いてるシステムを無理やりDockerを使った仕組みにするほどすべてのシステムにメリットがあるわけではないので、導入にはちゃんと検討が必要。

またセキュリティの問題もある。

DockerHubには公式のDockerイメージが用意されているが、それをそのまま信じて動かしていいのか。

公式以外のDockerイメージはなにが入ってるかわからないので、仕事として利用する場合は注意が必要。(てゆうか、使うのはまずい。)

dockerのメリット

Dockerのメリット

Dockerのメリットを4つ挙げてみました。

  • 再現性とポータビリティ
  • デプロイとロールバック
  • スケールアウトの自動化を助長
  • 使えるとなんかできる奴っぽい

再現性とポータビリティ

Dockerイメージだけでアプリケーションを再現することができる、このお手軽さがまず第一にある。

もちろん、Dockerのコードを理解して使えないといけないが、いままでインストール作業を行っていた(環境によってエラーが出たりするやつ)のを、Dockerさえ動けば同じDockerイメージで再現できる。

特に、テスト環境でAWSとかばりばりに使ってて、テスト毎に環境を用意しないといけない場合とか、Dockerがあるとすぐ環境を用意できて時間の節約になる。

Docker自体がアーキテクチャ(CPU)によっては動かないとこがあるが、Dockerが動く環境であれば環境に依存せず、再現性が高い。

ポータビリティはDockerHubを使った運用で、Dockerイメージを実質どこからでも入手可能である。

デプロイとロールバック

開発環境で用意したDockerイメージをDockerHubにアップしておけば、簡単に本番環境にアプリケーションをデプロイすることが可能になる。

バージョンアップにともなる更新リリース作業とかなら、デプロイ時にトラブルがおきても、前のDockerイメージを利用してアプリケーション戻す(ロールバック)ことも容易な点もある。

スケールアウトの自動化を助長

インフラによりますが例えば、AWSやGCPの環境なら、知識さえあればスケールアウトの自動化にも対応できる。

ロードバランス環境でTomcatを複数起動できる状態にしているなら、負荷が指定値を超えれば追加でTomcatコンテナを稼働させることも可能になる。

正直この辺はついていけないけど、いい点なので上げておく。

使えるとなんかできる奴っぽい

これが一番のメリットだよね。

つまり使いこなせると錯覚資産になる

Docker使いこなせるってことは、Linuxはもちろん、AWSの知識等も持ち合わせている「なんかできる奴」になれる。

錯覚資産については、ふろむだ氏の書籍が面白いのでぜひ読んでみて!

ユウキ
ユウキ
Dockerをきっかけにインフラまわりの勉強しようと思ったもんね。
手始めに、Udemyによさげなのがあるので勉強しようと思う。

ゼロからはじめる Dockerによるアプリケーション実行環境構築

Udemyは初めて利用する新規割引がアクセスしてから24時間以内は80%前後値引きされているので急いで!っていうのはうそで、ブラウザのキャッシュを消すか、シークレットモードで開きなおせば割引された状態になるので定価で購入しないようにしましょう!

まとめ:dockerは使うべきなのか

まとめ

「Docker」僕の中ではモダンな仕組みなのでキラキラしてまぶしい。

社内で開発環境を横展開するときだけでみると、一度準備すれば開発環境の再現をすぐ構築できるのでメリットは大きいと感じる。

ただし、本番環境の特性上、長期でミドルウェアの変更が必要ないのであれば(入れ替える時は別案件扱い等)、特に導入する必要はない。

とはいえ「Docker」をきっかけにインフラの知識を一緒に学習するのはいいことなので、この機会にいっしょに学んじゃいましょう。

dockerのおすすめ書籍

どちらもKindle本だけど、安くて入門にはもってこい。

Dockerを基本から学ぶ: Dockerの基本を手を動かしながら学びAWS ECSでサービスを構築する

Dockerのことが全くわからず現場で肩身の狭い思いをしているプログラマー向けの本

dockerおすすめサイト

基本的にQiita(https://qiita.com/)で検索するとたくさんでてくる。
Docker入門 #2 【Dockerチュートリアル】

一番シンプルなのがとほほ
http://www.tohoho-web.com/docker/index.html

Docker公式は英語だけどGoogleで日本語に翻訳してみればわかる。
https://docs.docker.com/

ユウキ
ユウキ
では、この辺でおわります。
ユウキでした。