1. 概要#
この記事では Docker に関する知識を紹介し、Docker の 3 つのコア要素であるイメージ、コンテナ、レジストリに重点を置いています。
2. Docker の紹介#
- Docker は世界をリードするソフトウェアコンテナプラットフォームです。
- Docker は Google が開発した Go 言語を使用して実装され、Linux カーネルの cgroup、namespace、および AUFS クラスの UnionFS などの技術を基に、プロセスを封装して隔離するオペレーティングシステムレベルの仮想化技術です。隔離されたプロセスはホストや他の隔離されたプロセスから独立しているため、コンテナとも呼ばれます。Docker の最初の実装は LXC に基づいています。
- Docker は開発環境の構築や設定などの繰り返し作業を自動化できるため、開発者は本当に重要なこと、すなわち優れたソフトウェアの構築に集中できます。
- ユーザーは簡単にコンテナを作成し、使用することができ、自分のアプリケーションをコンテナに入れることができます。コンテナはバージョン管理、コピー、共有、変更が可能で、通常のコードを管理するのと同じように扱えます。
Docker は Union FS の技術を十分に活用して、階層ストレージアーキテクチャとして設計されています。
3. Docker の思想#
- コンテナ:必要なすべての内容を異なるコンテナに入れ、誰かが特定の内容(環境)を必要とする場合は、対応するコンテナを直接取得すればよい。
- 標準化:
- 輸送の標準化:Docker にはドックがあり、すべてのアップロードされたコンテナはこのドックに置かれます。誰かが特定の環境を必要とする場合は、[小さな青いクジラ]^(Docker のマスコット) を派遣してそのコンテナを運ぶだけです。
- コマンドの標準化:Docker はコンテナに関する操作を取得するための一連のコマンドを提供します。
- REST API を提供:多くのグラフィカルインターフェースが派生しました。例:[Rancher]^(オープンソースのエンタープライズ向けコンテナ管理プラットフォーム)
- 隔離性:Docker はコンテナ内の内容を実行する際に、Linux カーネル内に独自のスペースを開放します。このスペースは他のプログラムに影響を与えません。
- 中央レジストリ / レジストリセンター:スーパードック、そこにはすべてのコンテナが置かれています。
- イメージ:コンテナそのものです。
- コンテナ:実行中のイメージ(ソフトウェアを標準化された単位にパッケージ化し、開発、配信、展開に使用します。一般的な説明としては、コンテナは物を収納する場所であり、リュックサックがさまざまな文房具を収納できるように、クローゼットがさまざまな衣服を収納できるように、靴棚がさまざまな靴を収納できるようなものです)。
4. コンテナ VS 仮想マシン#
コンテナはコードと依存リソースを一緒にパッケージ化するためのアプリケーション層の抽象化です。複数のコンテナは同じマシン上で実行でき、オペレーティングシステムのカーネルを共有しますが、それぞれ独立したプロセスとしてユーザースペースで実行されます。仮想マシンと比較して、コンテナは占有するスペースが少なく(コンテナイメージのサイズは通常数十メガバイト)、瞬時に起動できます。
仮想マシン(VM)は物理ハードウェア層の抽象化であり、1 台のサーバーを複数のサーバーに変えるために使用されます。ハイパーバイザーは複数の VM を 1 台のマシン上で実行できるようにします。各 VM は完全なオペレーティングシステム、1 つ以上のアプリケーション、必要なバイナリファイルおよびライブラリリソースを含むため、大量のスペースを占有します。また、VM の起動も非常に遅いです。
5. Docker のインストール#
- 依存パッケージのインストール
- Docker イメージソースの指定
- Docker のインストール
- Docker の起動
6. Docker 中央レジストリ#
Docker 公式の中央レジストリ:(このレジストリのイメージは最も充実していますが、ダウンロード速度は遅いです)
国内のイメージサイト:
イメージが構築された後、現在のホストマシンで実行できますが、他のサーバーでこのイメージを使用する必要がある場合は、集中ストレージおよびイメージ配布サービスが必要です。Docker Registry はそのようなサービスです。
1 つの Docker Registry には複数のリポジトリ(Repository)が含まれることができ、各リポジトリには複数のタグ(Tag)が含まれます。各タグは 1 つのイメージに対応します。
通常、1 つのリポジトリには同じソフトウェアの異なるバージョンのイメージが含まれ、タグはそのソフトウェアの各バージョンに対応するために使用されます。
Docker Registry の公開サービスとプライベート Docker Registry の概念:
-
Docker Registry の公開サービスは、ユーザーが使用できるように開放され、ユーザーがイメージを管理できる Registry サービスです。
一般的に、このような公開サービスはユーザーが公開イメージを無料でアップロードおよびダウンロードできることを許可し、プライベートイメージを管理するための有料サービスを提供することがあります。
最も一般的に使用される Registry 公開サービスは公式の Docker Hub であり、これがデフォルトの Registry であり、大量の高品質な公式イメージを持っています。
-
公開サービスを使用する以外に、ユーザーはローカルにプライベート Docker Registry を構築することもできます。Docker 公式は Docker Registry イメージを提供しており、プライベート Registry サービスとして直接使用できます。
オープンソースの Docker Registry イメージは Docker Registry API のサーバー側実装のみを提供しており、Docker コマンドをサポートするのに十分で、使用に影響を与えません。しかし、グラフィカルインターフェースやイメージのメンテナンス、ユーザー管理、アクセス制御などの高度な機能は含まれていません。
7. イメージ#
イメージ:
特別なファイルシステム(実際には複数の層のファイルシステムで構成されています)。
オペレーティングシステムはカーネルとユーザースペースに分かれており、Linux の場合、カーネルが起動すると、root ファイルシステムをマウントしてユーザースペースをサポートしますが、Docker イメージは root ファイルシステムに相当します。
Docker イメージは、コンテナの実行に必要なプログラム、ライブラリ、リソース、設定ファイルなどを提供するだけでなく、実行時に必要な設定パラメータ(匿名ボリューム、環境変数、ユーザーなど)も含まれています。
イメージには動的データは含まれておらず、その内容は構築後に変更されることはありません。
イメージは 層ごとに構築 され、前の層は次の層の基盤となります。各層が構築されると、それ以降は変更されず、次の層の変更はその層内でのみ発生します。
- イメージをプルする(中央レジストリからローカルにイメージをプルする)
- ローカルのすべてのイメージを表示する(ローカルにインストールされたイメージ情報を表示し、識別子、名前、バージョン、更新日時、サイズを含む)
- ローカルのイメージを削除する(イメージはディスクスペースを占有するため、直接削除できます)
- イメージのインポートとエクスポート
8. コンテナ#
コンテナ:
実行中のイメージ
イメージ(Image)とコンテナ(Container)の関係は、オブジェクト指向プログラミングにおける クラスとインスタンス のようなものです。
イメージは静的な定義であり、コンテナはイメージの実行時の実体です。コンテナは作成、起動、停止、削除、一時停止などが可能です。
コンテナの本質はプロセス ですが、ホストで直接実行されるプロセスとは異なり、コンテナプロセスは独自の名前空間に属して実行されます。前述のように、イメージは階層ストレージを使用しており、コンテナも同様です。
コンテナストレージ層の生存周期はコンテナと同じであり、コンテナが消えると、コンテナストレージ層も消えます。したがって、コンテナストレージ層に保存された情報は、コンテナが削除されると失われます。
Docker のベストプラクティスの要件に従い、コンテナはストレージ層にデータを書き込むべきではなく、コンテナストレージ層は無状態であるべきです。
すべてのファイル書き込み操作は、データボリューム(Volume)またはホストディレクトリをバインドすることで行うべきであり、これらの位置での読み書きはコンテナストレージ層をバイパスし、ホスト(またはネットワークストレージ)に直接読み書きされるため、パフォーマンスと安定性が向上します。
データボリュームの生存周期はコンテナとは独立しており、コンテナが消えてもデータボリュームは消えません。したがって、データボリュームを使用すると、コンテナを自由に削除したり再実行したりしても、データは失われません。
- コンテナを実行する(コンテナを実行するには具体的なイメージを指定する必要があり、イメージが存在しない場合は直接ダウンロードされます)
- 実行中のコンテナを表示する
- コンテナのログを表示する(コンテナのログを表示して実行情報を確認する)
- コンテナ内部に入る(コンテナ内部で操作できます)
- コンテナに内容をコピーする(ホストのファイルを内部の指定ディレクトリにコピー)
- コンテナを再起動 / 起動 / 停止 / 削除する(コンテナの起動、停止、削除などの操作は頻繁に使用されます)
9. Docker のアプリケーション#
- Docker で Tomcat をインストール
- Docker で MySQL をインストール
10. データボリューム#
考察:
Docker コンテナが削除されると、コンテナ内で生成されたデータも消失します。
Docker コンテナと外部マシンは直接ファイルを交換できますか?
コンテナ間でデータのやり取りをしたい場合は?
データボリューム:
データボリュームはホストマシン内のディレクトリまたはファイルです。
コンテナのディレクトリとデータボリュームのディレクトリがバインドされると、相手の変更が即座に同期されます。
1 つのデータボリュームは複数のコンテナに同時にマウントできます。
1 つのコンテナも複数のデータボリュームをマウントできます。
- データボリュームを作成する(データボリュームを作成すると、デフォルトで /var/lib/docker/volumes/ データボリューム名 /_data というディレクトリに保存されます)
- データボリュームの詳細を表示する(データボリュームの詳細情報を表示し、保存パス、作成日時などを確認できます)
- すべてのデータボリュームを表示する
- データボリュームを削除する
- コンテナにデータボリュームをマッピングする
マッピングには 2 つの方法があります:
- データボリューム名を使用してマッピングする場合、データボリュームが存在しない場合、Docker が自動的に作成し、コンテナ内部にあるファイルをデフォルトの保存パスに保存します。
- パスを使用してデータボリュームをマッピングする場合、データボリュームの保存位置として空のパスを直接指定します。
11. Dockerfile によるカスタムイメージの作成#
私たちは中央レジストリからイメージをダウンロードすることも、自分で手動でイメージを作成することもできます。Dockerfile を使用してカスタムイメージ情報を指定する必要があります。
12. Docker-Compose#
以前はイメージを実行するために多くのパラメータを追加する必要がありましたが、Docker-Compose を使用してこれらのパラメータを記述できます。
さらに、Docker-Compose はコンテナを一括管理するのに役立ちます。
これらの情報は docker-compose.yml ファイルを通じて管理できます。
12.1 Docker-Compose のインストールと設定#
-
権限を設定する(DockerCompose ファイルの名前を変更し、実行可能な権限を与えます)
- 環境変数を設定する(後の操作を便利にするために、環境変数を設定します)
- テスト(任意のディレクトリで docker-compose コマンドを入力します)
12.2 Docker-Compose で MySQL と Tomcat コンテナを管理する#
yml ファイルは keyの形式で設定情報を指定します。
複数の設定情報は改行とインデントで区別します。
docker-compose.yml ファイルでは、タブを使用しないでください。
12.3 docker-compose コマンドでコンテナを管理する#
docker-compose コマンドを使用する際、デフォルトで現在のディレクトリにある docker-compose.yml ファイルを探します。
12.4 docker-compose と Dockerfile を組み合わせて使用する#
docker-compose.yml ファイルと Dockerfile を使用してカスタムイメージを生成し、同時に現在のイメージを起動し、docker-compose がコンテナを管理します。
- docker-compose ファイル(docker-compose.yml ファイルを作成)
- Dockerfile ファイル(Dockerfile を作成)
- 実行(効果をテスト)
13. まとめ#
この記事では、Docker における一般的な概念について詳細に説明しました。