公開:2025年6月18日

1分で読めます

Dockerとは:超入門編

Dockerのコンテナ技術は広く普及しつつあります。Dockerとは何なのか。Dockerの使い方は?Dockerプラットフォームとその技術の基礎を学びましょう。

Dockerコンテナ技術は、2013年にオープンソースの「Dockerエンジン」として公開され、翌年2014年には本番環境向けの商用版が発表されました。その後約10年の間に、Dockerは使いやすさと高い利便性から、IT業界で瞬く間に広く普及してきました。これからもその人気は高まっていくでしょう。

しかしその一方で、いまだに「Dockerとは何ですか」という声もよく耳にします。この記事では、Docker環境の導入を検討中で、Dockerにまだ不慣れなデベロッパーやプログラマーの皆様を対象に、Dockerの基本を解説します。Dockerに触れたことのない初心者向けの「Docker超入門編」です。

目次

  1. Dockerとは:超入門編

  2. Dockerの目的

    • Dockerとは
    • Dockerでできること
    • Dockerイメージとは
    • Dockerコンテナとは
    • Dockerfileとは
    • Dockerはなぜ重要なのか
  3. Dockerの主な機能

    • Dockerの特徴
    • Docker Composeとは
  4. アプリケーションのデプロイにおけるDockerのメリット

    • 開発環境と本番環境のシームレス化
    • 起動の軽量化・処理速度の高速化
    • バージョン管理のしやすさ
    • 優れたスケーラビリティ
  5. Dockerのデメリット

    • ひとつのOSを使わなければならない
    • 大規模開発時のオーバーヘッド
    • 技能習得に時間がかかる
    • セキュリティに脆弱性が生じることもある
    • コンテナ間での連携が難しい
  6. GitLabはDockerが抱える課題をどのように解決するのか

  7. GitLabのDevSecOpsにおけるDockerの役割

  8. まとめ

  9. FAQ(よくある質問)

Dockerの目的

はじめに、Dockerとはどういったもので、何ができて、どうして便利なのか、なぜ重要なのか、Dockerの目的に着目しながらその概念をまとめていきます。

Dockerとは

Dockerは、Linuxのコンテナ技術を用いた軽量なソフトウェアコンテナプラットフォームです。アプリケーションの開発、出荷、実行を簡易化するために設計されました。Dockerを使えば、すべての依存関係と一緒にアプリケーションをパッケージ化できるため、依存関係を一つひとつ手動でインストールする必要がなくなり、一貫性のあるコード実行が可能になります。

Dockerを使えばアプリケーションの実行環境を標準化でき、環境の違いによる問題を減らすことで開発から本番環境へのデプロイ時間を大幅に短縮できます。

Linuxには以前からコンテナ仮想化という技術がありました。この技術を使うと、プログラムを開発・実行環境から隔離することにより、複数のプログラムを素早く実行できます。ただし、この従来型の仮想化技術は、仮想環境を構築するためにホストとなるOS(オペレーティングシステム)に依存する必要がありました。Dockerはこのコンテナ仮想化技術をOSに関係なく簡単に扱えるようにしたソフトウェアといえます。

Dockerの基本概念はイメージとコンテナです。Dockerイメージは、読み取り専用のテンプレートであり、コンテナを作成するための指示が記述されています。たとえば、コンテナで実行するアプリケーションとその依存関係、環境変数、ファイルシステムなどがこれに含まれます。

Dockerでできること

Dockerを使うと、1台のマシン中に複数のコンテナ(仮想環境)をビルドできるため、いくつかの開発環境に対応することができます。つまり、1台のサーバー上で複数のアプリケーションを効率的に動かすことができるのです。アプリケーションの開発環境をDockerで構築すれば、たとえば開発環境(Windows)で動いていたアプリケーションがLinux上で起動しない、といった問題は発生しません。Dockerで構築した環境は、他のデベロッパーとクラウド上で簡単に共有できるため、開発作業がスムーズに進められます。

Dockerイメージとは

Dockerイメージは、アプリケーションを実行するのに必要なソースコードと必要な依存関係をパッケージ化したものです。Dockerコンテナを実行する際には、このDockerイメージが必要です。

Dockerイメージは、コンテナイメージを構成する複数のファイルに、Dockerfile を合わせてビルドします。つまり、Dockerイメージは、手作業で書くのではなく、コマンドを使って作成します。

そのため、Dockerイメージは単一のファイルではなく、Dockerコンテナの実行に必要なパッケージ(ファイルやメタデータの集合体)であることを理解することが重要です。

Dockerコンテナとは

Linuxのコンテナは、アプリケーションを内包し、必要なライブラリや依存関係、ファイルが含まれています。

一方、Dockerコンテナは、Dockerイメージの実行可能なインスタンスです。これはDockerイメージから生成され、アプリケーションを実行するためのランタイム環境です。ただし、ハイパーバイザーを使用する従来の仮想化とは違い、DockerのコンテナはホストOS(オペレーティングシステム)のカーネルで実行されます。Dockerイメージ内には、個別のOSはありません。

Dockerイメージは環境のスナップショットであり、コンテナはソフトウェアを実行する環境といえます。

Dockerfileとは

Dockerfileは文字情報を主体とするファイルで、ファイルの拡張子はありません。Dockerfileには、アプリケーションの構築から実行までのプロセスに必要なコマンドが記述されています。どのファイルをどこから取得して、どんな処理を行ない、Dockerイメージに含めるのかなどを記述します。

Dockerfileは、Dockerイメージを作成するためのテキストファイルです。コンテナイメージをビルドする場合も、コンテナのビルド手順をDockerfileで定義する必要があります。このDockerfileには、命令のスクリプトが含まれており、Dockerはコンテナイメージをビルドする際にこのスクリプトを使用します。

Dockerはなぜ重要なのか

Dockerは、コンテナに関する既存のコンピューティングの概念、とりわけLinuxの「cgroups」や「namespaces」、「overlayfs」などの技術を活用しています。これは、アプリケーションの依存関係をサーバーやネットワークなどのインフラストラクチャから隔離したいという、デベロッパーやシステムオペレーターのニーズに応えるものでした。

Dockerを使うと、1台のサーバー上でさまざまなアプリケーションを簡単に仮想化・実行できるようになります。さらには、ローカルマシンに依存しない開発環境を実現でき(開発環境の統一)、本番環境に近い環境でのシミュレーションが可能になり、アプリケーションの依存関係も管理できます。加えて、ビルド、テスト、デプロイまでの各プロセスを一貫して行なうことができます。

Dockerの主な機能

Dockerは、Linuxのコンテナ技術を使用しています。Dockerコンテナはよく仮想マシンと比較されます。

仮想マシンでは、ホストマシン上でハイパーバイザーを利用してゲストOSを動かし、さらにその上でミドルウェアやライブラリ、さらにその上にアプリなどを実行します。

それに対し、コンテナはホストマシンのカーネルを利用し、プロセスやユーザーなどを隔離します。そのため、非常に軽量で、まるで別のマシンが動いているかのように動作します。その結果、アプリなどを高速に起動、停止することが可能です。

Dockerは、次の4つの構成要素から成り立っています。

  • Dockerイメージ: アプリケーション実行に必要なソースコード、アプリと依存関係のパッケージ
  • Dockerコンテナ: アプリケーションを実行するランタイム環境
  • Docker Hub: クラウド上のレジストリサービス。アプリケーションやサービスコンテナのビルドと配信を行なう
  • Dockerfile: Dockerイメージを作成するために実行するコマンドライン命令を含むテキストファイル

Dockerの特徴

Dockerには、次のような特徴があります。

  • 軽量かつ高速: 1つのOSで複数のコンテナを管理でき、仮想マシンより軽量で高速に立ち上げることが可能。
  • 環境の一貫性が保持でき再現性がアップ: Dockerコンテナは異なるプラットフォームでも一貫して動作するため、ローカル、クラウド、ハイブリッド環境への移行が簡単にできる。 移植性が高い -クラウドシステムとの親和性が高く、主要なクラウドプロバイダーはDockerコンテナの実行をサポートしている。
  • サンドボックスの提供: セキュリティ対策やソフトウェア開発において、隔離された仮想環境でプログラムを実行・検証できる。このため、ホストマシンの環境を守ることができる。
  • IaC(インフラストラクチャのコード化)を使用して、インフラをコード化: Dockerfileによりミドルウェアのインストールや環境設定をコード化して管理できる。

Docker Composeとは

Docker Composeは、複数のDockerコンテナを一元管理する、 Dockerアプリケーションのためのツールです。YAMLファイルを使用してアプリケーションのサービスを設定します。単一のコマンドで複数のサービスをまとめて生成したり、起動・停止したりすることができます。

Docker Composeのコマンド例は次のとおりです。

  • docker-compose up サービス用のコンテナを構築、作成、起動、アタッチします。リンクされているサービスがまだ起動していない場合は、それらも起動します。
  • docker-compose ps Docker Composeで管理されている稼働中のサービスを一覧表示します。
  • docker-compose build Docker Composeファイルで定義されているサービスをビルド(構築)します。

アプリケーションのデプロイにおけるDockerのメリット

アプリケーションのデプロイにおけるDockerのメリットは次のとおりです。

開発環境と本番環境のシームレス化

コンテナ技術の利用を開発環境と本番環境で統一することで、環境の違いにより起こる問題を減らすことができます。その結果、デベロッパーと運用チームとの連携がスムーズに行われ、チーム間で発生していた問題も最小限に抑えられます。

起動の軽量化・処理速度の高速化

Dockerのコンテナ技術は従来の仮想環境より軽く、アプリを瞬時に起動できます。これは、CPUやメモリなどのコンピュートリソースを必要最低限しか使用しないためです。起動速度が上がることで、開発にも集中できます。

バージョン管理のしやすさ

Dockerでは、GitLabなどのソースコードのバージョン管理ツールを使用できるため、バージョン管理の可視化が進むだけでなく、ロールバックやアップデートも簡単に行なえるようになります。

優れたスケーラビリティ

コンテナは軽量で拡張性に優れています。必要に応じて簡単に増減できます。これにより、アプリケーションの拡張やスケーリングを迅速に行なえるため、変わりゆく状況にも柔軟に対応できます。

Dockerのデメリット

Dockerにはさまざまなメリットがありますが、いくつかデメリットも存在します。以下にデメリットを挙げます。

1つのOSを使わなければならない

Dockerは1つのOS上で複数のコンテナを作成します。これにより起動速度や処理速度の面でメリットがありますが、同時にデメリットになることもあります。たとえば、異なるOS環境で検証をしたい場合には、別のマシンや仮想マシンを準備する必要が生じます。

大規模開発時のオーバーヘッド

Docker自体は軽量ですが、大規模システムに拡張する場合には、Dockerの管理に伴う負荷が発生します。Dockerは1台のサーバーで多数のコンテナを実行できますが、その反面、管理やオーケストレーションが必要になり、その処理のためにオーバーヘッドが生じる場合があります。Dockerだけですべての管理を行なうのが困難になることもあります。

技能習得に時間がかかる

Dockerは他の仮想マシンと異なる手法で仮想環境を構築します。つまり、デベロッパーは新しいコンセプトをすべてゼロから習得しなければならず、それには時間がかかります。Dockerの動作原理をきちんと理解せずに使用すると、あとでトラブルや問題が発生することもあります。Dockerについてしっかりと学習してから運用に取り組むようにしましょう。

セキュリティに脆弱性が生じることもある

Dockerはコンテナ型アーキテクチャです。1台のマシン上で複数のコンテナが動作するため、このことに起因する脆弱性には注意が必要です。たとえば、複数のコンテナがホストOSのリソースやカーネルを共有しているため、一つのコンテナに脆弱性があった場合、全体にその影響が及ぶ可能性があります。

コンテナ間での連携が難しい

複数のコンテナ間での連携を検討している場合、各種設定が難しいために、運用時に問題が発生することがあります。たとえば、アプリとデータベースを別のコンテナで作成し、一緒に運用したい場合には、同一ホスト内で通信設定をしなければなりません。ポートやソケットを開放する場合にはセキュリティ面でリスクが生じます。それを避けるために設定を複雑にしてしまうと、今度は運用面で問題が起きる恐れがあります。コンテナを連携させる際は、設計段階から十分に検討することが重要です。

GitLabはDockerが抱える課題をどのように解決するのか

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を活用したDevSecOpsインテグレーションにおいても、Dockerは非常に大切な役割を担っています。

CI/CDジョブのコンテナ化

GitLab CI/CDでは、CI/CDパイプラインでDockerコンテナを使用することで、次のようなことが可能になります。

  • 一貫性: CI/CDジョブはコンテナ内で実行されるため、依存関係や環境の違いによるエラーが防げます。
  • スケーラビリティ: コンテナは軽量かつ迅速に起動でき、大規模なパイプラインでも効率的に実行できます。
  • 環境の柔軟性: ジョブごとに異なるDockerイメージを指定できるため、必要な環境を簡単に準備できます。

GitLab RunnerのDockerイメージは、UbuntuまたはAlpine Linuxをベースにしています。Dockerイメージは標準のgitlab-runnerコマンドを内包しており、ホストに直接GitLab Runnerをインストールしたかのように動作します。

セキュリティスキャンの自動化

セキュリティはDevSecOpsでの重要な要素であり、Dockerはこれをサポートします。

  • コンテナイメージのセキュリティスキャン: GitLabには、CI/CDパイプラインでDockerイメージをスキャンする機能があります。このスキャンにより脆弱性がチェックされ、イメージ内の依存関係やコードの安全性を評価できます。
  • コンテナ脆弱性スキャンの自動化: GitLabにはTrivyやAquaなどのセキュリティツールを統合できます。DockerイメージのOSやアプリケーションが最新であるか、既知の脆弱性がないかをチェックします。

IaC(インフラストラクチャのコード化)と環境管理

  • 再現性: DockerをGitLabのCI/CDジョブ内で使用することで、開発環境と本番環境の整合性を保つことできます。
  • ステージングやテスト環境を即時に構築: Docker ComposeやKubernetesと連携することで、特定のブランチやマージリクエストごとに分離された環境をGitLabで作成できます。これにより、テストやセキュリティスキャンを効率的に実行できます。

デプロイの効率化

GitLabは、Dockerを使用する以下のデプロイパターンをサポートしています。

  • Dockerイメージのビルドとプッシュ: アプリをコンテナイメージとしてビルドして、GitLabのContainer Registryや他のDockerレジストリにプッシュします。
  • 継続的デリバリー: Dockerイメージを使ってコンテナオーケストレーションツールにデプロイすることで、迅速で安全なリリースが可能になります。

マイクロサービスアーキテクチャのサポート

GitLabとDockerを組み合わせることで、マイクロサービスアーキテクチャを簡単に構築できます。マイクロサービスは別々のDockerコンテナとして実行します。GitLab CI/CDパイプラインを使うと、以下のことを管理できます。

  • サービス間の依存関係の設定
  • 個別のセキュリティスキャン
  • バージョン管理(ロールバックが容易になります)

まとめ

2013年の公表以来、Dockerは瞬く間にIT業界に広く普及しました。本記事では、Dockerの基本概念、基本技術、Dockerを使って何ができるのか、なぜDockerが重要なのか、Dockerを理解上でよく目にする用語などについて紹介してきました。

Dockerを使う場合には、DevSecOpsにとって大切なCI/CDを実現するためにも、GitLab CI/CDなどの自動化ツールの導入をおすすめします。GitLab のCI/CDパイプラインでDockerコンテナを使用することで、開発における一貫性の維持、スケーラビリティの実現、柔軟な環境の準備が可能になります。

FAQ(よくある質問)

Dockerで何ができるのか?

Dockerコンテナは、軽量でスタンドアロンの仮想化技術であり、アプリケーションコード、その依存関係、ライブラリをすべてパッケージ化します。Dockerを使うと、1台のマシン上に複数のコンテナ(仮想環境)を構築でき、開発環境や検証環境の統一が図れます。詳しくは、記事の本文をご覧ください。

Dockerは何に使うのか?

Dockerは、デベロッパーがアプリケーションとその依存関係をシステムから切り離したいとき使用します。コンテナにはアプリケーションとその依存関係がまとめられており、軽量な実行環境を提供します。詳しくは、記事の本文をご覧ください。

Dockerコンテナとは何ですか?

Dockerイメージが実行時にコンテナになります。Dockerコンテナは、アプリケーションを実行するためのランタイム環境です。Dockerコンテナに関する詳細は、記事の本文をご覧ください。

監修:川瀬 洋平 @ykawase

(GitLab合同会社 カスタマーサクセス本部 シニアカスタマーサクセスマネージャー)

ご意見をお寄せください

このブログ記事を楽しんでいただけましたか?ご質問やフィードバックがあればお知らせください。GitLabコミュニティフォーラムで新しいトピックを作成して、ご意見をお聞かせください。

フォーチュン100企業の50%以上がGitLabを信頼

より優れたソフトウェアをより速く提供

インテリジェントなDevSecOpsプラットフォームで

チームの可能性を広げましょう。