Dockerの細かな原理は詳しくわかってないですが、Dockerの機能をある程度カバーしつつ、最終的にコンテナを複数組み合わせた何かを作ってみようと思います。今回はDockerの概要・仕組みに留めておきますが、次回以降、Dockerfile・docker-composeを活用して、サーバーの分割やディレクトリ共有などを記載していきます。多分このシリーズを全部読めばDockerが何なのかわかると思います(多分)。 #目次 [1.Dockerの概要](#1-概要) [2.仕組み](#2-仕組み) [3.次回以降の実装について](#3-次回以降の実装について) #1.概要 ###1.1 Dockerってなに?? Dockerを理解するにあたって、重要なのは イメージ(image) と コンテナ(container) の概念です。一言で言って仕舞えばコンテナは一つのコンピュータみたいなものです。そしてそのコンピュータはイメージという設計書に従い、Docker Engineによって貴方のPC上で作成されます。すなわち仮想化を意味しており、Dockerについて調べておられるならこの画像を目にしていると思います。一つ一つのコンテナはカーネルを共有しつつも、カーネル技術によって独立性が維持されます。これを「隔離された環境(isolated environment)」と言うそうです。
- どのPCでもすぐに同じ実行環境が生成できる [Docker Hub](https://hub.docker.com/) にはたくさんのイメージが公開されています。例えば授業で「生徒全員にこれを実行して欲しい。でも環境構築がめんどくさいし、それだけで授業が終わる!!」と教授が思った時、imageをみんなに共有すれば、コンテナ上に環境を展開できます(Dockerを入れてもらう必要がありますが、、)。
- サーバ・データベースなど使い道によってコンテナを分ければ、再利用性が上がる! 一方はサーバ、他方はデータベースのようにプロセス毎にコンテナを分けることで、別のアプリケーションにプロセスを流用しやすくなります。これもオブジェクト指向って感じですね。
- (後述する)docker-compose, Dockerfileを使えば、イメージからコンテナの作成まで、何個でも一瞬でできちゃう docker-composeでは各イメージのプロパティを記載します。ポートの割り当て、OSの設定、Dockerfileへのパスなど、、、そしてDockerfileには、作成されるベースイメージに加えてパッケージのインストール、環境変数の設定などを記載することで、これを配布さえすればまとめてイメージ・コンテナを作成できます。
全然網羅していないと思いますが、dockerってこんな感じだと思います。違ったら教えてください。
#2.仕組み
頑張って描いた下の画像が全てを語っています。
####①クライアント
ユーザはCLIを使ってdockerコマンドを打ちます。docker pull・・・
でイメージをダウンロードしたり、docker build
でイメージを構築、 docker-compose up -d
でdocker-composeの実行を制御します。
####②ホスト
ホスト(デーモン)は、クライアントからのリクエストに対し、実際にDocker Hubからイメージを持ってきたり、コンテナの管理を行います。クライアントとデーモンはリモートでも、同じPC上に同居させても大丈夫です!!
####③レジストリ
Docker Hubがそれに当たりますが、docker run
や docker pull
コマンドによってレジストリから必要なイメージを取り出せます。
#3.次回以降の実装について
次回以降、実際にDockerをインストールし、イメージ・コンテナの作成、docker-compose.ymlやDockerfileの記述方法について述べていきたいと思います。最終的にはSpringBootを利用したサーバと、データベースにコンテナを分けたwebアプリを作ります。
#4.参考文献
Dockerの概要:https://docs.docker.jp/get-started/overview.html#docker-architecture
Dockerとは何か?初心者にも分かりやすくメリットや仕組みを解説:https://kitsune.blog/docker-summary