Dockerとは?手を動かしながら実感できる|実例付きで解説

※本サイトにはプロモーション・広告が含まれています。

(最終更新日:2023年10月)

✔この記事は以下のような方向けです

「Dockerの機能とは何だろう?」
「Dockerの使い方を学びたい」
「Dockerの具体的な活用例を知りたい」

✔この記事で得られる知識

  • Dockerの基本概念
  • Dockerの操作方法とその利用の幅広さ
  • Dockerの実例

今回の記事では、Dockerの基本情報から、その多機能性を最大限に活用するための方法まで、具体的な例を交えてわかりやすくご紹介します。

ぜひ最後までお読みいただき、Dockerの可能性を存分に体感してください。

動画でも解説してます。動画では実際にコンテナを動かしている様子が見れるので、初めての方でもイメージが湧きやすいはず。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

Docker入門:なぜDockerが必要なのか?

こちらでは、Docker学習の必要性について、お伝えしていきます。

  • Dockerとは
  • Dockerのメリット
  • 従来の仮想化技術とDockerの違い
  • Dockerの具体的な利用例

Dockerの定義とそのメリット

Dockerは、オープンソースのコンテナ化技術。

アプリケーションとその依存関係を、ひとつの「コンテナ」にパッケージ化します。

ソフトウェアを安全かつ一貫性を持って実行できるものです。

Dockerのメリット

Dockerの最大のメリットは、「自分のマシンでは動いたのに…」という問題を解消すること。

なぜ解消できるかというと、パッケージ化により、開発やテスト、本番環境間で同一の環境を提供できるから。

軽量性も大きな特徴で、仮想マシンよりも早く起動し、使用するリソースも少ないです。

従来の仮想化技術とDockerの違い

従来の仮想化技術は、PCのリソースを多く使います。

なぜなら仮想マシンは以下のような仕組みだからです。

  • 物理的なハードウェアリソース上に複数の仮想マシンを立ち上げる
  • 各仮想マシンにOSをインストールし、アプリケーションを動かす

例として以下は、著者のPCでVirtualBox(仮想マシン)を起動した際のCPU・メモリ専有率がわかるものです。

常時このような状態ではありませんが、かなりのリソースを使っているのがわかります。

対してDockerは、OSを共有しつつ、アプリケーションとその依存関係をコンテナにパッケージ化します。

必要なリソースが大幅に少なくて済み、立ち上がり速度も速いのが特徴です。

上記のような画面にも出てこないくらい小さいリソース占有率になります。

Dockerの具体的な利用例

Dockerの利用例は多岐にわたります。

例えばWebアプリケーションの開発においては、DBやバックエンド、フロントエンドをそれぞれ異なるコンテナで動かし、それらの連携が可能です。

また機械学習の分野では、環境設定が難しいライブラリやツールをDockerコンテナにパッケージ化することで、誰でも簡単にそのツールを使えるようになります。

Dockerを使い始める:インストールまでの手順

ここではDockerのインストールから基本的な動作確認方法までを解説します。

  • Dockerのインストールガイド
  • sudoなしでDockerの実行を行う方法
  • インストール後のDocker動作確認手順

Dockerのインストールガイド

Dockerは、WindowsやMac、Linuxなど主要なOS上で操作可能です。

それぞれに合わせたインストール方法がありますので、以下を参考に自身の環境にインストールしましょう。

sudoなしでDockerの実行を行う方法

Dockerを使いこなすには、現在ログインで使用しているユーザーをdockerグループに追加する必要があります。

なぜならデフォルトでは、Dockerの実行には、sudo権限が必要だからです。

この操作は、ユーザの権限管理を容易にするだけでなく、コマンドの入力を簡単にするメリットもあります。

$ sudo gpasswd -a $USER docker
ユーザ ユーザー名 をグループ docker に追加
$ sudo systemctl restart docker

インストール後のDocker動作確認手順

Dockerのインストールが成功したか確認するためには、以下の2つを試しましょう。

バージョンを確認する

docker version

ターミナルから”docker run hello-world”コマンドを実行する

docker run hello-world

それぞれ正しく表示されれば、Dockerのインストールに問題はありません。

詳しくはこちらの記事をどうぞ。

Dockerのキーコンセプトを理解する

こちらでは、Dockerを理解し、効果的に使用するための重要な概念を説明します。

  • Dockerコンテナについて
  • Dockerイメージの理解
  • Dockerfileの役割
  • Dockerレジストリ(DockerHub)の活用

Dockerコンテナについて

Dockerコンテナは、アプリケーションとその依存環境を一体化したものです。

コンテナにより、どの環境でも、アプリケーションが同じように動作できます。

これは一種のランタイムであり、ソフトウェアやライブラリ、環境変数など、アプリケーションが動作するために必要な全てを含んでいます。

Dockerイメージの理解

Dockerイメージは、コンテナの「設計図」で、Dockerコンテナの作成に用いられます。

イメージには以下が含まれています。

  • アプリケーションのコード
  • ランタイム
  • ライブラリ
  • 環境変数
  • 設定ファイル

Dockerイメージはレイヤーで構成され、それぞれのレイヤーは読み取り専用です。

Dockerfileの役割

Dockerfileは、Dockerイメージを作成するためのテキストファイルです。

このファイルには、ベースとなるイメージや新たにインストールするパッケージ、設定変更の手順などが記述されています。

# ベースイメージとしてのNode.jsを指定
FROM node:14

# アプリケーションのディレクトリを作成
WORKDIR /usr/src/app

# アプリケーションの依存関係をインストール
# package.jsonとpackage-lock.jsonの両方があれば、以下のコピー
COPY package*.json ./

# 依存関係のインストール
RUN npm install

# アプリケーションのソースをバンドルする
COPY . .

# アプリがリッスンするポートを指定
EXPOSE 8080

# コマンドを定義
CMD [ "node", "server.js" ]

DockerfileからDockerイメージを生成する際には、”docker build”コマンドを使用します。

試してみよう。以下のようなフォルダツリーで、各ファイルにはそれぞれのコードをコピペしてみてください。手順通りに実行すると、ブラウザでlocalhostにアクセスすると、Hello, World!!が表示されるはず。

ファイルツリーが以下のようになるようにします。

project-root/
├── Dockerfile
├── package.json
├── package-lock.json
└── server.js

package.jsonに以下を書き込み、「npm i」を実行します。

{
    "name": "my-app",
    "version": "1.0.0",
    "description": "A sample Node.js app",
    "main": "server.js",
    "scripts": {
        "start": "node server.js"
    },
    "devDependencies": {
        "express": "^4.18.2"
    }
}

server.jsのコードはこちら。

const express = require('express');
const app = express();
const port = 8080;

app.get('/', (req, res) => {
  res.send('Hello, World!');
});

app.listen(port, () => {
  console.log(`Server is running on http://localhost:${port}`);
});

プロジェクトディレクトリ内で以下のコマンドをそれぞれ実行しましょう。

docker build -t my-app .
docker run -p 80:8080 my-app

ブラウザでlocalhostにアクセスすると、以下のとおり。

ブラウザからのアクセスをポート80に設定しています。もし現在のPCでApacheやNginxの設定をしていると上手く動作しない可能性があります。対象のサーバーをストップするか、docker runで、別のポートを指定して、ブラウザからもlocalhost:指定したポート、でアクセスしてみてください。

docker run -p 8080:8080 my-app

Dockerレジストリ(DockerHub)の活用

Dockerレジストリは、Dockerイメージの保管庫。

DockerHubはそのひとつで公開されているクラウドベースのレジストリサービスです。

この保管庫に存在する無数の公開イメージを、誰でもダウンロードして使用できます。

また自身で作成したDockerイメージをアップロードし、ほかの人と共有することも可能です。

Dockerの操作を覚える:主要コマンドの解説

ここでは、Dockerを操作する上で必要となる主要なコマンドについて解説します。

  • コンテナ操作に必要なコマンド
  • Dockerイメージの管理とDockerレジストリ(Dockerhub)利用の為のコマンド
  • Dockerイメージ作成:Dockerfileからの手順
  • Dockerのその他有用なコマンド

コンテナ操作に必要なコマンド

Dockerコンテナの操作には、数多くのコマンドがありますが、最も基本的なものは以下の3つ。

  • docker run:コンテナの作成と起動
  • docker ps:稼働中のコンテナのリスト表示
  • docker stop:コンテナの停止

今は頭に入れておくだけでもOK。

今後詳しく見ていきましょう。

Dockerイメージの管理とDockerレジストリ(Dockerhub)利用の為のコマンド

Dockerイメージの作成、削除、取得を行うための基本的なコマンドはこちら。

  • docker build:Dockerfileからイメージを作成
  • docker rmi:指定したイメージを削除
  • docker pull:レジストリからイメージをダウンロード

イメージにまつわるコマンドも多用するので覚えておきましょう。

Dockerイメージ作成:Dockerfileからの手順

DockerイメージはDockerfileから作成されます。

docker build -t イメージ名: タグ名 Dockerfileの場所

「docker build」コマンドで、Dockerfileのあるディレクトリを指定すると、そのDockerfileに従ったイメージが生成されます。

docker build -t myimage:1.0 .

カレントディレクトリ(最後の「.」)のDockerfileに基づいて、myimageという名前の1.0というタグのDockerイメージが作成されます。

Dockerのその他有用なコマンド

Dockerにはさらに多くの便利なコマンドがあります。

  • docker logs:コンテナのログを表示
  • docker exec:稼働中のコンテナでコマンドを実行
  • docker inspect:コンテナやイメージの詳細な情報をJSON形式で取得

Dockerを使いこなすために必要なコマンドといえるでしょう。

Dockerの応用:高度な利用方法

Dockerの更なる応用例を以下に紹介します。

  • Docker Composeを経由した複数コンテナの操作
  • コンテナ間通信の実現

Docker Composeを経由した複数コンテナの操作

Docker Composeは、複数のコンテナを定義し、管理するためのツールです。

yaml形式のファイルにサービスの設定を書くと、ひとつのコマンドで複数のコンテナを同時に起動したり、停止したりすることが可能になります。

例えば、Webサーバーとデータベースサーバーを連携させたアプリケーションを動かす際には、Docker Composeを使用すると非常に便利です。

yamlファイルについては以下の記事で詳しく解説しています。

コンテナ間通信の実現

Dockerでは、複数のコンテナ間で通信をおこなうためのネットワーク機能が提供されています。

同一ネットワークに接続されたコンテナ間は、コンテナ名で互いを認識し通信をおこなえるのです。

分散システムの構築やマイクロサービスアーキテクチャなど、複雑なシステム設計が容易になります。

まとめ

当記事を通じて、Dockerの基本的な操作から高度な利用方法までを解説しました。

Dockerは開発からテスト、デプロイまでの一連のフローを効率化する強力なツールです。

その活用は、ソフトウェア開発の品質と速度を向上させるでしょう。

初心者から経験者まで、今すぐDockerを使って効率的な開発環境を構築し、開発プロセスをスムーズに進めてください。

タイトルとURLをコピーしました