docker
kubernetes
docker-compose
aidemy
AidemyDay 1

Dockerで簡易版Aidemyをつくってみよう (その1) ~全体構成とDockerのセットアップ~

はじめに

 今日からアイデミーの初のアドベントカレンダーを投稿していきます!よろしくお願いします!
 僕の担当回ではアイデミーのインフラを紹介し、実際に 簡易版のAidemy を5回に分けて作成して行きたいと思います。今回はその1回目にあたります。
できるだけつまずかないように記述するつもりですが、何か不明点があれば教えてください。

今回の目標

 今回はアイデミーのインフラ構成と構成に密接に関わるDockerについて紹介し、
Dockerの環境を構築することを目標にします。

インフラ構成

 今年(2018年)の5月に弊社のインフラ構成についてのブログを公開しました。
こちらで紹介した インフラ構成図 を以下に掲載します。



2018年5月の執筆当時は、作成予定のインフラ構成図でしたが、6月末頃から実際にほぼこの構成で運用しています。
それぞれのインフラについては、上のブログで紹介していますのでご一読ください。
今回はこのインフラ構成と密接に関わるDockerについて紹介していきます。

Dockerとは

 Dockerの日本語版ドキュメントによると、以下のように説明されています。

Docker とは、開発者やシステム管理者が、アプリケーションの開発、移動、実行するためのプラットフォームです。
Docker は部品(コンポーネント)から迅速にアプリケーションを組み立てるため、コードの移動による摩擦を無くします。
Docker はコードのテストやプロダクション(本番環境)に対する迅速な展開をもたらします。

... 説明を読んだだけではよくわかりません。。。

ここでは、Dockerの重要な要素である Docker ContainerDocker Image について紹介します。
さらに、実行時に用いる Docker Compose についても紹介します。

Docker Container

以下に、Docker Containerの図を示します。

通常PCなどのホストマシン(デバイス)上で動くアプリケーションは、ホストマシンの環境に依存しています。
例えば、Windows用に作られたアプリケーションは、Windows環境下では動作しますが、MacやLinux環境下だと動かないということが起きてしまいます。
また同じOSなのに、特定のモジュールをインストールしていなかったり、バージョンが揃っていないために動作しない場合もあります。
しかし、Docker Containerはホストマシンのカーネルを共有して、プロセスやユーザから切り離して環境を構築するため、ホストマシンのOSに依存せず同様に動作することができます。
これにより開発者間で環境を揃える必要がなくなり、開発そのものに時間を割くことができます。

Docker Image

Docker Image は、公式ドキュメントには以下のように書かれています。

Docker Imageは コンテナ の元です。
イメージとはルート・ファイルシステムに対する変更を並べ集めたもので、コンテナを実行する間に使われる実行パラメータに相当します。
典型的なイメージはユニオン・ファイル・システムの層(スタック)がお互いに積み重なっています。イメージは状態を保持せず、変更もできません。

上の説明にあるように、Docker ImageDocker Containerを作る元になります。
Docker Imageさえ共有できれば、 それを持つ全員が同じDocker Containerを作ることができます。
また、あるDocker Imageを元にDocker Containerの中身に変更を加えて新しいDocker Imageを作ることもできます。
さらに、Dockerfileというファイルを利用すると、

ある Docker Image を引っ張ってきて特定の変更を加え、新たな Docker Image を作成する

という作業を自動で行うことができます。

Docker Imageを共有するサービスにDocker Hubがあります。
基本的に無料で公開しているので、会員登録さえすれば様々なDocker Imageを利用することができます。

また、チーム内でプライベートにDocker Imageを管理したい場合は、Container Registoryというサービスを利用します。
弊社でもContainer Registoryを利用していて、インフラ構成図の中央下部に記載しています。
インフラ構成図にあるkubernetesというサービスは、Container RegistoryからDocker Imageを引っ張ってきて、Docker Containerを作成して利用しています。

Docker Compose

Docker Composeは、公式ドキュメントには以下のように書かれています。

Compose とは、複数のコンテナを使う Docker アプリケーションを、定義・実行するツールです。
Compose はアプリケーションのサービスの設定に、Compose ファイルを使います。
そして、コマンドを1つ実行するだけで、設定した全てのサービスを作成・起動します。

上で説明されているように、Docker ComposeとはDockerの定義/実行を行うツールです。
ComposeファイルにDockerfileを指定したり、起動するポート番号などを指定すると、コマンド一つでDocker Imageの作成や起動ができます。

Docker の環境構築

今回は、DockerDocker Composeのインストールを行います。
環境構築については、他の方が丁寧に説明されているのでその記事の紹介をさせていただきます。

Dockerのインストール

Dockerをインストールできたら、
以下のコマンドで正しくインストールされているか確認して下さい。
僕の場合は以下のような出力になりました。

$ docker version
Client:
 Version:           18.06.1-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        e68fc7a
 Built:             Tue Aug 21 17:21:31 2018
 OS/Arch:           darwin/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.1-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       e68fc7a
  Built:            Tue Aug 21 17:29:02 2018
  OS/Arch:          linux/amd64
  Experimental:     true

Docker Composeのインストール

Docker Composeのインストールについては、以下の記事を参考にしてください。
https://qiita.com/zembutsu/items/dd2209a663cae37dfa81

Docker Composeをインストールできたら、
以下のコマンドで正しくインストールされているか確認して下さい。
僕の場合は以下のような出力になりました。

$ docker-compose --version
docker-compose version 1.22.0, build f46880f

今回は以上になります。
次回以降実際にサービスを作って行きましょう!