
私のサーバーのDocker LXCコンテナ内でいくつかのサービスを実行していますが、実際にそのサービスを使用していくつかの深刻なタスクを開始しています。
私が明確ではない1つは、ユーザー権限がコンテナの内部と外部でどのように機能するかです。たとえば、コンテナでMySQLを実行し、そのデータディレクトリを/data
Dockerボリュームに設定すると、コンテナの内部および外部のアクセス許可がアクセスポリシーにどのように影響しますか?
明らかに、アイデアは、コンテナ(たとえばmysql:mysql
)内で独自のユーザーとしてMySQLを実行し、ディレクトリに対する読み取りおよび書き込み権限を付与することです。とてもシンプルだと思います。ただchmod
ディレクトリなどにアクセスするだけです。しかし、これはどのように機能しますか?外部コンテナ?これで、「データ」というDocker共有ボリュームが作成されました。これに対するアクセス制御の管理方法は?
特に、権限のないユーザーとして実行できるようにしたいです。外部Dockerコンテナは定期的にMySQL共有ボリュームにアクセスしてデータをバックアップします。
ホストシステムの特定のユーザーがDocker共有ボリュームのファイルとフォルダを読み書きできるように、権限、ユーザー、およびグループを設定するにはどうすればよいですか。
答え1
Docker 0.9がリリースされた後、DockerはLXC
独自の実行環境を放棄して使用しています。libcontainer
あなたの質問は少し古いですが、私の答えはあなたが使用しているバージョンにまだ適用されているようです。
迅速な答え:ボリューム権限を理解するには、たとえ話を使用してくださいmount --bind Host-Dir Container-Dir
。したがって、要件に合わせて既存の方法を使用して権限を管理できます。私はACLが必要だと思います。。
長い答え:あなたの例のように、橋脚ボリュームがあります/data
。
docker run -tid --name dock -v /usr/container/Databases/:/data \
centos:latest /bin/bash
/data
コンテナ内では、MySQLサーバーがデータディレクトリとして使用されるように構成されています。したがって、私たちのデータベースは/data
コンテナ内にあります。ホストOSのコンテナ外に/data
ボリュームをマウントし/usr/container/Databases/
、一般ユーザーを割り当てました。単発バックアップデータベース。ホスト上のユーザーのACLを設定します。単発。
useradd -u 3000 bob
usermod -R o=--- /usr/container/Databases/
setfacl -R -m u:bob:rwx /usr/container/Databases/
setfacl -R -d -m u:bob:rwx /usr/container/Databases/
テストのためにユーザーと一緒にバックアップを作成しましょう。単発。
su - bob
tar -cvf container-data.tar /usr/container/Databases/
tarがリストされ、ユーザーがすべてのファイルにアクセスできることがわかります。
これで、コンテナの内部を調べるとgetfacl
見つけることができます。単発3000が表示されます。これは、bobのUIDが3000でコンテナにそのユーザーがないため、メタデータから受信したUIDのみを表示するためです。コンテナにユーザーを作成すると、3000ではなくbobという名前が表示されるuseradd -u 3000 bob
ことがわかります。getfacl
一般化する:したがって、コンテナの内部または外部で割り当てられたユーザー権限は、両方の環境に反映されます。だからボリュームの権限を管理するには、ホストのUIDとコンテナのUIDが異なる必要があります。。