こちらの記事では1からDockerについて理解するための初学者向けの内容を扱っていきます。
##Dockerとは
DockerとはDocker社が提供する**「コンテナ型仮想化技術」**です。
Dockerは従来の仮想化に比べて別のOSを立ち上げる必要がないため軽い動作を実現できたり、その仮想環境を他の開発者と共有できたりと開発者にとっては欠かせない技術と言えるでしょう。
これらのメリットについて以下で深掘りしていきます。
##コンテナ型仮想化技術
まず仮想化とは、簡単に言うとパソコンの中でパソコン(仮想環境)を立ち上げるということです。
イメージとしては下記の図を参照して下さい。
<従来の仮想化>

<コンテナ型仮想化>

###コンテナ型仮想化による実行環境の共有
ほとんどの場合開発は複数人で行います。プログラムコードの共有には、Gitというバージョン管理の仕組みが使用され、自分の書いたプログラムコードをチームで共有するGithubやBitbucketなどのサービスがあります。しかし、プログラムコードを共有したとしても実行環境が異なれば、コードが正常に動作しません。Dockerはプログラムの実行環境を管理するための仕組みで、それを共有するための仕組みとしてDockerHubなどのサービスがあります。実行環境を共有できるという点はDockerの最大の利点と言えるでしょう。
##イメージとは
・実行環境を構築するための設計書みたいなもので、オブジェクト指向でいうとクラスだと認識するのが解りやすいでしょう。
・Registry(DockerHub)を使って共有が可能で、既にほとんどの実行環境の構築のための設計書(イメージ)が配布されています。
・以下のコマンドによって、テキストファイル(dockerfile)からイメージを作成することができます。
$ docker build [Docerfileのパス]
##コンテナとは
・イメージという設計書から実際に構築された実行環境のことをいいます。こちらはオブジェクト指向でいうとインスタンスです。
・Dockerfile→イメージ→コンテナという流れ
・原則1コンテナ1アプリを公式から推奨されています。(データベースを扱うアプリであれば、データベースとアプリのコンテナにそれぞれ分けること)
・起動時のコマンド(EntryPoint)が終わると自動で終了します。
・実行時のコマンドでいろんな設定ができます。
○環境変数(osが定義している変数)
○ホスト側に解放するポート
○コンテナ同士をつなぐネットワークの設定 etc
・$ Docker run
or $ Docker start
で起動
実際にコマンドで起動と設定してみる
$ Docker run nginx
↑これだけで実際にNginx(webサーバー)のコンテナを起動できます。
Dockerしかインストールしていないにも関わらずこのコマンドだけで恐ろしいほど簡単にWebサーバーが立ち上がってしまう…
-v
オプションで設定ファイルやHTMLファイルをマウントすればそれだけで思い通りに動かせる
-p 80:80
(左の80=ホスト側、右の80=Docker側を表す)とすれば80番ポートで外部に公開される
##Docker Composeはとても便利
これまでに説明したbuild
run
start
やその他のコマンドをさらに簡略化できるようになります。
・yamlファイル(設定用に使用されるファイル)一つで複数コンテナを定義することが可能。
・環境変数やポートの設定がyaml形式で書くことが可能。
・ネットワークの設定が自動で楽。
以上の理由から、特別な状況でない限りは使用するのがオススメ。
Docker Compose見本(yamlファイル)↓
version:"3"
services:
reserse-proxy:
image:nginx
volumes:
./config:/etc/nginx/nginx.conf.d #相対パス使用ok
ports:
"80:80"
restart:always#再起動しても自動で起動してくれる
web-server:
image:nginx
volumes:
./docs:/user/share/nginx/html
#二つのコンテナは同じネットワークに繋がる
#しかも"web-server"などで名前解決ができる(=ipアドレス調べる必要なし)
また後々Dockerについて深掘りした記事出したいなと思ってます。