xfeng

xfeng

健身 技术 阅读 思考 记录
tg_channel
tg_channel
github
bilibili
tg_channel

Dockerのまとめ

image

1. 概要#

この記事では Docker に関する知識を紹介し、Docker の 3 つのコア要素:イメージ、コンテナ、レジストリに重点を置いています。

image

2. Docker の紹介#

  • Docker は世界をリードするソフトウェアコンテナプラットフォームです。
  • Docker は Google が開発した Go 言語を使用して実装され、Linux カーネルの cgroup、namespace、AUFS クラスの UnionFS などの技術を基に、プロセスを封じ込めて隔離します。これはオペレーティングシステムレベルの仮想化技術に属します。隔離されたプロセスはホストや他の隔離されたプロセスから独立しているため、コンテナとも呼ばれます。Docker の最初の実装は LXC に基づいています。
  • Docker は開発環境の構築や設定などの繰り返し作業を自動化できるため、開発者は本当に重要なこと、すなわち優れたソフトウェアの構築に集中できます。
  • ユーザーは簡単にコンテナを作成し使用でき、自分のアプリケーションをコンテナに入れることができます。コンテナはバージョン管理、コピー、共有、変更も可能で、通常のコードを管理するのと同じように扱えます。

image

Docker は Union FS の技術を十分に活用し、層状ストレージアーキテクチャとして設計されています。

3. Docker の思想#

image

  • コンテナ:必要なすべての内容を異なるコンテナに入れ、誰かが特定の内容(環境)を必要とする場合は、対応するコンテナを直接取ればよい。
  • 標準化:
    • 輸送の標準化:Docker には埠頭があり、すべてのアップロードされたコンテナはこの埠頭に置かれます。誰かが特定の環境を必要とする場合は、直接 [小さな青いクジラ]^(Docker のマスコット) を派遣してそのコンテナを運ばせればよい。
    • コマンドの標準化:Docker は一連のコマンドを提供し、コンテナに関する操作を取得するのを助けます。
    • REST API を提供:多くのグラフィカルインターフェースが派生しました。例えば、 [Rancher]^(オープンソースのエンタープライズ向けコンテナ管理プラットフォーム) 。
  • 隔離性:Docker はコンテナ内の内容を実行する際、Linux カーネル内に独自のスペースを開放します。このスペースは他のプログラムに影響を与えません。
  • 中央レジストリ / レジストリセンター:スーパーデポで、そこにはすべてのコンテナが置かれています。
  • イメージ:コンテナそのものです。
  • コンテナ:実行中のイメージ(ソフトウェアを標準化された単位にパッケージ化し、開発、配信、展開に使用します。一般的に言えば、コンテナは物を収納する場所であり、バックパックがさまざまな文房具を収納できるように、クローゼットがさまざまな服を収納でき、靴棚がさまざまな靴を収納できるのと同じです)。

4. コンテナ VS 仮想マシン#

image

コンテナはアプリケーション層の抽象化であり、コードと依存リソースを一緒にパッケージ化します。複数のコンテナは同じマシン上で実行でき、オペレーティングシステムのカーネルを共有しますが、それぞれ独立したプロセスとしてユーザースペースで実行されます。仮想マシンと比較して、コンテナは占有するスペースが少なく(コンテナイメージのサイズは通常数十メガバイト)、瞬時に起動できます。

仮想マシン(VM)は物理ハードウェア層の抽象化であり、1 台のサーバーを複数のサーバーに変えるために使用されます。ハイパーバイザーは複数の VM を 1 台のマシン上で実行できるようにします。各 VM は完全なオペレーティングシステム、1 つ以上のアプリケーション、必要なバイナリファイルとライブラリリソースを含むため、大量のスペースを占有します。また、VM の起動も非常に遅いです。

5. Docker のインストール#

  • 依存パッケージのインストール
yum install -y yum-utils device-mapper-persistent-data lvm2
  • Docker イメージソースの指定
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • Docker のインストール
yum makecache fast
yum -y install docker-ce
  • Docker の起動
systemctl start docker
systemctl enable docker
docker run hello-world

6. Docker 中央レジストリ#

image

Docker 公式の中央レジストリ:(このレジストリのイメージは最も充実していますが、ダウンロード速度は遅いです)

https://hub.docker.com/

国内のイメージサイト:

https://c.163yun.com/hub#/home

http://hub.daocloud.io/

イメージが構築された後、現在のホストマシン上で実行できますが、他のサーバーでこのイメージを使用する必要がある場合は、集中ストレージとイメージ配布サービスが必要です。Docker Registry はそのようなサービスです。

1 つの Docker Registry には複数のレポジトリ(Repository)が含まれることができ、各レポジトリには複数のタグ(Tag)が含まれます。各タグは 1 つのイメージに対応します。

通常、1 つのレポジトリには同じソフトウェアの異なるバージョンのイメージが含まれ、タグはそのソフトウェアの各バージョンに対応するために使用されます。

Docker Registry の公開サービスとプライベート Docker Registry の概念:

  1. Docker Registry の公開サービスは、ユーザーが使用できるように開放され、ユーザーがイメージを管理できる Registry サービスです。

    一般的に、このような公開サービスはユーザーが無料で公開イメージをアップロード、ダウンロードできることを許可し、ユーザーがプライベートイメージを管理するための有料サービスを提供することがあります。

    最も一般的に使用される Registry の公開サービスは公式の Docker Hub で、これはデフォルトの Registry であり、大量の高品質な公式イメージを持っています。

  2. 公開サービスを使用する以外に、ユーザーはローカルにプライベート Docker Registry を構築することもできます。Docker 公式は Docker Registry イメージを提供しており、これをプライベート Registry サービスとして直接使用できます。

    オープンソースの Docker Registry イメージは Docker Registry API のサーバー実装のみを提供し、Docker コマンドをサポートするのに十分であり、使用に影響を与えません。しかし、グラフィカルインターフェースやイメージのメンテナンス、ユーザー管理、アクセス制御などの高度な機能は含まれていません。

7. イメージ#

image

イメージ:
特別なファイルシステム(実際には複数の層のファイルシステムが結合されたもの)

オペレーティングシステムはカーネルとユーザースペースに分かれています。Linux の場合、カーネルが起動すると、root ファイルシステムをマウントしてユーザースペースをサポートしますが、Docker イメージはまさに root ファイルシステムに相当します。

Docker イメージは、コンテナの実行に必要なプログラム、ライブラリ、リソース、設定ファイルなどを提供するだけでなく、実行時に準備するためのいくつかの設定パラメータ(匿名ボリューム、環境変数、ユーザーなど)も含まれています。

イメージは動的データを含まず、その内容は構築後に変更されることはありません。

イメージは 層ごとに構築され 、前の層は次の層の基盤となります。各層が構築されると、それ以降は変更されず、後の層の変更はその層内でのみ発生します。

  • イメージをプルする(中央レジストリからローカルにイメージをプルする)
docker pull イメージ名[:tag]
  • ローカルのすべてのイメージを表示する(ローカルにインストールされたイメージの情報を表示し、識別子、名前、バージョン、更新日時、サイズを含む)
docker images
  • ローカルのイメージを削除する(イメージはディスクスペースを占有するため、直接削除できます)
docker rmi イメージの識別子
  • イメージのインポートとエクスポート
# ローカルのイメージをエクスポート
docker save -o エクスポート先のパス イメージid
# ローカルのイメージファイルをロード
docker load -i イメージファイル
# イメージ名を変更
docker tag イメージid 新イメージ名:バージョン

8. コンテナ#

image

コンテナ:

実行中のイメージ

イメージ(Image)とコンテナ(Container)の関係は、オブジェクト指向プログラミングにおける クラスとインスタンス のようなものです。

イメージは静的な定義であり、コンテナはイメージが実行される実体です。コンテナは作成、起動、停止、削除、停止などが可能です。

コンテナの本質はプロセス ですが、ホストで直接実行されるプロセスとは異なり、コンテナプロセスは独自の名前空間に属して実行されます。前述のように、イメージは層状ストレージを使用しており、コンテナも同様です。

コンテナストレージ層の寿命はコンテナと同じであり、コンテナが消えると、コンテナストレージ層も消えます。したがって、コンテナストレージ層に保存された情報は、コンテナが削除されると失われます

Docker のベストプラクティスに従って、コンテナはそのストレージ層にデータを書き込むべきではなく、コンテナストレージ層は無状態であるべきです。

すべてのファイル書き込み操作はデータボリューム(Volume)またはホストディレクトリをバインドすることによって行うべきであり、これらの位置での読み書きはコンテナストレージ層をバイパスし、ホスト(またはネットワークストレージ)に直接読み書きされ、その性能と安定性が向上します。

データボリュームの寿命はコンテナとは独立しており、コンテナが消えてもデータボリュームは消えません。したがって、データボリュームを使用すると、コンテナを自由に削除したり、再実行したりしてもデータは失われません。

  • コンテナを実行する(コンテナを実行するには具体的なイメージを指定する必要があります。イメージが存在しない場合は直接ダウンロードされます)
# 簡単な操作
docker run イメージの識別子|イメージ名[:tag]
# よく使われるパラメータ
docker run -d -p ホストポート:コンテナポート --name コンテナ名 イメージの識別子|イメージ名[:tag]
# -d: バックグラウンドでコンテナを実行することを示します
# -p: ホストポート:コンテナポート: 現在のLinuxのポートとコンテナのポートをマッピングするため
# --name: コンテナ名: コンテナの名前を指定します
  • 実行中のコンテナを表示する
docker ps [-qa]
# -a: すべてのコンテナを表示し、実行されていないものも含む
# -q: コンテナの識別子のみを表示
  • コンテナのログを表示する(コンテナのログを表示して実行情報を確認する)
docker logs -f コンテナid
# -f: ログの最後の数行をスクロールして表示できます
  • コンテナ内部に入る(コンテナ内部で操作できます)
docker exec -it コンテナid bash
  • コンテナに内容をコピーする(ホストのファイルを内部の指定ディレクトリにコピーします)
docker cp ファイル名 コンテナid:コンテナ内部パス
  • コンテナを再起動 / 起動 / 停止 / 削除する(コンテナの起動、停止、削除などの操作は頻繁に使用されます)
# コンテナを再起動
docker restart コンテナid
# 停止しているコンテナを起動
docker start コンテナid
# 指定したコンテナを停止する(コンテナを削除する前に、まずコンテナを停止する必要があります)
docker stop コンテナid
# すべてのコンテナを停止
docker stop $(docker ps -qa)
# 指定したコンテナを削除
docker rm コンテナid
# すべてのコンテナを削除
docker rm $(docker ps -qa)

9. Docker のアプリケーション#

  • Docker で Tomcat をインストール
docker run -d -p 8080:8080 --name tomcat daocloud.io/library:8.5.15-jre8
  • Docker で MySQL をインストール
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root daocloud.io/library/mysql:5.7.4

10. データボリューム#

image

考察:

Docker コンテナが削除されると、コンテナ内で生成されたデータも消えます。

Docker コンテナと外部マシンは直接ファイルを交換できますか?

コンテナ間でデータのやり取りをしたい場合は?

データボリューム:

データボリュームはホストマシン内のディレクトリまたはファイルです。

コンテナのディレクトリとデータボリュームのディレクトリがバインドされると、相手の変更が即座に同期されます。

1 つのデータボリュームは複数のコンテナに同時にマウントできます。

1 つのコンテナも複数のデータボリュームをマウントできます。

  • データボリュームを作成する(データボリュームを作成すると、デフォルトで /var/lib/docker/volumes/ データボリューム名 /_data に保存されます)
docker volume create データボリューム名
  • データボリュームの詳細を表示する(データボリュームの詳細情報を表示し、保存パス、作成日時などを確認できます)
docker volume inspect データボリューム名
  • すべてのデータボリュームを表示する
docker volume ls
  • データボリュームを削除する
docker volume rm データボリューム名
  • コンテナにデータボリュームをマッピングする

マッピングには 2 つの方法があります:

  1. データボリューム名でマッピングする場合、データボリュームが存在しない場合、Docker が自動的に作成し、コンテナ内部にあるファイルをデフォルトの保存パスに保存します。
  2. パスでデータボリュームをマッピングする場合、データボリュームの保存位置として空のパスを直接指定します。
# データボリューム名でマッピング
docker run -v データボリューム名:コンテナ内部のパス イメージid
# パスでデータボリュームをマッピング
docker run -v パス:コンテナ内部のパス イメージid

11. Dockerfile によるカスタムイメージの作成#

私たちは中央レジストリからイメージをダウンロードすることも、自分で手動でイメージを作成することもできます。その場合、Dockerfile を使用してカスタムイメージ情報を指定する必要があります。

image

12. Docker-Compose#

以前はイメージを実行するために多くのパラメータを追加する必要がありましたが、Docker-Compose を使用してこれらのパラメータを記述できます。

さらに、Docker-Compose はコンテナを一括管理するのを助けます。

これらの情報はすべて docker-compose.yml ファイルを通じて管理できます。

12.1 Docker-Compose のダウンロードとインストール#

mv docker-compose-linux-x86_64 docker-compose
chmod 777 docker-compose
  • 環境変数を設定する(後の操作を便利にするため、環境変数を設定します)
mv docker-compose /usr/local/bin

vim /etc/profile
# 内容を追加 export PATH=$JAVA_HOME:/usr/local/bin:$PATH

source /etc/profile
  • テスト(任意のディレクトリで docker-compose コマンドを入力します)

12.2 Docker-Compose で MySQL と Tomcat コンテナを管理する#

yml ファイルは keyの形式で設定情報を指定します。

複数の設定情報は改行とインデントで区別します。

docker-compose.yml ファイルでは、タブを使用しないでください。

version: '3.1'
services:
	mysql:	#サービスの名前
		restart: always	#dockerが起動する限り、このコンテナも一緒に起動します
		image: daocloud.io/library/mysql:5.7.4	#イメージパスを指定
		container_name: mysql	#コンテナ名を指定
		ports:
			- 3306:3306	#ポート番号のマッピングを指定
		environment: 
			MYSQL_ROOT_PASSWORD: root	#MySQLのrootユーザーのログインパスワードを指定
			TZ: Asia/Shanghai	#タイムゾーンを指定
		volumes:
			- /opt/docker_mysql_tomcat/mysql_data:/var/lib/mysql	#データボリュームをマッピング
	tomcat:
		restart: always
		image: daocloud.io/library/tomcat:8.5.15-jre8
		container_name: tomcat
		ports:
			- 8080:8080
		environment:
			TZ: Asia/Shanghai
		volumes:
			- /opt/docker_mysql_tomcat/tomcat_webapps:/usr/local/tomcat/webapps
			- /opt/docker_mysql_tomcat/tomcat_logs:/usr/local/tomcat/logs

12.3 docker-compose コマンドでコンテナを管理する#

docker-compose コマンドを使用する際、デフォルトで現在のディレクトリに docker-compose.yml ファイルを探します。

# 1. docker-compose.ymlに基づいて管理されているコンテナを起動
docker-compose up -d

# 2. コンテナを停止して削除
docker-compose down

# 3. 既存のdocker-composeで管理されているコンテナを開始|停止|再起動
docker-compose start|stop|restart

# 4. docker-composeで管理されているコンテナを表示
docker-compose ps

# 5. ログを表示
docker-compose logs -f

12.4 docker-compose と Dockerfile を併用する#

docker-compose.yml ファイルと Dockerfile を使用してカスタムイメージを生成し、同時に現在のイメージを起動し、docker-compose でコンテナを管理します。

  • docker-compose ファイル(docker-compose.yml ファイルを作成)
# ymlファイル
version: '3.1'
services:
	ssm:
		restart: always
		build:	#カスタムイメージを構築
			context: ../	#Dockerfileファイルの所在パスを指定
			dockerfile: Dockerfile	#Dockerfileファイル名を指定
		image: ssm:1.0.1
		container_name: ssm
		ports:
			- 8081:8080
		environment:
			TZ: Asia/Shanghai
  • Dockerfile ファイル(Dockerfile を作成)
from daocloud.io/library/tomcat:8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps
  • 実行(効果をテスト)
# docker-compose.ymlとDockerfileファイルに基づいて構築されたカスタムイメージを直接起動できます
docker-compose up -d
#カスタムイメージが存在しない場合は、カスタムイメージを構築し、カスタムイメージが既に存在する場合は、直接このカスタムイメージを実行します。

#カスタムイメージを再構築
docker-compose build
#現在の内容を実行し、再構築します
docker-compose up -d --build

13. まとめ#

この記事では、Docker における一般的な概念を詳細に説明しました。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。