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

推薦する

例を通してBRタグとPタグの違いを理解する

<br />改行タグの使用<br>改行タグ<br>は終わりのない...

React Nativeがシミュレータにリンクできない件について

React Native は、現在人気のオープンソース JavaScript ライブラリ React...

MySQL 並列レプリケーションの簡単な分析

01 並列レプリケーションの概念MySQL のマスター スレーブ レプリケーション アーキテクチャで...

Linux に Python 3.8.1 をインストールするための詳細なチュートリアル

この例では、Linux への Python 3.8 のインストールを例に挙げます。 1. 依存パッケ...

Vue3 ミックスインの使い方

目次1. mixin の使い方は? 2. ミックスイン使用時の注意2.1. ミックスイン オブジェク...

ubuntu20.04 LTS システムのデフォルト ソース ソース リスト ファイルの変更

誤って source.list の内容を変更し、一連のエラーが発生した場合は、デフォルトのソース フ...

ウェブデザインにおけるインタラクション: ページングの問題に関する簡単な説明

機能: 前のページまたは次のページにジャンプします。要素: ページングの基本要素は、前のページ + ...

Vueはリストのシームレスなスクロールを実装します

この記事の例では、リストのシームレスなスクロールを実現するためのvueの具体的なコードを参考までに共...

Linuxシステムでノードプロセスを実行しているが、プロセスを強制終了できない問題を解決します

まず、Linux システムで実行されているノード プロセスはプロセスを強制終了できないことを紹介しま...

Nginx を使用してクロスドメイン Vue 開発環境を処理する方法

1. 需要正しい Cookie 配信と SSO テストを確実に実行できるように、ローカル テスト ド...

Linux の cut コマンドの説明

Linux や Unix の cut コマンドは、ファイルの各行から一部を切り取って標準出力に出力す...

MySQL pt-slave-restart ツールの使い方の紹介

目次MySQL マスター スレーブ レプリケーション環境を設定する場合、マスター データベースとスレ...

Firefox の CSS を使用してデータを盗む

0x00 はじめに数か月前、Firefox に脆弱性 (CVE-2019-17016) があること...

Vue3+Element+Tsは、フォームの基本的な検索リセットやその他の機能を実装します

Vue2 の記述スタイルから Vue3 の形式に切り替えると、記述スタイルとコード構造にいくつかの変...