Docker 実行時にユーザーとグループを管理する方法

Docker 実行時にユーザーとグループを管理する方法

Docker はプロセスを中核としてシステムリソースを分離する管理ツールです。分離は、オペレーティングシステムカーネル機能の cgroups (コントロールグループ) によって実現されます。これには、ユーザーパラメータの制限、アカウント管理、リソース (CPU、メモリ、ディスク I/O、ネットワーク) の使用の分離が含まれます。Docker は、実行時にコンテナ内のプロセスのユーザーとグループを指定できます。指定しない場合は、デフォルトで root になります。ただし、分離によってセキュリティが失われることはありません。従来、特定のアプリケーションは特定のユーザーとして実行され、コンテナ内のプロセスがプログラムを指定するユーザーまたはグループをホスト上に事前に作成する必要はありません。

プロセス制御グループ cgroup は主に次のことを実行できます。

  • リソース制限グループは、構成されたメモリ制限を超えないように設定できます。これにはファイルシステムキャッシュも含まれます。
  • 特定のグループを優先して、CPU使用率やディスクI/Oスループットのシェアを増やす
  • アカウント会計指標は、請求目的など、リソースの使用状況をグループ化します。
  • グループプロセスのフリーズ、チェックポイント、プロセスの再起動を制御します。

cgroup (制御プロセス グループ) に関連するのは、名前空間 (コマンド スペース) の概念です。

名前空間における名前の分離には、主に 6 つの種類があります。

  • PID 名前空間は、プロセス識別子 (PID) の割り当て、プロセスのリスト、およびその詳細を分離します。

新しい名前空間はピアから分離されますが、その「親」名前空間のプロセスは、子名前空間のすべてのプロセスを引き続き認識します (ただし、PID 番号は異なります)。

  • ネットワーク名前空間は、ネットワーク インターフェイス コントローラー (物理または仮想)、iptables ファイアウォール ルール、ルーティング テーブルなどを分離します。ネットワーク名前空間は、「veth」仮想イーサネット デバイスを使用して相互に接続できます。
  • UTS 名前空間ではホスト名を変更できます。
  • マウント名前空間を使用すると、さまざまなファイルシステム レイアウトを作成したり、特定のマウント ポイントを読み取り専用にしたりできます。
  • IPC 名前空間は、名前空間を通じて System V プロセス間通信を分離します。
  • ユーザー名前空間は、ユーザー ID を名前空間ごとに分離します。

通常のユーザー docker コンテナ内で root を実行する

たとえば、busybox は Docker コンテナ内でソフトウェアを root として実行できます。ただし、Docker コンテナ自体は通常のユーザーとして実行されます。

この状況を考えてみましょう

エコーテスト | docker run -i busybox cat

前者は現在のユーザーの現在のシステムプロセスであり、後者はコンテナー内のユーザーとプロセスに転送されて実行されます。

コンテナ内で PID 1 として実行している場合、Linux はシグナル システムのデフォルトの動作を無視し、プロセスが終了しないようにコーディングされていない限り、SIGINT または SIGTERM シグナルを受信して​​もプロセスは終了しません。Dockerfile STOPSIGNAL シグナルを介して停止シグナルを指定できます。

のように:

ストップシグナル SIGKILL

Dockerfileを作成する

アルパイン:最新より
apk add --update htop && rm -rf /var/cache/apk/* を実行します。
CMD ["htop"]
$ docker build -t myhtop . #イメージをビルド $ docker run -it --rm --pid=host myhtop #ホストプロセスと同じ名前空間で実行

通常のユーザーdocker runはコンテナ内の異なるユーザーdemo_userを指定します

docker run --user=demo_user:group1 --group-add group2 <イメージ名> <コマンド>

ここで、demo_user、group1 (プライマリ グループ)、group2 (セカンダリ グループ) はホストのユーザーとグループではなく、コンテナ イメージの作成時に作成されます。

Dockerfile の USER 命令で実行ユーザーが指定されていない場合、コンテナはプロセスを root ユーザーとして実行します。

Dockerでユーザーを指定する方法

特定のコマンドを実行するには、Dockerfile でユーザーを指定します。

USER <ユーザー>[:<グループ>] #または USER <UID>[:<GID>]

docker run -u(--user)[user:group] または --group-add パラメータメソッド

$ docker run busybox cat /etc/passwd
ルート:x:0:0:root:/root:/bin/sh
...
www-data:x:33:33:www-data:/var/www:/bin/false
誰も:x:65534:65534:誰も:/home:/bin/false

$ docker run --user www-data ビジーボックスID
uid=33(www-データ) gid=33(www-データ)

Dockerコンテナ内のユーザーの権限

次の状況を比較すると、ホスト内の通常のユーザーによって作成されたファイルは、Docker コンテナ内のルートユーザー所有者にマッピングされます。

$ mkdir テスト && touch テスト/a.txt && cd テスト
$ docker run --rm -it -v `pwd`:/mnt -w /mnt busybox /bin/sh -c 'ls -al /mnt/*' 
-rw-r--r-- 1 ルート ルート 0 10月22日 15:36 /mnt/a.txt

コンテナのボリューム ディレクトリに作成されたファイルは、ホスト上で現在 Docker を実行しているユーザーに対応します。

$ docker run --rm -it -v `pwd`:/mnt -w /mnt busybox /bin/sh -c 'touch b.txt'
$ ls -al
-rw-r--r-- 1 xwx スタッフ 0 10 22 23:36 a.txt
-rw-r--r-- 1 xwx スタッフ 0 10 22 23:54 b.txt

Docker ボリュームのファイルアクセス権限

ボリュームを作成して使用します。Docker は相対パスのマウント ポイントをサポートしていません。複数のコンテナーが同時に同じボリュームを使用できます。

$ docker volume create hello #ボリュームhelloを作成

$ docker run -it --rm -v hello:/world -w /world busybox /bin/sh -c 'touch /world/a.txt && ls -al' #コンテナにビルドされたファイルの合計は 8 個です
drwxr-xr-x 2 ルート ルート 4096 10月22日 16:38 。
drwxr-xr-x 1 ルート ルート 4096 10月22日 16:38 ..
-rw-r--r-- 1 ルート ルート 0 10月22日 16:38 a.txt

$ docker run -it --rm -v hello:/world -w /world busybox /bin/sh -c 'rm /world/a.txt && ls -al' #コンテナから合計8個を削除します
drwxr-xr-x 2 ルート ルート 4096 10月22日 16:38 。
drwxr-xr-x 1 ルート ルート 4096 10月22日 16:38 ..

外部でファイルを作成し、コンテナ内の指定されたユーザーとして削除する

$ touch c.txt && sudo chmod root:wheel c.txt
$ docker run -u 100 -it --rm -v `pwd`:/world -w /world busybox /bin/sh -c 'rm /world/c.txt && ls -al'

実際に削除できる

rm: '/world/c.txt'を削除しますか? y
合計 4
drwxr-xr-x 4 100 root 128 10月23日 16:09 .
drwxr-xr-x 1 ルート ルート 4096 10月23日 16:09 ..
-rw-r--r-- 1 100 ルート 0 10月22日 15:36 a.txt
-rw-r--r-- 1 100 ルート 0 10月22日 15:54 b.txt

Docker の一般ユーザーのポート権限は 1024 未満

 $ docker run -u 100 -it --rm -p 70:80 busybox /bin/sh -c 'nc -l -p 80'
nc: bind: 権限が拒否されました # ユーザー ID が 100 の場合、ポート 80 を開くことができません$ docker run -u 100 -it --rm -p 70:8800 busybox /bin/sh -c 'nc -l -p 8800' # コンテナー ポートが 1024 より大きい場合は、...
 $ docker run -it --rm -p 70:80 busybox /bin/sh -c 'nc -l -p 80' #コンテナ内で root を使用することもできます...

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Dockerコンテナでユーザーを分離する方法
  • Linuxで新しいユーザーを作成し、dockerと基本的なdockerコマンドを許可する
  • Docker に共通コンポーネント (mysql、redis) をインストールする方法
  • Docker Swarmを使用してクラスターを構築する方法

<<:  MySQL の binlog ログと、binlog ログを使用してデータを回復する方法を説明します。

>>:  JavaScript で H5 ゴールド コイン関数を実装する (サンプル コード)

推薦する

Web でよく使われるフォントの紹介 (iOS および Android ブラウザでサポートされているフォント)

年末なので仕事も少なくなっています。私が何もせずにいるのを見ると、上司はきっと不快に思うでしょう。そ...

Windows Server2014 にセキュリティを適用して MySQL をインストールする際のエラーに対する完璧な解決策

理由はインストール後にきちんとアンインストールされなかったためです。この問題を解決するには、次の点に...

JavaScript は、マウスがテーブル行を通過するときに色の識別を実装します。

この記事では、マウスがテーブルの行を通過するときにJavaScriptを使用して色ラベルを表示する方...

MySQL の主キーとトランザクションの詳細な説明

目次1. MySQLの主キーとテーブルフィールドに関するコメント1. 主キーと自動増分2. テーブル...

WeChatアプレットのスクロールビューは、プルアップ時にデータの読み込みを重複させるソリューションを実装しています。

WeChat アプレットのスクロール ビューでは、プルアップして読み込むときにバグが多く発生します...

Xshell を使用して VMware 上の Linux 仮想マシンに接続する (グラフィック手順)

はじめに: 最近 Hadoop プラットフォームの構築を勉強し始めたので、ローカルマシンに VMwa...

Linux 環境に MySQL 8.0 をインストールするプロセスの紹介

目次序文1. Linux は yum ソースを変更します (MYSQL のインストールが遅い場合は試...

Windows 10にOdoo12開発環境をインストールする方法

序文多くの友人は Mac コンピューターを持っていないと言っていますが、Windows 開発は実際に...

Dockerは元のタグのイメージの再タグ付けと削除を実装します

docker イメージ ID は一意であり、イメージを物理的に識別できます。repository: ...

MySQL の group by に関する簡単な説明

目次1. はじめに2. ユーザーテーブルを準備する2.1 グループ化ルール2.2 グループの使用2....

mysql8.x docker リモートアクセスの詳細な設定

目次環境条件エラーが発生しました回避策1. mysql dockerにログインする2. ルートパスワ...

正の整数かどうかを判断するMYSQLカスタム関数の例コード

関数を記述できます。主に正規表現を使用して判断を行います。入力文字が空の場合は、「-」を使用して置き...

Vue のグローバル ウォーターマーク実装例

目次1. 透かしのJsファイルを作成する2. 導入操作2.1 App.vueや他のページでの参照2....

Linux viコマンドの知識ポイントと使い方のまとめ

Linux viコマンドの詳しい説明vi エディタは、すべての Unix および Linux システ...

Layuiはログインインターフェース検証コードを実装します

この記事の例では、ログインインターフェース検証コードを実装するためのlayuiの具体的なコードを参考...