Docker Secretの管理と使用の詳細な説明

Docker Secretの管理と使用の詳細な説明

1. Docker Secretとは

1. シナリオ表示

MySQL サービスなど、一部のサービスではパスワードが必要であることがわかっています。

バージョン: '3'

サービス:

 ウェブ:
  画像: wordpress
  ポート:
   -8080:80
  ボリューム:
   - ./www:/var/www/html
  環境:
   WORDPRESS_DB_NAME=ワードプレス
   WORDPRESS_DB_HOST: mysql
   WORDPRESS_DB_PASSWORD: ルート
  ネットワーク:
   - マイネットワーク
  依存:
   -MySQLについて
  展開する:
   モード: 複製
   レプリカ: 3
   再起動ポリシー:
    条件: 失敗時
    遅延: 5秒
    最大試行回数: 3
   アップデート構成:
    並列処理: 1
    遅延: 10秒

 マイスク:
  画像: mysql
  環境:
   MYSQL_ROOT_PASSWORD: ルート
   MYSQL_DATABASE: ワードプレス
  ボリューム:
   -mysql-データ:/var/lib/mysql
  ネットワーク:
   - マイネットワーク
  展開する:
   モード: グローバル
   配置:
    制約:
     - node.role == マネージャー

ボリューム:
 mysqlデータ:

ネットワーク:
 私のネットワーク:
  ドライバー: オーバーレイ

この docker-compose.yml の 2 つのサービス パスワードはプレーン テキストで、あまり安全ではないことがわかります。では、Docker シークレットとは何でしょうか。また、上記の問題を解決できるのでしょうか。

Docker の秘密

マネージャー ノードは、分散ストレージ データベース Raft データベースを通じて状態の一貫性を維持していることがわかっています。このデータベース自体は情報を秘密に保持するため、このデータベースを使用してアカウント番号、パスワードなどの機密情報を保存し、サービスを承認することでアクセスを許可し、パスワードがプレーン テキストで表示されるのを防ぐことができます。

要約すると、シークレット スウォーム内のシークレットの管理は次の手順で実行されます。

  • 秘密はSwarm ManagerノードのRaftデータベースに存在する
  • シークレットをサービスに割り当てると、サービスはシークレットを参照できるようになります。
  • コンテナ内では、シークレットはファイルのように見えますが、実際にはメモリです。

2. Docker Secretの作成と使用

1. 創造

まず、作成されたヘルプ手順をいくつか見てみましょう。

[root@centos-7 ~]# docker シークレット --help

使用方法: docker secret コマンド

Dockerシークレットを管理する

コマンド:
 ファイルまたはSTDINからコンテンツとしてシークレットを作成する
 検査 1つ以上のシークレットの詳細情報を表示する
 ls シークレットを一覧表示する
 rm 1つ以上のシークレットを削除する

コマンドの詳細については、「docker secret COMMAND --help」を実行してください。

最初のコマンドは作成されたコマンドです。どのようなヘルプ情報があるか見てみましょう。

[root@centos-7 ~]# docker secret create --help

使用方法: docker secret create [OPTIONS] SECRET [file|-]

ファイルまたはSTDINからコンテンツとしてシークレットを作成する

オプション:
 -d, --driver 文字列 シークレットドライバー
 -l, --label シークレットラベルのリスト
   --template-driver 文字列 テンプレートドライバー

シークレットはファイルまたは標準出力から取得できることがわかります。 Secret を作成するには、次の 2 つの方法があります。

  • ファイルベースの作成
  • コマンドラインから作成

1. ファイルに基づいて作成する

まず、パスワードを保存するファイルを作成します

[root@centos-7 ~]# vim mysql-パスワード
根

次に秘密を作成します

[root@centos-7 ~]# docker secret create mysql-pass mysql-password 
翻訳:

mysql-pass はシークレットの名前で、mysql-password はパスワードを保存するために作成したファイルです。このコマンドを実行すると、ファイル内のパスワードが Swarm のマネージャーノードの Raft データベースに保存されます。セキュリティ上の理由から、パスワードはすでに Swarm 内にあるため、このファイルを直接削除できるようになりました。

[root@centos-7 ~]# rm -f mysql-パスワード 

これで秘密リストを表示できます:

[root@centos-7 ~]# docker secret ls
ID 名前 ドライバー 作成 更新
texcct9ojqcz6n40woe97dd7k mysql-pass 4分前 4分前

すでに存在します。

2. コマンドラインに基づいて作成する

[root@centos-7 ~]# echo "root" | docker secret create mysql-pass2 -
hrtmn5yr3r3k66o39ba91r2e4
[root@centos-7 ~]# docker secret ls
ID 名前 ドライバー 作成 更新
texcct9ojqcz6n40woe97dd7k mysql-pass 6分前 6分前
hrtmn5yr3r3k66o39ba91r2e4 mysql-pass2 5秒前 5秒前

この方法は、成功させるのに非常に簡単です

(II)その他の業務

では、シークレットには他の操作はありますか?

[root@centos-7 ~]# docker シークレット --help

使用方法: docker secret コマンド

Dockerシークレットを管理する

コマンド:
 ファイルまたはSTDINからコンテンツとしてシークレットを作成する
 検査 1つ以上のシークレットの詳細情報を表示する
 ls シークレットを一覧表示する
 rm 1つ以上のシークレットを削除する

コマンドの詳細については、「docker secret COMMAND --help」を実行してください。

create コマンドの他に、inspect、ls、rm コマンドもあることがわかります。

1. 検査する

[root@centos-7 ~]# docker secret を検査する mysql-pass2
[
  {
    "ID": "hrtmn5yr3r3k66o39ba91r2e4",
    「バージョン」: {
      「インデックス」: 4061
    },
    「作成日時」: 「2020-02-07T08:39:25.630341396Z」、
    「更新日時」: 「2020-02-07T08:39:25.630341396Z」、
    「仕様」: {
      "名前": "mysql-pass2",
      「ラベル」: {}
    }
  }
]

秘密の詳細を表示する

2.rm

[root@centos-7 ~]# docker secret rm mysql-pass2
mysql-pass2
[root@centos-7 ~]# docker secret ls
ID 名前 ドライバー 作成 更新
texcct9ojqcz6n40woe97dd7k mysql-pass 12 分前 12 分前

シークレットを削除する

(III)単一コンテナでのシークレットの使用

1. コンテナ内のシークレットを表示する

シークレットを作成しました。サービスを開始した後、特定のサービスがそれを参照できるように、そのシークレットを承認するにはどうすればよいでしょうか?まず、サービスを作成するコマンドに類似のコマンドまたはパラメータがあるかどうかを確認します。

[root@centos-7 ~]# docker サービス作成 --help

使用方法: docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]

新しいサービスを作成する

オプション:
   --config config サービスに公開する設定を指定します
...
 --secret secret サービスに公開するシークレットを指定します
...
...

実際に、サービスを作成するときにサービスに秘密を公開できるコマンドが存在します。

2. サービスを作成する

[root@centos-7 ~]# docker service create --name demo --secret mysql-pass busybox sh -c "while true; do sleep 3600; done"
翻訳:
全体の進捗状況: 1 タスク中 1 タスク 
1/1: 実行中  
検証: サービスが統合されました 

サービスがどのノードで実行されているかを確認します。

[root@centos-7 ~]# docker サービス ls
ID 名前 モード レプリカ イメージ ポート
zwgk5w0rpf17 デモが 1/1 に複製されました busybox:latest   
[root@centos-7 ~]# docker サービス ps デモ
ID 名前 イメージ ノード 望ましい状態 現在の状態 エラー ポート
yvr9lwvg8oca demo.1 busybox:latest localhost.localdomain 実行中 51 秒前に実行中

このサービスは localhost.localdomain ホストのノード上で実行されていることがわかります。このノードに移動してコンテナに入り、シークレットを表示できるかどうか確認してみましょう。

[root@localhost ~]# docker ps
コンテナID イメージ コマンド 作成ステータス ポート名
36573adf21f6 busybox:latest "sh -c 'while true; …"4 分前 4 分前 demo.1.yvr9lwvg8ocatym20hdfublhd
[root@localhost ~]# docker exec -it 36​​573adf21f6 /bin/sh
/#ls
bin dev etc home proc root run sys tmp usr var
/ # cd /run/secrets
/run/secrets # ls
mysql-pass
/run/secrets # cat mysql-pass 
根
/run/secrets #

確かに実現可能であることがわかります。

2. MySQLサービス

MySQL イメージの詳細については、シークレットの説明が記載されている https://hub.docker.com/_/mysql を参照してください。

環境変数を介して機密情報を渡す代わりに、前述の環境変数に _FILE を追加して、init スクリプトがコンテナー内に存在するファイルからそれらの変数の値を読み込むようにすることができます。特に、これを使用して、/run/secrets/<secret_name> ファイルに保存されている Docker Secret からパスワードを読み込むことができます。例えば:

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-root -d mysql:tag

現在、これは MYSQL_ROOT_PASSWORD、MYSQL_ROOT_HOST、MYSQL_DATABASE、MYSQL_USER、および MYSQL_PASSWORD のみをサポートしています。

そのため、データベースの機密情報を保存するためのファイル secret を作成する必要があります。このファイルは以前に作成されているため、ここで再度作成する必要はありません。

[root@centos-7 ~]# docker secret ls
ID 名前 ドライバー 作成 更新
texcct9ojqcz6n40woe97dd7k mysql-pass 4 時間前 4 時間前

mysql サービスを開始します。

[root@centos-7 ~]# docker service create --name db --secret mysql-pass -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-pass mysql
sbpagzqvpwt8ifymavf8o5xmi
全体の進捗状況: 1 タスク中 1 タスク 
1/1: 実行中  
検証: サービスが統合されました 

mysql サービスがどのノードにあるかを確認します。

[root@centos-7 ~]# docker サービス ls
ID 名前 モード レプリカ イメージ ポート
sbpagzqvpwt8 db 複製 0/1 mysql:latest    
[root@centos-7 ~]# docker サービス ps db
ID 名前 イメージ ノード 望ましい状態 現在の状態 エラー ポート
qlmfm6u7lg8u db.1 mysql:latest localhost.localdomain 実行中 2 秒前に開始

シークレットを表示するには、ワーカー ノードのサービス コンテナーに入ります。

[root@localhost ~]# docker ps
コンテナID イメージ コマンド 作成ステータス ポート名
2ac2a810e931 mysql:latest "docker-entrypoint.s..." 3 分前 2 分前にアップ 3306/tcp、33060/tcp db.1.qlmfm6u7lg8u8i1v2m2c3ls3r

[root@localhost ~]# docker exec -it 2ac2a810e931 /bin/sh
# cd /run/secrets/
# ls
mysql-pass
# 猫mysql-pass
根

パスワードがわかったので、MySQL データベースに入ることができます。

#mysql -uroot -p
パスワードを入力してください: 
MySQL モニターへようこそ。コマンドは ; または \g で終わります。
MySQL接続IDは9です
サーバーバージョン: 8.0.19 MySQL コミュニティサーバー - GPL

Copyright (c) 2000, 2020, Oracle およびその関連会社。無断複写・転載を禁じます。

OracleはOracle Corporationおよびその関連会社の登録商標です。
その他の名称は各社の商標である場合があります。
所有者。

ヘルプを表示するには、「help;」または「\h」と入力します。現在の入力ステートメントをクリアするには、「\c」と入力します。

マイSQL>

(IV) スタック内のシークレットの使用

スタックはスタックをデプロイするために docker-compose.yml ファイルを使用するので、docker-compose.yml でシークレットをどのように定義すればよいでしょうか?

バージョン: '3'

サービス:

 ウェブ:
  画像: wordpress
  ポート:
   -8080:80
  秘密:
   -私のパスワード
  環境:
   WORDPRESS_DB_HOST: mysql
   WORDPRESS_DB_PASSWORD_FILE: /run/secrets/wordpress-pass
  ネットワーク:
   - マイネットワーク
  依存:
   -MySQLについて
  展開する:
   モード: 複製
   レプリカ: 3
   再起動ポリシー:
    条件: 失敗時
    遅延: 5秒
    最大試行回数: 3
   アップデート構成:
    並列処理: 1
    遅延: 10秒

 マイスク:
  画像: mysql
  秘密:
   -私のパスワード
  環境:
   MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mysql-pass
   MYSQL_DATABASE: ワードプレス
  ボリューム:
   -mysql-データ:/var/lib/mysql
  ネットワーク:
   - マイネットワーク
  展開する:
   モード: グローバル
   配置:
    制約:
     - node.role == マネージャー

ボリューム:
 mysqlデータ:

ネットワーク:
 私のネットワーク:
  ドライバー: オーバーレイ

シークレットは、環境で WORDPRESS_DB_PASSWORD_FILE と MYSQL_ROOT_PASSWORD_FILE を定義することによって作成されます。当然、この docker-compose.yml ファイルを実行する前に、対応するシークレット ファイルを作成する必要があります。次に、docker stack deploy コマンドを使用してスタックをデプロイできます。

Docker Secret の管理と使用に関するこの記事はこれで終わりです。Docker Secret に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Docker 実行時にユーザーとグループを管理する方法
  • Dockerデータボリューム管理の詳細な説明
  • Docker におけるコンテナデータボリュームとデータ管理の詳細な説明
  • Dockerボリューム権限管理の詳細な説明
  • Linux iptables とインターフェースを使用してコンテナ ネットワークを管理する Docker の詳細な説明
  • Dockerデータ管理の名前付きボリュームの詳細な説明
  • Dockerプライベートウェアハウスの構築とインターフェース管理の詳細な説明
  • Docker クラスターの作成と管理の詳細な説明
  • Dockerの基本について簡単に説明します: データ管理
  • Dockerの基礎 データ管理を学ぶ
  • Docker データ管理 (データ ボリュームとデータ ボリューム コンテナー) の詳細な説明
  • Dockerコンテナのネットワーク管理とネットワーク分離の実装

<<:  タイプライター効果を実現する純粋な js

>>:  16 の XHTML1.0 と HTML の互換性ガイドラインの概要

推薦する

MySQL5.7+ MySQL Workbenchのインストールと設定方法のグラフィックチュートリアル(MAC)

この記事では、主にMACオペレーティングシステムでのMySQL5.7とMySQLWorkbenchの...

LinuxにDockerをインストールする(非常に簡単なインストール方法)

最近、かなり暇です。大学4年生として数か月間インターンをしていました。インターンとして、Docker...

Centos7.4 サーバーへの Apache のインストールとインストール プロセス中に発生した問題の解決策

この記事では、CentOS 7.4 サーバーに Apache をインストールする方法と、インストール...

MySQL 8.0.15 圧縮版インストール グラフィック チュートリアル

この記事では、参考までにMySQL 8.0.15圧縮版のインストール方法を紹介します。具体的な内容は...

JavaScript データのフラット化の詳細な説明

目次フラット化とは何か再帰トストリング減らすアンダーコア_.平坦化_。連合_。違い要約するフラット化...

DockerはRedis5.0をビルドし、データをマウントします

目次1. 永続データの簡単なマウント2. DockerFileでイメージをビルドし、設定ファイルを指...

ネイティブ CSS で無限テキストカルーセルを実装する一般的な方法

テキストカルーセルは私たちの日常生活で非常に一般的です。スーパーマーケットや実店舗の入り口には、テキ...

MySQL 5.5.27 インストール グラフィック チュートリアル

1. MYSQLのインストール1. ダウンロードしたMySQLインストールファイルmysql-5.5...

CSS の一部のプロパティの前には「*」または「_」が付きます。

CSS の一部のプロパティの前には「*」または「_」が付きます。さまざまなブラウザを識別する例えば...

CentOS で RPM を使用して MySQL 5.6 をインストールするチュートリアル

これまでのプロジェクトはすべて Windows システム環境にデプロイされていました。今回は Lin...

HTML 順序なしリスト 箇条書き 画像を使用した CSS の記述

少なくとも 5 冊のベストセラー書籍の順序なしリストを含む HTML ページを作成します。各書籍の前...

VMware Workstation Pro でサーバー仮想マシンを構築する (グラフィック チュートリアル)

私が使用している VMware Workstation Pro のバージョンは次のとおりです。 1....

Tomcatのデフォルトプログラム公開パスの使用と変更についての説明

tomcat7 のデフォルトのプログラム公開パスは tomcat/webapps/ROOT/ です。...

Dockerデータボリューム操作の実装

データボリュームの使用開始先ほどのケースでは、ホストからコンテナにデータをコピーする必要がある場合、...

MySql マスタースレーブレプリケーションメカニズムの包括的な分析

目次マスタースレーブレプリケーションメカニズム非同期レプリケーション準同期レプリケーションマスタース...