Docker コンテナについて理解してください。
今日のテクノロジー分野では、 「私のシステムで動作します」という言葉が開発者によってよく使われます。しかし、開発者システムで実行されているアプリケーションがテスターのマシンや運用マシンでは実行されない場合が多く、混乱が生じます。
このような問題を解決するためにDockerが導入されました。 💯
なぜドッカーなのか?
なぜ Docker が非常に重要なのかについて、私の個人的な経験をお話したいと思います。
私はチームとともにフルスタック プロジェクトに取り組んでおり、フロントエンドで Angular、バックエンドで Node.js、データベースとして MySQL を使用するアプリケーションを作成する必要がありました。複数のテクノロジーを使用してこのアプリケーションに取り組んでいるときに、いくつかの問題に遭遇しました。
- 最初の問題は、オペレーティング システムの互換性でした。複数のテクノロジーを使用していたので、すべてのテクノロジーが使用している OS と互換性があることを確認する必要がありました。使用しているOSのバージョンではangularのバージョンが合わない場合があり、OSのバージョンを何度も変更する必要がありました。
- 構築していたアプリケーションのアーキテクチャが時間の経過とともに変化したため、ソフトウェアとライブラリのバージョンと依存関係をアップグレードする必要がある状況に陥りました。アプリケーションに使用していたすべてのテクノロジの安定バージョンに到達するまでに、多くの互換性の問題に直面しました。私のアプリケーションで使用されているツールを 1 つアップグレードするだけでも、危険な作業でした。
- その後、さらに多くの開発者が私のアプリケーションに取り組んでくれました。テクノロジー スタックが重いため、アプリケーションと互換性のある環境をセットアップするには、複数のコマンドを何時間も実行する必要がありました。私が使用していたテクノロジーのバージョンと不一致がないことを確認するために、すべての開発者の環境をチェックして評価する必要がありました。
- 最後に、開発者の中に、私がアプリケーションの構築に使用していた OS に慣れていない人がいた場合、その開発者にとってアプリケーションの作業は困難でした。
これらすべてにより、アプリケーションを予定通りに開発、構築、出荷することが困難になりました。ここで Docker が登場しました。これで、先ほど述べた問題がすべて解決されます。
ドッカーとは何ですか?
Docker は、アプリケーションとその依存関係をコンテナ内にまとめてパッケージ化するコンテナ化プラットフォームであり、アプリケーションが開発、ステージング、実稼働など、あらゆる環境でシームレスに動作できるようにします。
これは、コンテナーを使用してアプリケーションを簡単に作成、デプロイ、実行できるように設計されたツールです。 Docker コンテナは仮想マシンに代わる軽量のコンテナであり、ホスト オペレーティング システムを使用します。仮想マシンのように、コンテナーに RAM を事前に割り当てる必要はありません。
これは、開発者、システム管理者、企業が分散アプリケーションをオンザフライで構築、配布、実行できるオープンソース プラットフォームです。
Docker が内部でどのように動作するかについて詳しくは、Docker アーキテクチャを確認してください。
Docker イメージ、コンテナ、Dockerfile
ドッカーイメージ
Docker イメージは、アプリケーションを実行するために必要なテンプレートです。これは、アプリケーション コード、ライブラリ、ツール、依存関係などで構成されます。
Docker イメージは読み取り専用の不変ファイルであり、スナップショットとも呼ばれます。 Docker イメージを開始したり実行したりしません。それを通じてコンテナを構築します。 Docker イメージからコンテナーが作成されると、イメージ レイヤーの上にコンテナー レイヤーが作成されます。
基本イメージにいくつかの変更を加えて他の複数の Docker イメージを作成するために使用する基本 Docker イメージが必要です。
Docker Hub は、ほぼすべてのテクノロジー スタックの Docker イメージのリポジトリです。 DockerHub から Docker イメージをプルし、コンテナーの構築を開始できます。
Dockerコンテナ
Docker コンテナは、アプリケーションの実行に必要なすべての依存関係を含む実行可能なソフトウェア パッケージです。 Docker コンテナを使用すると、アプリケーションはさまざまなコンピューター環境で効率的に動作できます。
以下は Docker コンテナの機能です。
- 軽量
- 最小限のオーバーヘッド (CPU/IO/ネットワーク)
- 導入の迅速化
- 簡単に拡張可能
- ストレージ消費量の削減
- ポータブルでどこでも実行できます。
- 最小限のベース OS
- アプリケーションの分離
Dockerfile
Dockerfile は、実行する必要があるすべてのタスクを定義するシェル スクリプトです。 docker ファイルから docker イメージを作成します。 docker イメージから docker コンテナを作成します。
Docker のインストール
Docker は、さまざまな Linux プラットフォーム、Windows、または macOS に簡単にインストールできます。 Ubuntu、CentOS、Debian、Windows に Docker をインストールする方法に関するこの投稿をご覧ください。
また、Docker Desktop は Windows マシンと Mac マシンでも利用できます。これは、インストールが非常に簡単で、Windows および Mac 環境でのアプリケーションの構築とコンテナ化に役立つ実行可能アプリケーションです。
Docker のエディションと価格
Docker には 2 つのエディションがあります。
- コミュニティエディション (CE)
- エンタープライズ版 (EE)
Docker コミュニティ エディションはオープンソースであり、無料で使用できます。 Docker CE は、DevOps エンジニアが自分でアプリケーションをコンテナ化できる「Do It Yourself」アプローチを目指しています。
Docker Enterprise Edition には、 Basic 、 Standard、 Advancedの 3 つのバージョンがあります。 Basic エディションには Docker プラットフォーム、サポート、認定が付属しており、Standard および Advanced エディションには Basic エディションの機能にコンテナ管理と Docker セキュリティ スキャン機能が追加されています。
ほとんどの技術者は Docker を無料で使用します。ただし、高度な機能が必要な場合は、Docker の有料版を使用できます。価格は、リポジトリ管理、CI/CD 機能、ユーザー管理、開発者ツール、サポート オプションなどの機能によって異なります。
Docker の計画の詳細は次のとおりです。
Docker の基礎を理解したところで、非常に単純な Docker の例を示します。
Docker Hello World コンテナ
DockerHub からhello-world Docker イメージを取得し、そのイメージをビルドして、アプリケーションを実行する Docker コンテナーを作成します。このイメージには、Docker から hello メッセージを出力する簡単なアプリケーションが含まれています。
まず、Ubuntu マシン上で hello-world docker イメージをプルする必要があります。
注: これは、Docker がすでにインストールされていることを前提としています。まだの場合は、インストール ガイドを確認してください。
@:~$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:49a1c8800c94df04e9658809b006fd8a686cab8028d33cfba2cc049724254202
Status: Downloaded newer image for hello-world:latest
Docker イメージがプルされたかどうかを確認します。
@:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 7 months ago 13.3kB
kubernetesui/dashboard v2.0.0-beta8 eb51a3597525 8 months ago 90.8MB
_mongodb latest 095d17727ca0 12 months ago 325MB
以下のコマンドを実行してコンテナを作成し、アプリケーションを実行します。
@:~$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
次に、すべての Docker コンテナをリストします。 1 分前に hello-world コンテナが実行されたことがわかります。
@:~$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a1056caffc4 hello-world "/hello" 1 minutes ago Exited (0) 1 minutes ago zealous_bose
b0095c1e5536 _mongodb "/bin/sh -c usr/bin/…" 12 months ago Exited (0) 12 months ago mongo_container
Docker の探索を開始します。これらの基本的な docker コマンドを試してください。
Dockerコンテナ内でNginxを実行する
ここでは、コンテナ内に Nginx をデプロイする方法を説明します。
以下のコマンドは、Nginx イメージをローカルで検索します。使用可能なローカル イメージがないため、Docker ハブから Nginx Docker イメージをプルします。次に、Nginx Docker イメージを使用してnginx_
という名前のコンテナーを作成し、ポート 80 で Nginx を実行します。
@:~$ docker run --name nginx_ -p 80:80 -d nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
bf5952930446: Pull complete
ba755a256dfe: Pull complete
c57dd87d0b93: Pull complete
d7fbf29df889: Pull complete
1f1070938ccd: Pull complete
Digest: sha256:36b74457bccb56fbf8b05f79c85569501b721d4db813b684391d63e02287c0b2
Status: Downloaded newer image for nginx:latest
fdad18387b27b48b8f2e14f8641791cc4d5edf667cc664198b67579cd76a5162
システムで利用可能な Docker イメージをリストすると、Nginx Docker イメージがプルされたことがわかります。
@:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 08393e824c32 4 days ago 132MB
hello-world latest bf756fb1ae65 7 months ago 13.3kB
kubernetesui/dashboard v2.0.0-beta8 eb51a3597525 8 months ago 90.8MB
_mongodb latest 095d17727ca0 12 months ago 325MB
以下のコマンドを実行して、実行中のすべてのコンテナを一覧表示します。コンテナnginx_
が0.0.0.0:80
で実行されていることがわかります。
@:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fdad18387b27 nginx "/docker-entrypoint.…" 58 seconds ago Up 32 seconds 0.0.0.0:80->80/tcp nginx_
1a1056caffc4 hello-world "/hello" About an hour ago Exited (0) About an hour ago zealous_bose
b0095c1e5536 _mongodb "/bin/sh -c usr/bin/…" 12 months ago Exited (0) 12 months ago mongo_container
ブラウザに移動して 0.0.0.0:80 を開くと、nginx がコンテナ内で稼働していることがわかります。
一般的な Docker の使用例
構成の簡素化: Docker は、仮想マシンの実際のオーバーヘッドを発生させることなく、その構成を利用して任意のプラットフォーム上で実行できます。
これにより、構成ファイルをコードに組み込み、さまざまな環境に対応するために環境変数を渡すことができます。これにより、1 つの Docker イメージを別の環境で使用できるようになります。
コード管理: コードは、開発から運用までの過程でさまざまな環境を通過します。
それぞれの環境には、他の環境よりもわずかな違いがあります。 Docker は一貫した環境を提供することでこの違いを解消し、開発とコーディングをより快適にします。
Docker イメージは不変であるため、開発から本番環境までアプリケーション環境を変更する必要がないという利点があります。
開発生産性の向上: 開発エコシステムにおける 2 つの重要な目標は、開発環境を運用環境にできる限り近づけることであり、次の目標は高品質のコードをできるだけ早く配信することです。
Docker を使用すると、運用環境を反映するコンテナ内でコードを実行できます。VM とは異なり、Docker はオーバーヘッド メモリ容量が少ないため、いくつかのサービスの実行に役立ちます。
もう 1 つの目標は、ホストからコンテナーでアプリケーション コードを利用できるように Docker の共有ボリュームを使用することで達成されます。これにより、開発者はプラットフォームとエディターからソース コードを編集でき、Docker 内の実行環境に反映されます。
アプリケーションの分離: アプリケーションの分離が必要になる場合があります。たとえば、API サーバーが異なる Apache や異なる依存関係のセットを必要とする場合などです。
API サーバーを別のコンテナーで実行することは、より良い方法です。
デバッグ機能: Docker は、コンテナー内や別のコンテナー内にチェックポイントを挿入する機能を備えた、コンテナーと適切に連携する多数のツールを提供します。これは、アプリケーションをテストする際に非常に重要です。
迅速な導入: Docker コンテナは非常に迅速に作成できます。これは、コンテナが OS を起動するのではなく、アプリケーションを実行するだけであるため実現されます。
一度設定すると、コードが一度機能すれば、すべての環境で機能するという安心感が得られます。
結論
Docker は、その膨大な利点により、IT インフラストラクチャへの貴重な追加物となりつつあります。以上のことから、ご理解いただければ幸いです。オンライン コースの受講に興味がある場合は、 Docker Mastery オンライン コースを受講することをお勧めします。