Dockerを理解する
Dockeとは
コンテナ型の仮想環境を作成、配布、実行するためのプラットフォームです。
意味わからないので、下の画像を見て理解して見ましょう。
Dockerは仮想マシンと比較して扱われることが多いため仮想マシンとDockerを比較する画像を用意しました。
ここで共通しているのは、皆さんが持っているPCの中にもう一つ違う環境を作るということです。これが仮想環境です。のちに詳しく説明していますが、これにより開発環境をチーム間で統一できるようにしています。
仮想マシンとDockerとの大きな違いはホストOS内にもう一つのOSが存在するか存在しないかです。仮想マシンの場合、ホストOSの内部で別のOSを動かさないといけないため処理として重くなる傾向にあります。それと違い、DockerではOSはホストOSのみです。(そもそも1つしか存在しないのでホストもクソもないですが、、、)つまり、皆さんが持っているPCに元々入っているOSを使って仮想環境(コンテナ)を構築できるため、処理が仮想マシンに比べて軽いということです。
また、仮想マシンはハイパーバイザーというソフトウェアを利用して複数のOSの環境を構築しています。なのでハイパーバイザに依存しています。このため、別のハイパーバイザーへの移植性が低いというのも特徴としてあります。その点、 Dockerコンテナは独立して動作し、ほぼどの環境でも同じように実行できるため、高い移植性を持ちます
なぜこのような仮想化ということをしないといけないのでしょうか?それはこの世にあるアプリケーションの開発は複数人で行う、チーム開発がほとんどだからです。私たちはGitというツールとGitHubというプラットフォームを使うことで、コードの管理を行うことができます。ライブラリのバージョンなどチームメンバー間で差異が出ないようにすることも目的としています。しかしこれだけでは、チーム間に完全な差異のない開発環境を提供することができません。チームメンバーによってはMacを使っていたりWindowsを使っていたり、ローカルにインストールされているソフトウェアも異なります。実際にMacでは動くけど、Windowsでは動かないといったものも数多く存在しています。この使っているマシンなどによる環境開発の差異をなくすことも非常に大切です。
これを解決してくれるのがDockerです。
Docker File
DockerではDocker Fileというものを作成することができます。Docker Fileに書かれている内容↓
- ベースイメージの指定: ベースイメージは、DockerコンテナのベースとなるOSやランタイム環境を指定します。一般的なベースイメージには、Ubuntu、Alpine Linux、Node.js、Pythonなどがあります。選択したベースイメージによって、コンテナのサイズや特性が異なります。
- パッケージのインストール: 必要なパッケージやライブラリをインストールするためのコマンドを含みます。これには、APT (Debian/Ubuntu)、Yum (CentOS/RHEL)、apk (Alpine Linux)、pip (Python)、npm (Node.js)などのパッケージ管理ツールを使用できます。
- ワークディレクトリの設定: コンテナ内での作業ディレクトリを設定します。これにより、ファイルのコピーと作業が特定のディレクトリで行われます。
- アプリケーションコードのコピー: ローカルのアプリケーションコードをコンテナ内にコピーします。これは、アプリケーションの実行に必要なファイルやディレクトリを含みます。
- 環境変数の設定: アプリケーションの動作に影響を与える環境変数を設定します。たとえば、ポート番号やデータベース接続情報などが含まれます。
- エントリーポイントの指定: コンテナが起動された際に実行されるコマンドまたはスクリプトを指定します。これは、コンテナがどのアプリケーションを実行するかを定義します。
このようにDocker Fileには開発環境を統一する上での情報が書かれているファイルになります。このファイルはGit管理することができるため、アプリケーションの変更履歴と一貫性を保つことができます。
具体的にどのように書かれているかというと、下記のような感じです(サンプル)。以下の例はReact、Pythonでの開発環境の場合を想定しています。
# ベースイメージを指定
FROM node:14
# 作業ディレクトリを設定
WORKDIR /app/frontend
# 必要なファイルをコピー
COPY frontend/package*.json ./
# パッケージのインストール
RUN npm install
# ローカルのReactアプリケーションコードをコピー
COPY frontend ./
# アプリケーションのビルド
RUN npm run build
# Reactアプリケーションを実行
CMD ["npm", "start"]
# ベースイメージを指定
FROM python:3.8
# 作業ディレクトリを設定
WORKDIR /app/backend
# 必要なパッケージをインストール
COPY backend/requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
# ローカルのバックエンドアプリケーションコードをコピー
COPY backend ./
# Flaskアプリケーションを実行
CMD ["python", "app.py"]
Dockerを使うメリット:
- ホストOSのカーネルを利用しているため、軽量で高速に仮想環境の起動・停止ができる
- チーム開発においてメンバー同士が同じ環境を構築できる
- DockerファイルというOSの指定やミドルウェアのインストールなどが、テキストファイルの読み込みで環境構築できるため、再利用、バージョン管理、配布が容易
- クラウド上に自動でサーバを構築できる
- DockerHub(GitHubみたいなもの)で一般公開されているコンテナイメージを誰でも使うことができるため設定が簡単
Dockerを使って仮想環境を構築しないといけないのか
- 環境の再現性: Dockerコンテナはアプリケーションとその依存関係を含む軽量で独立したパッケージです。これにより、開発環境、テスト環境、本番環境など、異なる環境でアプリケーションを正確に再現できます。これは、アプリケーションが異なる環境で正しく動作することを確保するのに役立ちます。
- ポータビリティ: Dockerコンテナは、どのプラットフォームでも実行できます。つまり、ローカル開発環境からクラウドサーバー、さらには他のデベロッパーのマシンまで、同じコンテナを使用してアプリケーションを実行できます。これにより、アプリケーションの移植性が向上し、開発とデプロイが容易になります。
- リソースの効率化: DockerはホストOSのリソースを共有するため、仮想マシンよりもリソース効率が高く、軽量です。これにより、ホストマシン上で多くのコンテナを実行でき、コストを節約できます。
- スケーラビリティ: Dockerコンテナは簡単に複製でき、スケーラビリティが向上します。アプリケーションの負荷が増加した場合、新しいコンテナを迅速に作成し、負荷分散を行うことができます。
- 環境の分離: Dockerコンテナは相互に分離されているため、異なるバージョンのソフトウェアや依存関係を同じホストマシン上で実行できます。これにより、アプリケーション間の競合や依存関係の問題を回避できます。
- セキュリティ: Dockerコンテナはセキュリティを強化するための仕組みを提供しており、アプリケーションやデータを分離して保護できます。また、コンテナイメージは署名や認証を使用して信頼性を確保できます。
- 開発プロセスの合理化: Dockerは開発プロセスを合理化し、開発者がアプリケーションの環境を手動でセットアップする必要をなくします。プロジェクトのセットアップが容易になり、新しいデベロッパーがすぐに開発に参加できます。
Discussion