【Dockerとは?】機能概要から利用開始方法を紹介!〜仮想環境構築で環境共有をより容易に〜
このページではDockerについて解説をします。Dockerが誕生した背景から、Dockerを学習する上で必須な単語の紹介、実際にインストールをして動作させるまでを紹介いたします。
Dockerとは?
Dockerの公式説明は以下のとおりです(日本語訳)。
Docker は、アプリケーションを開発、配布、実行するためのオープン プラットフォームです。 Docker を使用すると、アプリケーションをインフラストラクチャから分離できるため、ソフトウェアを迅速に配信できます。 Docker を使用すると、アプリケーションを管理するのと同じ方法でインフラストラクチャを管理できます。コードの配布、テスト、デプロイに Docker の方法論を利用することで、コードを作成してから本番環境で実行するまでの遅延を大幅に短縮できます。
この説明では何が何なのかよくわからないため噛み砕いて説明をいたします。
Dockerはコンテナというものを用いてソフトウェアの開発から配布・実行までを行うことができるソフトウェアパッケージです。
また、一般にDockerというとDockerエンジンのことを指すことが多いです。Dockerエンジンとは主にDocker CLIなどのDockerクライアントとDockerデーモンで構成される、クライアント・サーバー型のアプリであり、クライアントからサーバーのAPIへアクセスすることでさまざまな操作を行うことができます。
動作の流れは上の概要図のようになっています。 docker pull
, docker run
などのコマンド実行によってDocker Daemonにリクエストを送信します。Docker Daemonで必要なイメージ等をダウンロードするためにコンテナレジストリへとアクセスしてその結果をHTTPレスポンスとしてDockerクライアントへ返しています。
コンテナとは?
(Docker)コンテナとは、独立したソフトウェアの実行環境のことです。アプリケーションを実行するために必要なコード、ライブラリなどをまとめたもので異なる環境状で一貫した動作をします。
この「独立した」というのがDockerが便利な理由な1つです。複雑なシステム・アプリケーションの場合1箇所の設定を変更しただけで複数箇所で不具合・予期しない挙動を引き起こす可能性があります。しかしコンテナは独立しているため既存の開発環境へ影響を与えません。
また、コンテナはイメージにより生成されるものなのでイメージを配布すれば複数人で同様の環境を共有できる。仮に開発環境を破壊してしまったとしてもイメージからコンテナを再生成すれば修正に時間がかかることもありません。
Dockerが登場する前から仮想マシンという考え方や実現するためのソフトウェアは存在していましたが、OSごとのイメージをインストール必要がありました。このOSイメージは非常に容量が大きいことが課題としてあげられました。また、仮想マシンではOSを起動する必要があり作成から起動まで時間がかかってしまうことや設定を間違えてしまった場合の修正が大変などの課題が多くありました。
こういった課題を解決するためにDockerが開発されました。次のセクションからDockerを利用することのメリットについて更に深ぼっていきます。
Dockerを利用するメリット
Dockerを利用する最大のメリットは先も述べたように「複数の実行環境で同一の開発環境を用意する事ができて環境構築にかかる時間を短縮できる」ことです。複数人の開発者の間でだけでなくテスト環境、本番環境でも全く同じように動作をします。これは先程述べた独立性に起因しています。
もう一つのメリットは「デプロイを容易にする」ということです。Dockerイメージを用いることで、アプリケーションとその依存関係を一つのパッケージにまとめることができ、それを任意のDockerがインストールされている環境に簡単に配布・実行することが可能です。小さく独立したサービスを個別のコンテナとして開発・デプロイすることで、アプリケーションの管理が簡単になり、スケールアウトやアップデートも柔軟に対応できるようになりマイクロサービスアーキテクチャの実現にも役立ちます。
実際にDockerをインストールして使う
ここからは実際にDockerを利用する手順について紹介をしていきます。Dockerを初めて触る人からすると何をやっているのかわからないことも多いと思います。曖昧な理解のままサービスを利用することは、予期せぬ事故につながることもあるためしっかりとした理解をしたい人は公式のチュートリアル等を行うことをおすすめします。
今回は2024年1月25日にリリースされたDocker Initを使います。
Docker Initとは
Docker Initとは、DockerやDocker Composeのための設定ファイルである Dockerfile
や、 Compose.yaml
等を自動で生成してくれるコマンドのことです。
これまでは開発者自身が設定ファイルを記述する必要がありましたがこのコマンドにより自動生成をしてくれて手間を省きエラーを減らしてくれます。Docker Desktop 4.27ではGo, Python, Node.jsなどがサポートされています。
詳細につきましては、以下のDocker社の記事を御覧ください。
Docker Initを使って環境構築をする
それでは実際にDocker Initを用いて環境構築をしていきましょう。
- ターミナルでDockerをインストールしたいプロジェクトへ移動します。
docker init
コマンドを実行します。$ docker init Welcome to the Docker Init CLI! This utility will walk you through creating the following files with sensible defaults for your project: - .dockerignore - Dockerfile - compose.yaml - README.Docker.md Let's get started! ? What application platform does your project use? [Use arrows to move, type to filter] Go - suitable for a Go server application Python - suitable for a Python server application Node - suitable for a Node server application Rust - suitable for a Rust server application ASP.NET Core - suitable for an ASP.NET Core application PHP with Apache - suitable for a PHP web application Java - suitable for a Java application that uses Maven and packages as an uber jar > Other - general purpose starting point for containerizing your application Don't see something you need? Let us know! Quit
- プロジェクトで使用する言語を聞かれますので環境へ合わせて選択します。
今回はNode
を選択しました。 Node
を選択した場合、Node.jsのバージョンを聞かれますので使いたいバージョンを入力します。- その後、パッケージマネージャに何を使うのか聞かれるのでnpm, yarn, pnpmの中から好きなものを選びます。
$ docker init Welcome to the Docker Init CLI! This utility will walk you through creating the following files with sensible defaults for your project: - .dockerignore - Dockerfile - compose.yaml - README.Docker.md Let's get started! ? What application platform does your project use? Node ? What version of Node do you want to use? 21.5.0 ? Which package manager do you want to use? [Use arrows to move, type to filter] > npm - (detected) yarn pnpm
- プロジェクトで使用する言語を聞かれますので環境へ合わせて選択します。
- その後はアプリケーションを立ち上げるためのコマンドとサーバーのポート番号を聞かれるので任意のものを入力して完了です。
最終的なファイル構成は以下のとおりです。
.
├── Dockerfile
├── README.Docker.md
└── compose.yaml
npm init, install
をして docker build -t {app_name} .
とすることで実際にDockerイメージをビルドすることができました。本当に簡単にできて驚きました。
終わりに
いかがでしたでしょうか。DevOpsにおいて必要不可欠と言われているDockerについて説明をしてきました。Docker Initの登場により更にDockerが手軽で便利なものになりそうですね。