Docker入門の前に知っておきたい基礎知識 - 週末勉強会レポート

メイン画像

こんにちは!テクトレブログ編集部です!

TechCommitでは毎週日曜日にオンラインで週末勉強会を行なっています。

今回は、以前より気になっていたテーマであるDockerの勉強会だったので、いい機会だと思い参加してきました!

勉強会ではどんなことをやったのか、その内容をレポートしていきたいと思います!

 

この記事は、以下のような疑問を持った方に特にオススメです。

 

  • Dockerって聞いたことあるけど実際よくわからない。
  • とりあえずDockerを使ってみたい。
  • Dockerを少し使ってみているけど、どんな風に動いているのかイマイチわからない。

 

この記事では、そんな疑問を解決するために、Dockerとは何か、そしてDockerはどのように動いているのかといった、実際にDockerを触る前に知っておきたい知識について解説しています。

 

※この記事は、TechCommitで6月30日に行われた週末勉強会の内容の一部を抜粋しブログ記事化したものです。

 

目次

Docker勉強会の内容

 1. Dockerとは?

 2.  仮想化とは

 3. ハイパーバイザー型とコンテナ型の仮想化の仕組み

  a.ハイパーバイザー型仮想化について

  b.コンテナ型仮想化(Docker)について

 4. なぜコンテナ型仮想技術が流行っているのか

   a.ハイパーバイザー型の場合

   b.コンテナ型(Docker)の場合

 5. Dockerの動作原理

  a.DockerImageについて

  b. Dockerfileについて

 6. Docker Hubについて

 7. Dockerの原則

 8. コンテナ間連携について

  a.コンテナが多い場合の連携

今回の勉強会の成果

勉強会でよく思うこと、注意点

継続的に勉強会に出る利点

まとめ

 

 

Docker勉強会の内容

 

1. Dockerとは?

そもそも Dockerとは何でしょうか?

結論から言いますと、Dockerとはコンテナ型の仮想化環境を提供するプラットフォームのことです。

Dockerを使えば、複数人で開発する際の開発環境の統一や、開発環境と本番環境の統一を容易にすることができます。

 

ここで、「仮想化」「コンテナ」と馴染みのない単語が出てきたかもしれません。

以下で、そもそも仮想化・コンテナとは何か、Dockerはどのような仕組みで動いているのかなどについて解説していきます。

 

この記事を読めば、Dockerを触る前にDockerという技術の全体像やどのようなことをするのかが想像できるようになるはずです!

それでは早速、仮想化という技術から見ていきましょう!

 

2. 仮想化とは?

仮想化とは、1台の物理的なコンピューターの上で、複数の仮想的なコンピューターを構築して実行する技術のことです。

仮想化技術を使うと、1台のコンピューター上で複数のOSなどを実行し、異なる複数の環境を構築することができます。

仮想化にはいくつかの方法があるのですが、今回はハイパーバイザー型の仮想化と、Dockerが用いている仮想化技術であるコンテナ型仮想化について見ていきましょう。

 

 

3. ハイパーバイザー型とコンテナ型の仮想化の仕組み

a. ハイパーバイザー型仮想化について

ハイパーバイザー型の仮想化では、まず物理的なコンピューターの上にハイパーバイザーと呼ばれる制御プログラムの層を構築します。

そしてハイパーバイザーが自身の上に仮想マシンを作成します。

さらにその仮想マシンの上でゲストOSを実行するという仕組みになっています。

 

Xen, VMWare,VirtualBox, ESXiなどは、ハイパーバイザー型の仮想化技術を使っています。

出典: https://www.docker.com/resources/what-container

 

 

b.コンテナ型仮想化(Docker)について

Dockerによるコンテナ型の仮想化とは、物理的なコンピュターの上に乗ったホストOSの上にDockerデーモンと呼ばれる制御プログラムが乗り、さらにそのDockerデーモンがアプリケーションコンテナをそれぞれ制御する仕組みになっています。

 

この際、Dockerはホストマシンのカーネル(OSの核)を利用し、ホストマシンのプロセスやユーザー、ネットワークなどを分離します。

出典: https://www.docker.com/resources/what-container

 

 

4. なぜコンテナ型仮想化技術が流行っているのか?

最近はコンテナ型の仮想化環境であるDockerが流行っていますが、それはなぜでしょうか?

そもそも、ハイパーバイザー型とコンテナ型の仮想化にはどのような違いがあるのでしょうか。

 

a. ハイパーバイザー型の場合

まず、ハイパーバイザー型の仮想化では仮想マシンの諸設定が必要です。

 

ハイパーバイザー型の仮想化では、コンピューター上でCPUやメモリなど、ハードウェアそのものを丸ごとエミュレートしているので、ホストマシンのCPUやメモリ、ハードディスクなどを仮想マシンへどれだけ割り当てるかなどの設定が必要になります。

この割り当ての設定は、柔軟性に欠けるため変更したいときには仮想マシンの設定を最初からやり直すなどの手順が必要になります。

 

また、ハイパーバイザー型の仮想化では、1台のコンピューターの上に別のコンピューターを丸ごとエミュレートするため、必要なプログラム群などが大きく、リソースのオーバーヘッドが大きいことが挙げられます。

そのため、起動までに時間がかかるなどのデメリットがあります。

 

b. コンテナ型(Docker)の場合

ハイパーバイザー型と比較すると、コンテナ型仮想化は軽量でシンプルです。

コンテナ型仮想化では、丸ごと別のコンピューターをエミュレートするのではなく、ホストマシンのカーネル(OSの核)を利用するため、オーバーヘッドが小さいからです。

 

また、コードでインフラのアーキテクチャを定義することができるので、記述されたコード通りの内容を自動で設定する仕組みを作れば、誰がそのコードを実行しても同じインフラ環境を構築することができるようになります。このコードはDockerfileに記述します。

 

他にも、ミドルウェア層とアプリケーション層の連携をすることでデプロイが容易であるという点がDcokerの利点としてあげられます。

Dockerの仕組みについてもう少し詳しく見ていきましょう。

 

 

5. Dockerの動作原理

DockerではホストOS(Linuxカーネル)の名前空間を分離しコンテナと呼ばれる作業空間を作ります。

この名前空間とは、プロセス、ファイルシステム、ネットワーク、ホスト名・UID・GIDなどを指し、コンテナを作ると名前空間が分離されてそれぞれのコンテナに独立して作られます。

出典:Docker道場「Dockerの基本概念」0825インフラ勉強会資料

 

a. Docker Imageについて

また、DockerはImageと呼ばれるコンテナを起動するのに必要な設定をまとめたものがレイヤー状に重なってできています。

Docker Imageから起動したコンテナに何らかの処理を書いてその状態を保存すると、レイヤーが一つ増えることになります。

出典:Dockerイメージの理解とコンテナのライフサイクル

 

Docker Imageは、基本的にベースイメージ(公式イメージ等)の上にImageを重ねていくことで作られていきます。

この際、一度作られたImageは読み込み専用になります。

 

つまり、コンテナを起動するとは、書き込み可能なレイヤーを作り、そのレイヤーイメージからプロセスを立ち上げることと言うことができます。

Docker runなどのコマンドを打つと、書き込み可能なレイヤーが一層増えて、そこからコンテナが立ち上がるようになっているのです。

出典:Dockerイメージの理解とコンテナのライフサイクル

 

 

b. Dockerfileについて

次に、Dockerfileについて簡単に説明したいと思います。

Dockerfileとは、ベースイメージをもとにして自分のアプリケーションに必要なミドルウェアのインストールなどを行う指示書のことです。

docker buildコマンドを打つと、Dockerfileを元にしてImageが作成されます。

このImageを共有することで、多人数での開発環境を容易に統一することができます。

 

また、作成したImageをコンテナホスティングサービスで動作させることで、本番環境と開発環境を同じ環境にすることができます。

次に、Dockerを使うのであれば知っておくべき、Docker Hubという便利なサービスについて紹介します。

 

 

6. Docker Hubについて

Docker Hubとは、DockerコンテナのImageをクラウドで共有できるサービスです

Docker Hubには公式イメージだけでなく個人が公開した様々なImageが公開されています。Docker版のGitHubのようなものです。このDocker HubからImageを入手し走らせることで、容易に環境構築をすることができます。

 

a. DockerHubの使い方

例:Nginxのコンテナを作りたい場合

DockerHubを利用してNginxのコンテナを作りたい場合を考えます。

その場合は、Dockerfileに以下の記載をするだけで簡単にコンテナを立ち上げることができます。

 

  • FROM nginx

 

基本的にはDockerfileに上記のような記載をするだけで十分なのですが、ビルドオプションを設定したいなどの場合には、以下のように記載する必要があります。

  • FROM ubuntu:latest
  • RUN apt-get update -qq && apt-get install  -y nginx

 

このコマンドではFROMはベースイメージを表わしており、そこを起点にアップデートを行って、さらにNginxを導入しています。

つまり、このコマンドはNginxが入ったUbuntuが手に入る事を表しています。

 

 

7. Dockerの原則

Dockerには1 コンテナ1プロセスという原則があります。

これは、例えば先ほどの例で言えばNginxというWebサーバのコンテナを作りましたが、その中にRailsサーバーを構築することはしないということです。

原則として、NginxはNginxだけのコンテナ、RailsはRailsだけのコンテナ、のように別々のコンテナにわけて動作させます。

これには、プロセスを切り分けることによって、どこで何が起こっているかをわかりやすくするといった効果があります。

ただし、Nginxのようにあるプロセスから子プロセスが立ち上がるようなものの場合、子プロセスまで全てコンテナを分けることまではしません。

 

 

8. コンテナ間連携について

Dockerの動作原理の部分で、「コンテナを作ると名前空間が分離されてそれぞれのコンテナに独立して作られます」と述べたとおり、コンテナはそれぞれ独立しているので、そのままでは連携しておらず、互いのプロセスを認識することができません

出典:Docker道場「Dockerの基本概念」0825インフラ勉強会資料

そこで、コンテナを連携するLinkコマンドが必要になります。

例えば、WordPressとMySQLのコンテナがあったとして、それらをリンクしたい場合は

 

  • $ docker run --name some-mysql -d mysql:5.7
  • $ docker run --name some-wordpress --link some-mysql:mysql -d -p 8080:80 wordpress

 

のようにコマンドを打つ必要があります。

このようにコマンドを打つことによってコンテナ同士がリンクされ、相互にプロセスを見ることが可能になります。

 

a. コンテナが多い場合の連携

しかし、コンテナは小さな単位なので数多くのコンテナが立ち上あがってる状況が想定されます。

そのような場合は、一つ一つを連携するのは大変ですので、Docker Composeと呼ばれるCLIツールを使うことが有効です。

Docker ComposeではComposeファイル(yml形式)にDockerのサービスを定義することができます。

 

この記事では詳しく扱いませんが、このDocker ComposeはDockerコマンドと親和性が高く、Dcokerのサービスを定義するのに非常に便利ですので、ぜひ調べてみてください。

 

出典:http://blog.terranillius.com/post/composev3_swarm/

 

今回の勉強会の成果

今回の勉強会では、Dockerがどのような技術を使ってどのように動いているのかという動作原理を前半に学びました。

このブログでは紹介していませんが、後半では実際にハンズオン形式でコンテナを立ち上げてみたり、基礎的なコマンドを打たりして学びました

今回は実際にハンズオンとして以下のようなことを学びました。

  • Ubuntuイメージをベースにカスタマイズ 
  • コンテナのビルドと起動 
  • コンテナのプロセスについて 
  • Ruby on Railsをコンテナ化してみる

 

実際に手を動かして学んでみることで、座学として学ぶだけより記憶に残りますし、エラーが出てもその場で共有して解決できところがとても良いですね。

 

勉強会についてよく思うこと

いくつもの勉強会に出ていると、勉強会には注意すべき点がいくつかあると感じます。

その中でも特によく思うのが、その場ではできるようになった気がするけど、日が経って実際にやってみようとするとできないということです。

 

スライドをみながら、説明を聞いていると、なんとなくビジュアルでわかっただけになってしまったり、実際にその場では理解していても記憶にあまり残らなかったりしますよね。

その点、実際にハンズオンを散りばめた勉強会は、その場である程度手を動かすので記憶にも残りやすくなりますし、特に初心者や、新しい技術に触れるかたなどには良いでしょう。

ハンズオンがない場合でも、勉強会が終わってからすぐ実際に手を動かしてみるのがオススメです!

 

継続的に勉強会に出る利点

また、勉強会は気になったものだけ出てみるのも良いですが、コミュニティ主催のものであれば継続的に出てみることもオススメです。

コミュニティのような継続的な関係にあるものの勉強会の場合、わからなくなった場合でも後から他の参加者に聞いたりすることもできます

また、継続的に勉強会に出てみることで様々な分野の知見を学び、視野を広げることができます

 

TechCommitではそのような理由から毎週日曜日に勉強会をしています!

テーマも様々で、継続的に参加することで幅広い知識を得ることができます。

勉強会のテーマはメンバーからの要望に沿ったものであったり、またメンバー自身が主催となって開催することも予定しております。

 

まとめ

今回は、Dockerを導入する以前にDockerとは何か、Dockerはどのような仕組みで動いているのかといった基本知識を学びました。

 

  • Dockerとはコンテナ型の仮想化環境を提供するプラットフォーム
  • 複数人で開発する際の開発環境の統一や、開発環境と本番環境の統一が容易になる
  • 仮想化とは、1台の物理的なコンピューターの上で複数の仮想的なコンピューターを構築して実行する技術
  • コンテナ型仮想化はハイパーバイザー型に比べ軽量でシンプル
  • Dockerfileとは、ベースイメージをもとにして自分のアプリケーションに必要なミドルウェアのインストールなどを行う指示書
  • docker buildコマンドを打つと、Dockerfileを元にしてImageが作成される
  • Docker Hubとは、DockerコンテナのImageをクラウドで共有できるサービス
  • コンテナどうしを連携するにはLinkコマンドが必要

 

実際にDockerを動かしてみたい方は、Dockerの公式サイトからDocker for Macや Docker for Windowsなどをダウンロードして立ち上げてみるとよいでしょう。

 

また、この記事の元となった週末勉強会動画では、後半に基礎的なコマンドの紹介や実際にDockerを使ってRailsをコンテナ化してみるなどのハンズオンもあります。

気になった方はぜひTechCommitの週末勉強会アーカイブ動画をご覧ください!

 

 


記事一覧に戻る

関連記事

プログラミング
サムネイル画像
2019/07/26 16:00
チーム開発をする前に最低限知っておきたいGit/GitHub活用術
プログラミング
サムネイル画像
2019/09/13 18:30
Railsチュートリアルが難しくて挫折しそうなときの学習のコツや復習教材
プログラミング
サムネイル画像
2019/07/18 18:00
Docker入門の前に知っておきたい基礎知識 - 週末勉強会レポート
前の記事:初心者のプログラミング学習にMacの開発環境がオススメされる理由