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 の互換性ガイドラインの概要

推薦する

MongoDBのパフォーマンスを向上させる方法

MongoDB は高性能なデータベースですが、使用していくうちにパフォーマンスの問題が発生することが...

CSS属性のマージンの理解について話す

1.マージンとは何ですか?マージンは、要素の周囲のスペースの間隔を制御するために使用され、視覚的にス...

LinuxにComposerをインストールする方法

1. インストールスクリプト(composer-setup.php)を現在のディレクトリにダウンロー...

Linux7で仮想ホストを実装する3つの方法

1. 同じIPアドレス、異なるポート番号仮想ホスト 1: ホスト IP アドレスは 172.16.3...

ブラウザの互換モードでボタン内のテキストが垂直方向に中央揃えにならない問題について簡単に説明します。

XML/HTML コードコンテンツをクリップボードにコピー<ボタンスタイル= "カ...

Linux Zabbixカスタム監視およびアラーム実装プロセスの分析

ターゲットzabbix フロントエンド監視の iostat コマンドでデータの 1 つを表示します。...

MySQL-8.0.26 構成グラフィックチュートリアル

はじめに: 最近、会社のプロジェクトでデータベースのバージョンが変更されました。ここでは、MySQL...

JavaScript と CSS を最適化してウェブサイトのパフォーマンスを向上させる

<br /> 第 1 部と第 2 部では、Web サイトのパフォーマンス、ページ コンテ...

MySQLデータベースを別のマシンに移行する方法の詳細な説明

1. まず、移行サーバー上のデータ ファイルを見つけます。MySQL 5.7 とデフォルトのインスト...

ウェブデザインで注意すべき検索最適化の知識

1. 新サイトホームページのリンクレイアウト1. リンク配置の位置:リンク配置の位置によって、リンク...

Linux カーネルの copy_{to, from}_user() に関する考察

目次1. copy_{to,from}_user() とは何か1. copy_{to,from}_u...

Win10システムにMySQL 8.0をインストールするときに発生する問題を解決する

Win10 システムに MySQL 8.0 をインストールする際に発生する問題と解決策は次のとおりで...

HTML の基本 - CSS スタイルシート、スタイル属性、フォーマット、レイアウトの詳細

1.位置:固定一部の Web サイトの右下隅にあるポップアップ ウィンドウなどの、ブラウザーを基準と...

Vue3とTypeScriptを組み合わせたプロジェクト開発の実践の概要

目次概要1. コンポジションAPI 1. ref と reactive の違いは何ですか? 2. 周...

CSS変数がJSインタラクティブコンポーネント開発にもたらす改善と変更のサンプルコードの詳細な説明

1. CSS変数がもたらす質的変化CSS 変数によってもたらされる改善は、CSS コードの節約や C...