支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡


はじめに

Docker(ドッカー)は一言で表すと簡単に仮想環境を構築できるソフトウェアですが、仮想化自体がどういったものであるか、どういう時に利用するのかがわからないとDockerについても理解し難いものです。この記事では仮想化とは何か、どういう時に役立つ技術かを説明した後に、Dockerについて詳しく掘り下げていきます。インフラ関係のエンジニアやプログラマーを目指している方や、Dockerという言葉は聞いたことがあっても今まで詳しく知る機会がなかったという方はぜひご覧ください。

仮想化とは?

仮想化とはコンピュータ上に立ち上げているWIndowsやMac、LinuxといったOSの上にさらにOSを立ち上げることを指します。パソコンやサーバーはOSを土台として、その上にさらに利用したい表計算ソフトやデザインソフト、Webを立ち上げるサービス、メールができるサービス等をインストールして利用するのが基本的な使い方です。仮想化の際にはこの土台となるOSを「ホストOS」と呼びます。対して仮想化してホストOS上に立ち上げるOSのことを「ゲストOS」と呼び、ゲストOSを起動するには仮想化するためのソフトウェアが必要となります。この際に利用されるOSとしてはVM WareやVirtual Box、Hyper-V等が有名です。なおホストOSとゲストOSは同じOSでなければいけない必要はなく、それぞれ異なる場合もあります。しかし例えばホストOSがLinuxでゲストOSとしてWindowsを立ち上げようとした場合には、普段サーバーやパソコンでWindowsOSを利用する時と同様にMicrosoftのライセンスの概念が無視できません。使い方によっては違反することにもなりかねないので、仮想化でWindowsOSを利用する際はあらかじめどういったライセンス体系となるか確認しておきましょう。

次に、なぜ仮想化をするのかという点に触れます。仮想化はシステム開発におけるリリース前の段階で、作成したプログラム等をテストするための環境として構築されることが多いです。すでに利用しているコンピュータ内に仮想化して別環境を作り上げることで、物理的にサーバーやハードウェアを増やしたり、別のサーバーでテストを実施した後にそのサーバーを再インストールして本番環境を作り上げる等のコストや手間が削減できます。業務上どうしてもバージョンの異なる同ソフトウェアを共存させる必要があったり、普段利用する環境はセキュリティ上最新の状態を保たなければならないものの、業務上利用が必須なソフトウェアは最新バージョンに対応していなかったりという状況を解消する方法にもなります。また一台のサーバー内に多くのユーザー領域を確保して、それぞれの領域が独立した状態を確立して複数人に利用してもらうようなサーバーサービスを提供する際にも利用される技術です。

Dockerとは?

ここまでは従来の仮想化技術について取り上げてきましたが、今回の本題であるDockerはその仮想化を応用したものと思っていただいて間違いはなく、利用目的に関してはほぼ同じです。これまでの仮想化に比べてコンピュータに負荷をかけづらくしたうえ、仮想化を簡略化した仕組みがDockerとなります。なぜDockerは負荷がかかりづらくなっているかというと、仮想化で紹介した仮想化するためのソフトやゲストOSを立ち上げることなく仮想環境を実現できるためです。また簡略化については後ほど詳しく説明しますが、Dockerは簡単なコマンド操作で、初心者のエンジニアでも素早く仮想環境を利用できるという利便性も実現しています。なおDockerでは「コンテナ」という概念がとても重要になってきます。Dockerの公式ロゴには大きなクジラの上にたくさんのコンテナが積まれたアイコンが採用されていますが、コンテナは定められた規定の重さや大きさを守ることできれいに整頓された状態で効率的に船内に積まれ、運ばれていきます。Dockerも本物のコンテナのように一定の規格に沿った状態で作り上げたコンテナを、簡単なコードを実行するだけで様々なOS環境上で利用できるようになります。一つ一つのコンテナの中にはそれぞれ異なるバージョンの実行環境やアプリケーション、プログラム等が格納されていて、必要に応じて作成された各コンテナが呼び出されます。

Dockerの仕組みをもう少し詳しく説明すると、DockerはホストOSと同じカーネルを使用します。カーネルとは、OSの最もメインとなる部分で、何らかのコマンドを実行した際に真っ先に呼び出されるのがこのカーネル内にあるライブラリとなります。DockerのコンテナはゲストOSを介することなくこのカーネルに直接アクセスして様々なプロセスを実行できるので、一般的に処理速度も従来の仮想化技術に比べて早くなります。

またDockerでもう一つ覚えておきたい仕組みが「namespace」です。普段サーバーやパソコンで同階層に中身の異なる同名ファイルを設置しようとしても、既存データを上書きするかどうかを確認されることでしょう。仕方なく以前のファイル名を「old_○○」と変更して両方のファイルを保存するかもしれません。しかしDockerには「namespace」の概念があるため、中身の異なる同名ファイルを同ディレクトリ構成で保存することが可能となっていて、そのために複数のコンテナを同ホストOS内に存在させることが可能となっています。なおnamespace自体はすでに2006年からLinuxのカーネルに搭載された機能で、同じファイル構造やファイル名、pidであっても別物として扱うことができます。ただしnamespaceの存在だけでは同ファイル構造やファイル名の識別はできたとしても、コマンドやライブラリ、ネットワーク空間、ファイルシステム等も同様に分離しない限りは各コンテを全く独立した環境として扱うことはできません。本来はそれらを分離する作業が別に発生しますが、Dockerはこれを簡単なコードの記述だけでやり遂げることが可能となっています。このように様々なインフラを簡単なコードで構築できることはDockerの「Infrastructure as a Code」という考え方に基づいている特徴です。エンジニアはどのOSでどのようなプログラムを動かす環境が必要かということをDockerfileに書き込んで実行するだけで環境が自動的に構築されます。なおDockerfileとは、Docker imageと呼ばれるコンテナを作成する様々な情報が書き込まれた、データを構築していく手順が記載されたファイルのことを指しますが、上記のようにエンジニア自身がこのファイルを独自に作成することも可能となっています。

またDockerは「Immutable Infrastructure(不変のインフラ)」の考え方にも基づいていて、基本的に一度構築した環境はプログラム等のバージョンアップを実施せず、どうしても新たなバージョンが必要となった場合は、プログラムのバージョンアップを行うのではなく、インフラ環境そのものを破棄して新たに作り直すという手法が推奨されています。またDockerはどの環境でも動作可能なため、環境に合わせて作成し直す必要がないという意味も含まれていると言えるでしょう。

DockerをWindowsやMacで利用する際に必要となるDocker Desktopが2021年8月から有料化することが発表されましたが、有料化に該当するのは「従業員が250人以上、かつ年間売上が1,000万ドル以上」に当てはまる企業のみで、それに満たない企業や個人利用は、2021年10月時点で引き続き無料で利用可能です。Dockerはこのようにサービスの提供方法が変化していますが、AWSやAzure、GCPといった代表的なクラウドサービス上で利用されることが主流となっており、ITインフラにおいて欠かせない技術となっています。

Dockerの便利な機能を紹介

Dockerはすでに紹介してきた特徴だけでも便利なソフトウェアであることがわかりますが、さらに便利に利用できる機能が様々な存在しているので、今回はいわゆるDockerの「エコシステム」である代表的な3つの仕組みについて紹介していきます。

Docker Hub

Dockerの様々なイメージを、Web上のリポジトリから取得できるサービスです。なおDockerにおけるイメージとは、これまでの仮想化技術において「VMイメージ」等と呼ばれていたものと同様です。第三者が作成したイメージを取得できるだけではなく、自分で作成したイメージを共有することも可能です。例えばDocker HubでCentOSのイメージを取得したい場合は「docker run -it centos:centos7 /bin/bask」というたった1行のコマンドを実行するだけでダウンロードが開始され、すぐに利用できるようになります。ただし上記のコマンドだけの場合はCentOSの基本的機能のみがダウンロードされます。そのためCentOS上でWebサービスを起動せたい場合には、あらかじめDockerfileにApacheやNginx等の同時にインストールしたいWebサービスを指定しておくことで、OSと同時に取得可能となります。またDockerのイメージを社内の配布用としてのみ利用したいという状況も発生するかと思いますが、必ずしもDocker Hub上で全体公開する必要はなく、「docker push」というコマンドを使うことでプライベートなリポジトリにアップロードすることが可能です。GitHubを利用したことがある方は、似たような仕組みであることがわかることでしょう。

Docker Compose

オンプレミスやクラウドサービスのサーバーで、管理サーバー、Webサーバー、アプリケーションサーバー等、サーバー1台ごとに異なる役割を持たせて複数台で一つのシステムを構成することがありますが、Dockerの仮想環境でも複数台構成を実現することが可能です。その際に利用するのが「Docker Compose」で、複数のコンテナを起動して連携させることが可能になります。なおDocker Composeに関してもDockerのメリットが生きていて、あらかじめymlというファイルに各環境の定義を記述した状態で簡単なコマンド実行するだけで、一度に複数台のコンテナを管理可能となります。

Kubernetes(クーベネティス、クバネティス等と発音)

Dockerが広く利用される一因にもなっているGoogleが公開した機能ですが、MicrosoftやIBMといった他社でもサポートを行っています。Docker Composeのように複数コンテナの管理に利用される仕組みで、より複雑な管理に適しているのが「Kubernetes」です。

まとめ

Dockerは慣れるまでに独特な概念や操作方法を覚えるのに時間がかかる部分がありますが、使いこなせるようになると一連のシステム開発における作業時間の削減や、コストの削減にも繋がるため、企業でのシステム開発には非常に有用な技術となります。また簡単なコマンド操作で利用可能なため、エンジニアになってから日の浅い人であっても扱いやすく、インフラ知識に明るくないプログラマーにおいては、インフラエンジニアに作業を依頼することなく自分で簡単に仮想環境を構築して、本来のプログラミングやテスト業務に専念できます。今後エンジニアやプログラマーを目指している方はぜひこれを機会にDockerについて学んでみてはいかがでしょうか。