【開発環境構築①】Ruby on Rails & Nginx & MySQLの開発環境をDockerで構築!

こんにちは。ライフマップ開発チームの富山です。
今回はDockerで開発環境を作りながら、Dockerのことやその他技術のことも少しお話ししていこうと思います。


はじめに

この記事を読んだらタメになるのはこんな方

・分からないということ以外、何も分からない人
・Dockerを触ったことあるけど、コピペしてるからあんま分からん人

この記事を読むとこうなります

・現状
「コンテナ?仮想化…?イマイチわからん…」

・読了後の理想
「Dockerがどういう仕組みで動いてるのか概要は分かった!」

※今回はDockerの概要を説明するので、Dockerファイルなどの書き方は次回以降になります。
※Docker Desktopなどのインストールはここでは説明しません。

お約束

  1. 全部分からなくて良いというスタンスも時には大事。大局で考えればこの記事を読んだだけででも1つ成長。素晴らしい!

  2. 分からないなと思ったらちょっと調べてみる。分からないなと思った時は分かるようになるチャンスだと捉えましょう!(でも神経質に細かく調べなくても大丈夫)

本題

「Dockerって何?」「Dockerで開発環境をつくるってどういうこと?」

まずは公式の「Dockerとは」のご説明。分かるような分からないような…という感じですが、理解が進むとまさにこの説明通りだということがわかりますので、一旦「そういうものか」くらいで理解しておきましょう。

Docker はアプリケーションを開発(developing)、移動(shipping)、実行(running)するためのオープンなプラットフォームです。

Docker公式マニュアル

では、「Dockerで開発環境を作る」ということはどうでしょうか?
「自分のPCの中に仮想マシンを作るってことでしょ」と思っている方も多いかもしれませんが、実は違います。
Dockerの公式マニュアルを見てみましょう。

Docker は、コンテナ(container)という緩やかに隔離された環境 (isolated environment)で、アプリケーションのパッケージ化と実行をする機能を提供します。この分離と安全性により、実行するホスト上で多くのコンテナを同時に実行できます。コンテナは軽量であり、アプリケーションの実行に必要な全てが入っているため、ホスト上で今何をインストールしていようが関係ありません。作業中でも手軽にコンテナを共有できますので、あなたが共有したコンテナを得た全ての人が、同じコンテナを、同じ方法で、確実に動作できるようにします。
隔離された環境とは "isolated environment" の訳。隔離されて離された環境というよりも、部屋の中を仕切るようなイメージが近いです。

Docker公式マニュアル

「Dockerはコンテナ(container)という緩やかに隔離された環境を作り…」とあるように、「隔離環境(コンテナ)をつくることができる」というのがより正しい説明になるかと思います。
Dokcerはコンテナ型仮想化の技術を提供するオープンプラットフォームであり、従来の技術より軽量で扱いやすいことが特徴です。
この各コンテナ(隔離環境)は独立しており、お互いに影響しません。

重要さに気づくのはもう少し後ですが、これはおさえておきましょう!

コンテナ型仮想化っていうのは仮想マシンと違うの…?

ここまでで、「Dockerってのは隔離環境をつくるのね」という大まかな理解はできたのではないかと思います。
「じゃあ仮想マシンとの違いは何?」と思ったかもしれませんが、一番の大きな違いはゲストOSの有無になります。

コンテナーと仮想マシンは、非常に類似したリソース仮想化テクノロジーです。仮想化とは、RAM、CPU、ディスク、ネットワークなどのシステムの単一リソースを「仮想化」して、複数のリソースとして表現できるプロセスです。コンテナーと仮想マシンの重要な違いは、仮想マシンはハードウェア層まで含めたマシン全体を仮想化し、コンテナーはオペレーティング システム レベル以上のソフトウェア層のみを仮想化することです。

ATLASSIAN 「コンテナーと仮想マシンの比較」
ATLASSIAN 「コンテナーと仮想マシンの比較」より。左:仮想マシン、右:コンテナ

上記の図の通り、仮想マシンはそれぞれにゲストOSが必要になりますが、Dockerでは「Dockerエンジン」の上に各コンテナがあります。おかげでゲストOSの起動が不要になり、圧倒的に起動が早いのです。
「え、OSが含まれてないのにどうやって動くの?」と思うでしょうが、各コンテナがホストOS(Linuxカーネル)を利用することで動作しています。
※詳細は省きますが、カーネルとはOSの核となる部分なので、現状ではOS≒カーネルと思っても大丈夫です。しかし、厳密には違いますのでご注意を。

余談ですが、これがApple Sillicon(M1/M2)チップ搭載のMacで面倒な事態を引き起こす原因となります。
Intelチップのカーネルは「x86_64 Linux」ですがM1 Macなどは「aarch64 Linux」というカーネルが使われています。そのため、カーネルの違いが影響して、作成されるコンテナが微妙に違うものとなります。

Docker Engineって何?

ここまでの説明とその名前で何となく察しがつくかもしれませんが、DockerエンジンとはDockerの操作に必要な核となる部分です。主に3つの要素「Docker CLI」「REST API」「Dockerデーモン」で構成されています。

Docker公式マニュアル

・docker CLI
コマンドラインツールで、docker buildなどのコマンドを発行する

・REST API
docker CLIとdockerデーモンの橋渡し

・dockerデーモン
コマンドを処理し、イメージの作成などを各機能に命令する

上記の図と説明の通り、dockerデーモンとdocker CLIがREST APIでやり取りを行います。クライアントがサーバに要求を行い、サーバがそれに応答するクライアント・サーバ型構造ですね。
このDocker Engineがあればローカルマシンだけでなく、仮想マシンやクラウド環境でもコンテナが動かせるようになるというわけです。
ちなみにDockerエンジンはLinuxで動いていますので、Docker Desktopをインストールするとlinuxがついてくるのはこの為です。

開発環境をつくる!の前に、全体像の把握から

今回はタイトル通りrails、nginx、mysqlで、よくあるweb3層アーキテクチャの構成で考えていくことにします。
Web3層アーキテクチャとは、Webシステムの構成要素を「プレゼンテーション層」「アプリケーション層」「データ層」の3層に分割して考える設計のことを言います。
今回は…
・プレゼンテーション層=webサーバ(nginx担当)
・アプリケーション層=アプリケーションサーバ(rails担当)
・データ層=データベースサーバ(mysql担当)

としましょう。
まず初めの全体像としては以下のような感じです。
この全体像を中心に理解が進んでいくと楽になりますので、この構成を頭に入れておいてください。この図に少しずつ知識を足していく感じになりますので、最終的にどこまで知識を増やせるか楽しみながらやりましょう。

今回の全体像

今回は3つのコンテナ(隔離環境)をつくるということになりますね。

赤枠の部分が3つのコンテナ(隔離環境)

公式サイト

・本家サイトは英語ですが読みやすいです
https://docs.docker.com/get-started/overview/

・日本語版は少し更新が遅いですが、興味があれば覗いてみてください
(有志で翻訳してくれている方々に感謝)

ここだけ覚えておいてほしい

・Dockerは仮想マシンを作っているのではない。隔離環境(コンテナ)を作っている。
・OSはホストOSに依存する

今回はDockerってそもそもどういう技術なのか、どのような構成で動いているのかということをお話ししました。「Dockerがどういう仕組みで動いてるのか概要は分かった!」と思っていただければ幸いです。

次回はコンテナやイメージを具体的に解説していきます!

この記事が気に入ったらサポートをしてみませんか?