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 のインストール#
- 依存パッケージのインストール
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 中央リポジトリ#
Docker 公式の中央リポジトリ:(このリポジトリのイメージは最も豊富ですが、ダウンロード速度は遅いです)
国内のイメージサイト:
イメージが構築された後、現在のホストマシンで実行できますが、他のサーバーでこのイメージを使用する必要がある場合は、集中ストレージとイメージ配布サービスが必要です。Docker Registry はそのようなサービスです。
1 つの Docker Registry には複数のリポジトリ(Repository)が含まれることができ、各リポジトリには複数のタグ(Tag)が含まれます。各タグは 1 つのイメージに対応します。
通常、1 つのリポジトリには同じソフトウェアの異なるバージョンのイメージが含まれ、タグはそのソフトウェアの各バージョンに対応するために一般的に使用されます。
-
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 イメージは、コンテナの実行に必要なプログラム、ライブラリ、リソース、設定などのファイルを提供するだけでなく、実行時に準備されたいくつかの設定パラメータ(匿名ボリューム、環境変数、ユーザーなど)も含まれています。
イメージには動的データは含まれておらず、その内容は構築後に変更されることはありません。
イメージは層ごとに構築され、前の層は次の層の基礎となります。各層が構築されると、それ以降は変更されず、次の層の変更はその層内でのみ発生します。
- イメージをプルする(中央リポジトリからイメージをローカルにプルする)
docker pull イメージ名[:tag]
- ローカルのすべてのイメージを表示する(ローカルにインストールされたイメージ情報を表示し、識別子、名前、バージョン、更新日時、サイズを含む)
docker images
- ローカルのイメージを削除する(イメージはディスクスペースを占有するため、直接削除できます)
docker rmi イメージの識別子
- イメージのインポートとエクスポート
# ローカルのイメージをエクスポート
docker save -o エクスポート先のパス イメージid
# ローカルのイメージファイルをロード
docker load -i イメージファイル
# イメージ名を変更
docker tag イメージid 新しいイメージ名:バージョン
8. コンテナ#
実行中のイメージ
イメージ(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. データボリューム#
Docker コンテナが削除されると、コンテナ内で生成されたデータも消失します。
Docker コンテナと外部マシンは直接ファイルを交換できますか?
コンテナ間でデータを交換したい場合は?
データボリューム:
データボリュームはホストマシン内のディレクトリまたはファイルです。
コンテナのディレクトリとデータボリュームのディレクトリがバインドされると、相手の変更が即座に同期されます。
1 つのデータボリュームは複数のコンテナに同時にマウントできます。
1 つのコンテナも複数のデータボリュームをマウントできます。
- データボリュームを作成する(データボリュームを作成すると、デフォルトで /var/lib/docker/volumes/ データボリューム名 /_data に保存されます)
docker volume create データボリューム名
- データボリュームの詳細を表示する(データボリュームの詳細情報を表示し、保存パス、作成時間などを確認できます)
docker volume inspect データボリューム名
- すべてのデータボリュームを表示する
docker volume ls
- データボリュームを削除する
docker volume rm データボリューム名
- コンテナにデータボリュームをマッピングする
マッピングには 2 つの方法があります:
- データボリューム名でマッピングする場合、データボリュームが存在しない場合、Docker が自動的に作成し、コンテナ内部に自動的にファイルを保存します。
- パスでデータボリュームをマッピングする場合、データボリュームの保存場所として空のパスを直接指定します。
# データボリューム名でマッピング
docker run -v データボリューム名:コンテナ内部のパス イメージid
# パスでデータボリュームをマッピング
docker run -v パス:コンテナ内部のパス イメージid
11. Dockerfile によるカスタムイメージ#
私たちは中央リポジトリからイメージをダウンロードすることも、自分で手動でイメージを作成することもできます。そのためには Dockerfile を使用してカスタムイメージ情報を指定する必要があります。
12. Docker-Compose#
以前は 1 つのイメージを実行するために多くのパラメータを追加する必要がありましたが、Docker-Compose を使用してこれらのパラメータを記述できます。
さらに、Docker-Compose はコンテナを一括管理するのを助けます。
これらの情報はすべて docker-compose.yml ファイルを通じて管理できます。
12.1 Docker-Compose のダウンロードとインストール#
-
権限を設定する(DockerCompose ファイルの名前を変更し、実行可能な権限を与える必要があります)
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 における一般的な概念を詳細に説明しました。