本記事の対象
- dockerを始めたいけど、dockerとはすら知らないかた、始めたけど、内容が多すぎてとりあえずどこまで把握すれば仕事中にまぁまぁ困らないのか分からない人。
- たくさんの記事を見てきましたが、よくイメージ、コンテナなど紹介される。んんんんん、意味わからない
なぜDocker使う?
簡単に環境構築できる素晴らしい技術
上記の言葉よく見かけませんか?じゃ、今までDocker使わなくても、何が不便だったの?環境構築って環境できて、手順に沿って出来るし、大規模だってansibleあるし。何が簡単だ?
という疑惑を持ってる方いらっしゃいますか?
製品の開発において当然環境最低でも二つ必要でしょ、テスト環境と本番環境(呼び方色々)、開発者も決して一人ではないですね。協力会社や派遣のメンバーを取り入れてチーム作って、少なくても3、4人がいるでしょう。
え?自分の環境には動いたのにね
この言葉よく聞きますね。はい、自分の環境には走ってるけど、本番環境には使えない。
その環境問題を解決するために費やしてきた時間が恐ろしかった。
環境構築は実に時間がかかり、下手したら最初からやり直すことも少なくありません。
以前、委託先から開発済みのjarかwarをもらって、運用チームはそこから必要な環境構築し(Mysql、ES、JDK、Rediasの環境)、搭載する流れになってました。もし環境とjarを全部まとめてもらってそのまま搭載するならだいぶ楽になりますね。
それを解決してくれたのはDockerだ!
ソースコードjar-----ソースと環境を一緒にパッケージング(イメージ)-----倉庫に入れる-----使う時にダウンロードしrunする
というイメージです。
Dockerの歴史
Dockerがない時代にはVMという仮想マシンが多く使われた、2010年エンジニア何人が dotcloud
という会社が設立し、仮想型コンテナソフトが業務のメインだった、経営は厳しくなり、その後オープンソースに変え、たくさんのエンジニアが参加できて、2014年Ver1.0リリースし、大ヒットになった。今もむしろエンジニアにとって必須なスキルになるぐらい需要になってる。
Dockerの勉強
Go言語に基づいて開発されたオープンソース、勉強するのに以下の二点は不可欠。
- ドキュメント
https://docs.docker.com/
ESと違って、公式のドキュメント読んでも意味わからない、dockerの公式ドキュメントはかなり充実してる。
- 倉庫
https://hub.docker.com/
ソースと環境パッケージしたもの
Docker何が出来る?(VMとDockerの違い)
正直私よく下の図が理解できませんでした。ハイパーバイサーなんてもホストもうまく理解できませんでした。
↑の図を飛ばします。
簡単に言いますと、例えば、アプリケーション5個、かつお互いに隔離な環境が必要とします。
仮想マシンの場合には物理のPC上に仮想マシンを5台作って、当然カーネルも5個を作らなきゃいけないですね。メモリやストレージも5台分用意しますね。たとえプロセスが発生しなくても、用意する必要があります。
Dockerの場合には物理のPC上にカーネル一個しか作らない、5個であろうか、何個であろうか、みんな共有してこのカーネルを使うことにする。ストレージやメモリの消耗は使う時だけ発生し、起動に所用な時間が少ないです。
DevOpsに対するメリット
Dev(開発者)とOps(運用者)が協力し合い、ソフトウェアを開発する行動です。
Dockerを使うことで開発に大きなメリットがあります。
- より効率的にリリース出来る
今までソースコードもらって、環境構築ドキュメント読んで、実行して、調整するなどな面倒な作業がなくなって、ただイメージを倉庫からダウンロードしてきて、ワンクリックでリリースできちゃいます。
- 製品の拡張にもっと便利
以前例えば、Mysql Ver9.0 ,tomcat 8, redis 5 の環境があります。
tomcatをバージョンアップしたい場合、他もバージョンアップしなきゃいけない、またバージョンアップの後テストもしなきゃいけない。
今は Mysql Ver9.0 ,tomcat 8, redis 5 というまとめたパッケージがあります。それをバージョンアップする際に、その出来上がったパッケージをダウンロードすれば良い。
- 自分のPCには動いてたのに を解決
すべての環境が全く同じのため、自分の環境では問題なく動いた、他は動いてない問題を解決する。
- カーネルの最大利用
Dockerは各アプリの実行環境は同じカーネルを共有するため、最大限でカーネルを利用できて、メモリやストレージの消耗も極力に少ない