【触って理解!】Docker入門 - 初心者に向けて使い方や基本コマンドを解説
Dockerの導入方法や基本的なコマンドの使い方について解説しています。これからDockerを利用した開発をする予定の方もぜひご確認ください。
Dockerの導入方法や基本的なコマンドの使い方について解説しています。これからDockerを利用した開発をする予定の方もぜひご確認ください。
スキルアップ
2023/02/22 UP
- プログラミング
- SE資格・スキル
- 入門
コンテナ仮想化技術であるDocker(ドッカー)が開発の現場で注目を浴びています。従来のハイパーバイザ型とは違い、より軽量で気軽に扱えるDockerは今後もどんどん利用されていくと考えられます。
ここでは、Dockerの導入方法や基本的なコマンドの使い方について解説しています。これからDockerを利用した開発をする予定の方もぜひご確認ください。
Dockerとは
Dockerは、コンテナ型の仮想化プラットフォームです。従来の仮想化技術であるハイパーバイザ型と違い、ゲストOSが不要であるという特徴があります。現在、Dockerは開発時に利用するのはもちろんのこと、AWS等のクラウド上にデプロイして本番利用することも一般的となっています。
コンテナ型の仮想化プラットフォーム
「コンテナ型の仮想化プラットフォーム」と聞いただけではすぐに理解するのは難しいでしょう。まずは、「コンテナ」と「仮想化」について説明をしていきます。
「コンテナ」という用語は貨物を輸送するためのコンテナに由来しています。本来のコンテナは内部に物を収納する容器ですが、この容器の規格が明確に定められています。何故かというと、様々な業者がコンテナを使って物を運ぶにあたり、規格が定まっていた方が扱いやすいからです。
Dockerにおける「コンテナ」も似たような考えです。アプリケーションやサーバーを「コンテナ」という規格が定まった容器に収納することで、他の環境でも利用しやすくしているのです。
「仮想化」とは簡単にいってしまうと、動作しているOSの上で、もう1つのOS・サーバーを立ち上げることです。この際、元のOSを「ホストOS」、ホストOS上で動作しているOSを「ゲストOS」と呼称することがあります。
Dockerは、輸送しやすい「コンテナ」を「仮想化」を利用した環境で動作させることができるアプリケーションということになります。
ハイパーバイザ型との違い
Dockerのコンテナを用いた仮想化技術と比較されるのが、ハイパーバイザ型の仮想化技術です。従来は、このハイパーバイザ型が主流でした。ハイパーバイザ型の仮想化技術を利用したアプリケーションとしては、VirtualBox、Hyper-V、Parallels Desktopなどがあります。
このハイパーバイザ型とコンテナの違いは、ホストOS上でゲストOSを起動させるかどうかという点になります。
・ハイパーバイザ型とは
ハイパーバイザ型では、ホストOS上に新たなOSであるゲストOS立ち上げます。その上で、アプリケーションやミドルウェアなどを起動します。あるOSの上にもう1つのOSを立ち上げるので、オーバーヘッド(余分に必要となるリソース)が高いといえます。
・Dockerとの違い
一方、Dockerのコンテナ技術では、ホストOSの上にもう1つのOSを起動させることはしません。前項で特定のOSの上に新しいOSを起動させることが「仮想化」といいましたが、コンテナでは新しいOSを立ち上げることはしません。
Dockerの目的は、コンテナ化したアプリケーションを、他の環境に移行して動作できるようにすることです。つまり、わざわざ新しいOSを用意する必要はないということです。
DockerではOSのメイン機能である「カーネル」と呼ばれる部分を、ホストOSとコンテナ間で共有することで、オーバーヘッドの軽減を図っています。そのため、軽量で高速に動作するといわれています。
Dockerのエコシステム
Dockerには、Dockerでの開発を助けるエコシステムがあります。ここではDocker HubやDocker Compose、Kubernetesについて簡単に紹介します。
・Docker Hub
Docker Hubは、GitHubのようにDockerのイメージ(コンテナの元となるデータ)を共有することができるサービスです。自身で作成したDockerイメージをクラウド上にアップロードして、他人に共有することができるのはもちろんのこと、他人が作成したDockerイメージをダウンロードして利用することも可能です。
・Docker Compose
Docker Composeは、複数のコンテナを同時に利用するようなアプリケーションにおいて、複数のコンテナの連携を実現させるツールです。アプリケーションサーバーとデータベースサーバーのコンテナを動作させて連携させたい、というようなケースに適しています。
・Kubernetes(クーベネティス)
コンテナに関連してKubernetes、略してk8sなどとも呼ばれるオープンソースのプラットフォームが存在します。Kubernetesは、複数のコンテナを利用する複雑なアプリケーションの管理を容易にする技術です。簡単にいってしまうと、Docker Composeよりも複雑なことができるアプリケーションです。
詳しくはKubernetesへの記事もご参照ください。
Kubernetesとは?コンテナオーケストレーションの定番OSSをメリット含めて解説
【初心者に向けて】Dockerで使用される用語集
ここまで、Dockerについて概要を解説してきましたが、Dockerには既存のシステム開発にはない用語が多数出てきます。ここでは初心者の方に向けて、Dockerを実際に触っていく際に覚えておくべき用語について簡単に紹介します。
名称 |
説明 |
---|---|
Docker Engine |
コンテナ化及びコンテナを動作させるためのアプリケーションで、Dockerの核となる部分です。 |
コンテナ |
Docker上で動作するアプリケーションの単位です。 |
Docker image(イメージ) |
コンテナを作成するための依存関係や情報を含むデータです。コンテナはこのイメージが元になって作成されます。 |
Dockerfile |
Docker imageをビルドするための手順が記載されたファイルです。自身でDocker imageを作成したい場合は、こちらのファイルを作成する必要があります。 |
Dockerの特徴
Dockerの特徴としては、インフラをコード化することができる「Infrastructure as a Code」と安定的に稼働することができる「Immutable Infrastructure」の2つがあります。
Infrastructure as a Code
クラウドコンピューティングや仮想化が主流になる前までは、オンプレミス環境でインフラを構築しなければなりませんでした。オンプレミス環境は、サーバーを用意し、OSをインストール、その後、アプリケーションサーバー・DB等のミドルウェアをインストール、といった形で作業が多く非常に大変で、時間もかかります。加えて、少しでも設定を間違ってしまうと、正しくアプリケーションが動作しない、という事態に陥ってしまいます。
Infrastructure as a Codeは、こうした環境を改善するため、インフラをコード化してしまおうという考え方です。Infrastructure as a Codeでは、サーバー・ネットワーク・ミドルウェア等のアーキテクチャを事前にコードに落とし込んでおき、それを実行することで、ミスなく、作業の手間も大幅に軽減してインフラを構築することができます。
Dockerでは、Dockerfileを利用することで、コマンドラインで環境を用意することができます。例えば、次のようなコードを記述することで、centos7を立ち上げて、yumでphpをインストールするといったことが可能です。
FROM centos:7 RUN yum install -y php
Immutable Infrastructure
Immutable Infrastructureとは直訳すると「不変のインフラ環境」となります。これは一見不自由そうに思えますが、必ずしも悪いことではありません。アプリケーション開発者にとってはインフラの差異を気にする必要がないといった点で非常にありがたいともいえます。
Dockerの運用概念としてこのImmutable Infrastructureがあり、セットアップしたサーバーに、後から変更を加えないようにすることで、安定的に運用できるようになります。
例えば、phpのバージョンを上げたい時に、従来であれば、テスト環境でテストするなどした後、最終的に稼働中のサーバーのバージョンを直接上げることがあります。しかしこれはセットアップしたサーバーに変更を加えることになるため、Dockerの運用概念に反します。
ではDockerの場合どうするかというと、上述のDockerfileを書き換えて立ち上げ直します。つまり、変更を加えるのではなく新しいサーバーを立ち上げ直す、ということを行います。
Dockerをインストールしてみよう
ここからは、実際にDockerをインストールして、基本的なコマンドの使い方を説明します。インストールが完了するとDockerのデーモンが起動した状態になりますので、その時点でdockerコマンドが利用できる、つまりDocker Engineが利用できる状態となります。
この記事ではMac、Windowsの両方のインストール手順を記載していますので、ご利用のOSに合わせた方法を参考にしてください。
Macの場合
まずは、公式サイトからインストーラーを入手します。「Get Docker Desktop for Mac」をクリックしてインストーラーをダウンロードします。ダウンロードされたファイルはdmgファイルなので、ダブルクリックをすることで通常のアプリケーションと同様にインストールを進めることができます。
MacのステータスバーにDockerマークが表示されていれば、インストールが完了して、Docker Engineが起動している証しです。
Windowsの場合
こちらもおなじく公式サイトからインストーラーを入手します。「Get Docker Desktop for Windows」をクリックしてインストーラーをダウンロードします。ダウンロードされたファイルをダブルクリックすることで、通常のアプリケーションと同様にインストールを進めることができます。
インストール完了後、コマンドラインを開き下記を入力してバージョンが表示されれば、インストールが完了したことが確認できます。
【動作確認】Dockerが動くか確認
Macをお使いの方はターミナル、Windowsの方はコマンドラインを開きコマンドを実行してみましょう。
//インストールされたDockerのバージョンを確認 docker version
現在インストールしているDocker Engineのバージョン情報等が表示されます。
//動作しているコンテナの確認 docker ps
動作させているコンテナの一覧が表示されます。インストール直後は動作しているコンテナが存在しないので、何も表示されない可能性があります。停止しているコンテナを表示させたい場合は、-aのオプションを付けてコマンドを実行させてください。
//停止中を含めたコンテナの一覧の表示 docker ps -a
// イメージの確認 docker images
このコマンドを実行させることで、現在取得済みのイメージの一覧を表示させることができます。このイメージを元にコンテナを作成することができます。
なお、以下のコマンドにてイメージをローカルに取得することができます。
//イメージの取得 docker pull [Image名]
【使い方】Dockerで何か動かしてみよう
ここでは、公式に用意されているhello-worldのイメージを使い、Dockerのコンテナを動作させてみましょう。以下のように、実行するコマンドの説明をします。また、適宜、基本的なdockerコマンドの使い方も解説していきます。
//Dockerを実行してみる docker run hello-world
Hello from Docker!という文言が表示されると成功です。これでDockerコンテナの動作は完了しました。
ここでは、以下の3つが順番に実行されたことになります。
1. hello-worldのDockerイメージの取得
2. 取得したイメージを元にコンテナの作成
3. 作成されたコンテナの起動
もう少し詳しく見ていきましょう。
docker run hello-worldの解説
先ほど1行で動作したhello-worldですが、上述の通り実際には3つの処理が走っています。ここではその3つについて順番に解説していきます。
・hello-worldのDockerイメージの取得
コンテナの元はイメージです。このイメージがダウンロードされていないとコンテナを作成することはできません。そのため、まずはイメージをダウンロードする必要があります。
docker run hello-worldでは、ローカルにhello-worldのイメージが存在しない場合、Docker Hubからイメージの取得を行う処理が走ります。
どのようなイメージがDocker Hubに登録されているかはdocker searchコマンドを使って調べることができます。以下のコマンドを実行してみましょう。
// hello-worldイメージの検索 docker search hello-world
ここで表示されたイメージを取得する場合はdocker pullコマンドを使います。
// hello-worldイメージの取得 docker pull hello-world
なお、先ほどのdocker run hello-worldを実行後であれば、事前に実行済みのため、このコマンドは不要です。他のイメージを使いたくなった場合にはdocker pullにてイメージを取得しましょう。
ここで取得したイメージの一覧は、docker imagesにて確認できます。
・取得したイメージを元にコンテナの作成
イメージ取得後はコンテナの作成と起動が必要です。これらを実行する際はdocker runコマンドを利用します。
// hello-worldイメージからコンテナを作成し、実行 docker run hello-world
先ほど、作成されたコンテナはdocker psコマンドで確認できると説明しました。コマンドを実行してコンテナの一覧を取得してみましょう。
// コンテナの一覧を表示 docker ps
しかし、実はここでは作成されたコンテナは表示されません。docker psコマンドは”動作中の”コンテナを表示するコマンドであり、停止中のコンテナは表示されないためです。
hello-worldのコンテナは起動後、一連の処理を実行すると停止してしまうコンテナです。そのため、停止中のコンテナも含めて一覧を確認するコマンドを実行しましょう。
// 停止中を含めたコンテナの一覧表示 docker ps -a
初心者でもDockerは難しくない!
コンテナを利用することで、環境の差異を気にせずアプリケーションの開発を進めることができます。そのため、Dockerの利用を前提とした開発は今後も加速すると予想されます。周辺のエコシステムもそろってきています。Docker HubやDocker Composeだけでなく、Kubernetesなどの連携するためのツールも増え来ています。
Dockerは、エンジニアとして開発に携わる中で、今後より重要性が増してくると考えられます。また、難しいと考えられがちなDockerも実は慣れてしまえばそこまで複雑に感じない、シンプルなアーキテクチャになっています。そのため、Docker自体を運用ができるレベルまでいかなくとも、開発関環境を整えて、実際に開発できるレベルまでは知識を持っておくとよいでしょう。