Dockerコンテナ技術は、2013年にオープンソースの「Dockerエンジン」として公開され、翌年2014年には本番環境向けの商用版が発表されました。その後約10年の間に、Dockerは使いやすさと高い利便性から、IT業界で瞬く間に広く普及してきました。これからもその人気は高まっていくでしょう。
しかしその一方で、いまだに「Dockerとは何ですか」という声もよく耳にします。この記事では、Docker環境の導入を検討中で、Dockerにまだ不慣れなデベロッパーやプログラマーの皆様を対象に、Dockerの基本を解説します。Dockerに触れたことのない初心者向けの「Docker超入門編」です。

まずはDockerの概要や特徴、仮想マシンとの違いについて詳しく解説します。
Dockerは、Linuxのコンテナ技術を用いた軽量なソフトウェアコンテナプラットフォームです。Dockerを活用することで1台のサーバー上で複数のアプリケーションの実行環境を手軽に作成・運用でき、環境の均一化も図れるため、開発作業をスムーズに進められます。
Dockerの特徴を簡単にまとめると以下の通りです。
・軽量かつ高速
→1つのOSで複数のコンテナを管理でき、起動時間の短縮化を図れる。
・環境の一貫性・再現性の保持
→環境の違いによる不具合を解消し、一貫性・再現性を保持することができる。
・サンドボックスの提供
→隔離された仮想環境でプログラムを実行・検証できる。
Dockerは2013年にdotCloud社によってリリースされ、アプリケーションの開発からデプロイ、実行をスムーズに行えるという利便性から多くの企業や開発現場で導入されています。
Dockerと似た技術として仮想マシンとの違いも理解しておくことが大切です。
仮想マシンは、1つの物理マシン内に仮想化ソフトウェアを利用して複数のOS(ゲストOS)を仮想的に動作させる技術になります。一方、DockerはホストOSのカーネルを共有して利用することからゲストOSは不要になります。そのため、仮想マシンより軽快な動作を実現でき、運用コストの削減にも繋げられます。
Dockerは、開発環境の立ち上げからテスト、デプロイまでを高速化したいケースに適しています。
仮想マシン(VM)とは?意味や導入メリット、GitLab活用例

Docker Composeは、複数のDockerコンテナを一元管理する、Dockerアプリケーションのためのツールです。YAMLファイルを使用してアプリケーションのサービスを設定します。単一のコマンドで複数のサービスをまとめて生成したり、起動・停止したりすることができます。
Docker Composeのコマンド例は次の通りです。
docker-compose up: サービス用のコンテナを構築、作成、起動、アタッチします。リンクされているサービスがまだ起動していない場合は、それらも起動します。docker-compose ps: Docker Composeで管理されている稼働中のサービスを一覧表示します。docker-compose build: Docker Composeファイルで定義されているサービスをビルド(構築)します。
Dockerの主な構成要素についてそれぞれ解説していきます。
Dockerコンテナとは、アプリケーションを動作させるために必要なライブラリや設定ファイルなどを一つにまとめた実行環境を指します。
生成された各コンテナは互いに独立した状態であり、1つのサーバー上で複数のアプリケーションを同時に動作させることが可能です。また、運用の利便性向上の観点からコンテナに任意で名前を指定することもできます。
Dockerイメージは、上記で解説したコンテナを作成するための「設計図」です。アプリケーションを実行する際に必要な情報がまとめられています。
Dockerイメージを作成しておくことで、どこでも同じ環境を簡単に複製できます。つまり、イメージを共有すればソフトウェアのインストール後に行う細かな初期設定を省略することができるのです。
Dockerfileは、Dockerイメージを作成するためのテキストファイルのことで、インストールするソフトウェアや実行コマンドなどを記述します。
環境構築の手順を記述・管理しておくことで、環境構築における一連の作業を自動化できます。また、チームメンバーの誰もが同じ環境を容易に構築できるメリットもあります。
Docker Hubは、Dockerイメージを保管・共有できるDocker社が提供するサービスです。
Docker Hubでは、自身で作成したイメージだけでなく、ベンダーが公式で公開しているイメージや、第三者が作成したイメージも利用できます。開発者はそれらをダウンロードして利用することで、容易に開発環境の構築を行えます。
Dockerの環境構築は公式サイトから行えます。以下では、Windowsを例に「Docker Desktop for Windows」をダウンロードしてインストールする手順を紹介します。
インストール後はパソコンが再起動され、Dockerのアイコンがデスクトップに出現するので、Dockerを起動しライセンス規約への同意など必要な設定を行いましょう。もしインストールできない場合は、システム要件やストレージ容量、ウイルスソフトなどの確認が必要です。

ここでは、Dockerでの開発や運用でよく使うコマンドをまとめましたので参考にして下さい。
コンテナ操作用でよく使用されるコマンド例は以下の通りです。
| 目的 | コマンド |
|---|---|
| コンテナの起動 | docker start コンテナ名 |
| コンテナの停止 | docker stop コンテナ名 |
| コンテナの再起動 | docker restart コンテナ名 |
| コンテナの削除 | docker rm コンテナ名 |
| コンテナの一覧表示 | docker container ls -a |
| コンテナの強制停止 | docker kill コンテナ名 |
次にDockerイメージ管理用のコマンド例を紹介します。
| 目的 | コマンド |
|---|---|
| Dockerイメージのダウンロード(Docker Hub) | docker image pull イメージ名 |
| Dockerイメージのアップロード(Docker Hub) | docker image push イメージ名 |
| Dockerイメージの一覧表示 | docker image ls |
| Dockerイメージの削除 | docker image rm イメージ名 |
| Dockerイメージの履歴表示 | docker image history イメージ名 |

Dockerを学習する方法は以下の3つが挙げられます。
Dockerが公開している公式ドキュメントでは、Docker関連の役立つ情報が掲載されています。初心者でも利用できるドキュメントで、Dockerの基礎や導入方法などを学べます。公式ドキュメントであるため、正確な情報を得られるのもメリットです。
公式ドキュメントは英語で解説されていますが、有志による日本語翻訳サイトがあるため、積極的な活用をおすすめします。
また、公式ドキュメント以外でもDockerについてわかりやすく解説されたWebサイトは多数あるため、気になる点はインターネットで調べると良いでしょう。
Docker関連の書籍が多数出版されているため、それらを購入して学習する方法もあります。書籍なら体系的に知識を身につけられるメリットがあり、「Dockerの全体像を効率よく学びたい」という人におすすめです。
基礎から実践レベルまでさまざまな内容の書籍があるため、自分のスキルレベルにあわせて選ぶと良いでしょう。イラストやハンズオンが豊富に含まれている書籍なら初心者でも学びやすいでしょう。
Dockerの学習方法として、オンラインの動画コンテンツや講座を利用する方法も挙げられます。例えば、YouTubeならDockerについて解説された動画が多数公開されており、無料で学べるので初心者にもおすすめです。
その他、動画学習プラットフォーム「Udemy」でも、Dockerに関する講座を受講できます。Udemyなら講座によってレベルや学習内容が異なるため、自分の目的にあわせて学習を進めることができるでしょう。

アプリケーションのデプロイにおけるDockerのメリットは次の通りです。
コンテナ技術の利用を開発環境と本番環境で統一することで、環境の違いにより起こる問題を減らすことができます。その結果、デベロッパーと運用チームとの連携がスムーズに行われ、チーム間で発生していた問題も最小限に抑えられます。
Dockerのコンテナ技術は従来の仮想環境より軽く、アプリを瞬時に起動できます。これは、CPUやメモリなどのコンピュートリソースを必要最低限しか使用しないためです。起動速度が上がることで、開発にも集中できます。
Dockerでは、GitLabなどのソースコードのバージョン管理ツールを使用できるため、バージョン管理の可視化が進むだけでなく、ロールバックやアップデートも簡単に行えるようになります。
コンテナは軽量で拡張性に優れています。必要に応じて簡単に増減できます。これにより、アプリケーションの拡張やスケーリングを迅速に行えるため、変わりゆく状況にも柔軟に対応できます。

Dockerにはさまざまなメリットがありますが、いくつかデメリットも存在します。以下にデメリットを挙げます。
Dockerは1つのOS上で複数のコンテナを作成します。これにより起動速度や処理速度の面でメリットがありますが、同時にデメリットになることもあります。たとえば、異なるOS環境で検証をしたい場合には、別のマシンや仮想マシンを準備する必要が生じます。
Docker自体は軽量ですが、大規模システムに拡張する場合には、Dockerの管理に伴う負荷が発生します。Dockerは1台のサーバーで多数のコンテナを実行できますが、その反面、管理やオーケストレーションが必要になり、その処理のためにオーバーヘッドが生じる場合があります。Dockerだけですべての管理を行なうのが困難になることもあります。
Dockerは他の仮想マシンと異なる手法で仮想環境を構築します。つまり、デベロッパーは新しいコンセプトをすべてゼロから習得しなければならず、それには時間がかかります。Dockerの動作原理をきちんと理解せずに使用すると、あとでトラブルや問題が発生することもあります。Dockerについてしっかりと学習してから運用に取り組むようにしましょう。
Dockerはコンテナ型アーキテクチャです。1台のマシン上で複数のコンテナが動作するため、このことに起因する脆弱性には注意が必要です。たとえば、複数のコンテナがホストOSのリソースやカーネルを共有しているため、一つのコンテナに脆弱性があった場合、全体にその影響が及ぶ可能性があります。
複数のコンテナ間での連携を検討している場合、各種設定が難しいために、運用時に問題が発生することがあります。たとえば、アプリとデータベースを別のコンテナで作成し、一緒に運用したい場合には、同一ホスト内で通信設定をしなければなりません。ポートやソケットを開放する場合にはセキュリティ面でリスクが生じます。それを避けるために設定を複雑にしてしまうと、今度は運用面で問題が起きる恐れがあります。コンテナを連携させる際は、設計段階から十分に検討することが重要です。
Dockerコンテナ内にGitLabをインストールすることができます。GitLabは、Git「分散型バージョン管理システム」を主体としたDevSecOpsプラットフォームです。ソフトウェア開発ライフサイクル全体に対応する単一のプラットフォームで、GitLabを活用することで高品質なソフトウェアの迅速なデリバリーを実現できます。
Dockerコンテナ内にGitLabをインストールすると、GitLabインスタンスにアクセスできるようになります。DockerコンテナへのGitLab Dockerイメージのインストールは公式にサポートされています。
Dockerが抱えるいくつかの問題のうち、特にセキュリティについては、GitLabのDevSecOps(開発、セキュリティ、運用)を活用して対処することができます。GitLabのDevSecOpsでは、シフトレフトを重視しており、セキュリティ対策を開発サイクルの早い段階に組み込むことにより、コンテナイメージの持つセキュリティの問題の早期発見と対応を図っています。継続的インテグレーションによってこのシフトレフトのコンセプトを実践することで、セキュリティ対応にかかっていたコストを削減できます。
DevSecOpsにおいて重要なCI/CDを実現するためには、自動化が欠かせません。GitLabではパイプラインがCI/CDの命令をまとめています。そして、その指示に従いプロセスの自動化を実現するときの基盤になっているのがGitLab Runner(英語)です。GitLab Runnerはセキュリティのシフトレフトを実現する上で重要な役割を果たしています。
GitLab Runnerはセキュリティスキャンやテストを指定したタイミングで自動で実行してくれます。また、レポート作成ジョブを実行して、ダッシュボードに最新情報を表示することも可能です。

GitLabを活用したDevSecOpsインテグレーションにおいても、Dockerは非常に大切な役割を担っています。
GitLab CI/CDでは、CI/CDパイプラインでDockerコンテナを使用することで、次のようなことが可能になります。
GitLab RunnerのDockerイメージは、UbuntuまたはAlpine Linuxをベースにしています。Dockerイメージは標準のgitlab-runnerコマンドを内包しており、ホストに直接GitLab Runnerをインストールしたかのように動作します。
セキュリティはDevSecOpsでの重要な要素であり、Dockerはこれをサポートします。
GitLabは、Dockerを使用する以下のデプロイパターンをサポートしています。
GitLabとDockerを組み合わせることで、マイクロサービスアーキテクチャを簡単に構築できます。マイクロサービスは別々のDockerコンテナとして実行します。GitLab CI/CDパイプラインを使うと、以下のことを管理できます。
2013年の公表以来、Dockerは瞬く間にIT業界に広く普及しました。本記事では、Dockerの基本概念や仮想マシンとの違い、Dockerのメリット、デメリットなどについて紹介してきました。
Dockerを使う場合には、DevSecOpsにとって大切なCI/CDを実現するためにも、GitLab CI/CDなどの自動化ツールの導入をおすすめします。GitLabのCI/CDパイプラインでDockerコンテナを使用することで、開発における一貫性の維持、スケーラビリティの実現、柔軟な環境の準備が可能になります。
このブログ記事を楽しんでいただけましたか?ご質問やフィードバックがあればお知らせください。GitLabコミュニティフォーラムで新しいトピックを作成してあなたの声を届けましょう。
フィードバックを共有する