ロボット研究開発、ソフトウェア開発、コンテンツ制作配信

【Docker】#01 仕組みを理解する


どうもこんにちは、
最近仕事でDockerを使った開発を経験しました。有識者の指示で開発は進めることが出来ましたが、そもそもDockerをあまり理解していません。
ということで、Dockerをきちんと学びその内容をこのブログにまとめることで知識を定着させたいと思います。
1回目はDockerの仕組みから。

参考にした書籍は、以下です。
[参考書籍]
仕組みと使い方がわかる」Docker&Kubernetesのきほんのきほん
スポンサーリンク

1.Dockerの概要、用語など

Dockerとは、ざっくり言うと、「データやプログラムを隔離できる仕組み」です。
まずは、基本的なDockerの用語を以下にまとめておきます。

・コンテナ(container)・・・データやプログラムが入っている箱、物置
・Docker Engine・・・コンテナを操作するDockerのソフトウェア。Docker Engineをインストールすると、コンテナを生成したり、使ったりできる。
・イメージ(image)・・・コンテナを生成するときの素になるイメージファイル(テンプレート的なもの)。イメージからコンテナを生成する。

コンテナがデータやプログラムを隔離するための物置で、Docker Engineがコンテナを作ったり動かしたりします。コンテナはイメージファイルというものから生成されます。

では、なぜプログラムやデータを隔離する必要があるのでしょうか?

なぜデータやプログラムを隔離する必要があるのか?

プログラムは、単独で動作しているわけではなく、周辺のライブラリや他のプログラムを利用しながら動いています。(依存し合っている)
極端な例を示しますと、あるシステムAは、あるプログラムのバージョン2でしか動かない、別のシステムBはあるプログラムのバージョン3でしか動かないとします。この時、システムAが入っている環境にシステムBを入れて、プログラムをバージョン3にすると、システムAが動かなくなってしまいます。このように、複数のシステムを同居させるには、参照しているプログラムのバージョン等に注意して導入する必要があるのです。
ここで、Dockerを用いると、システムA用のコンテナ、システムB用のコンテナ、2つのコンテナを用いることで、お互いに影響を与えず2つのシステムを導入することができる。というわけです。

私の場合、Linuxベースでロボット開発を行うことが多いですが、新たなシステムを試す時、様々な依存プログラムのバージョンを変更するのを躊躇してしまいます。(いちいちSDカードのバックアップを取り、別のSDカードで新たなシステムを試すこともあります)
Dockerを使えば、既存システムに影響を与えずに、別のシステムを試せたり、共存させることができるので、導入するメリットが高そうです。
実際の私のロボット開発にもDockerを導入してみたくなりました。

2.Dockerの動く仕組み

LinuxOSが必要

Dockerを動作させるにはLinuxOSが必要です。なぜならDockerがLinux OSを使うことを前提としているからです。※WindowsやMacでもDockerは使えますが、その裏ではLinuxOSが動いているようです。

DockerはLinuxOS上にDockerEngineがありその上のコンテナを動かします。
LinuxOSには、「カーネル」と呼ばれるOSの核があり、その周辺をディストリビューションというソフトウェア(※以降、周辺部分と記載する)で構成されています。

実は、Dockerのコンテナ内には、LinuxOSの「周辺部分」だけが格納されているのです。
Dockerは、コンテナ内の周辺部分が命令を受け取り、土台のカーネルに命令を伝える仕組みになっています。
このように、Dockerは、カーネルを土台部分に任せることで、軽量な仕組みを実現できているのです。この軽量な仕組みがDockerの大きなメリットのようですね。

イメージとコンテナ

続いて、コンテナの素になるイメージについて見ていきます。
イメージは、コンテナの素になるもの。要は金型のようなものです。
イメージからコンテナを作成して利用します。

イメージは金型なので同じものを複数量産できます。
また、コンテナからイメージを作ることができます。あるイメージからコンテナを作成し、改造を加え、新たなイメージとして作成することができます。とても便利な仕組みですね。

Docker Hub

コンテナの素となるイメージですが、ユーザーが1からイメージを作ることは滅多にないようです。実は良く使われるイメージはDocker Hubというサイトにたくさん公開されており、自由に入手できるようです。
Docker Hub

Dockerコンテナのライフサイクル

Dockerコンテナは、1つのコンテナをアップデートしながら使うのではなく、古いコンテナは捨てて、アップデートされた新しいコンテナを新たに作っていく思想です。
1つのコンテナをアップデートしながら運用するよりも、構築の容易さのメリットを活かし、新たなコンテナに乗り換えてしまうほうが手間がかからないからです。

このように、コンテナの「作る」→「起動する」→「停止する」→「破棄する」→「作る」→・・・・の一連の流れをコンテナのライフサイクルと呼びます。

ここで疑問なのが、コンテナを頻繁に破棄する場合、コンテナ内のデータは全部消えるのではないか?という疑問です。
実は大概は、データ自体はDockerをインストールしているホストマシンのディスクにマウントし、そこに保存していくようです。したがって、データは安全な場所に保存されているため、消えてしまうことはないようです。

まとめ

さてここまで学んだDockerの仕組みについて整理しましょう。

・Dockerは「データやプログラムを隔離できる仕組み」
・データやプログラムを隔離する箱をコンテナと呼ぶ。
・コンテナにはカーネルを含める必要がないため、軽量である。(カーネルの周辺部分のみコンテナに存在する)
・イメージからコンテナを作成したり、コンテナからイメージを作成したりできる。
・イメージが配布されているサイトが、DockerHub
・Dockerは「作っては捨てる」というライフサイクルという思想がある。

以上を踏まえ、Dockerを使うメリットとして、以下が考えられます。

・開発環境を共有しやすい
→複数人で開発環境を共有する場合、コンテナを共有することで、同じ環境を簡単に構築することができるでしょう。
・新バージョンの開発へ移行しやすい
→既存のシステムを新たなバージョンへと移行する際に、コンテナで既存のシステムと新システムを隔離しておけば、安心して新システムへの開発を推進できるでしょう。

現状のシステム開発は、様々なライブラリやプログラムのバージョンの依存関係が複雑に絡みあっています。Dockerを使うことで、データやプログラムを隔離し、様々なシステムのバージョンアップや変更がやりやすくなると思います。またDockerは軽量であるのも嬉しいポイント。
個人的にもDockerはロボット開発や他の案件を進める上で必須技術だと再認識しました。

ということで、次は実際にDockerを触りながら、理解を深めていこうと思います。

動画解説もあります。記事と合わせてどうぞ!

スポンサーリンク

いいね!を押すと、
最新記事をお届けします。

Twitter で
関連記事(一部広告含む)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


ページトップボタン