Mac のアクセス権要求を理解¶
このページには、 Docker Desktop を Mac 上にインストールして実行するために必要な、アクセス権の要求についての情報が入っています。プロセス com.docker.vmnetd
に対する
また、ホスト上で root
アクセス権を持つのではなく、コンテナを root
として実行するのも明確にします。
アクセス権の要求 ¶
標準のセットアップ手順では、 Docker Desktop for Mac のインストールに管理者権限を必要としません。ですが、始めての実行時、 root
権限の許可が必要です。Docker Desktop の初回起動時、特権ヘルパーサービスをインストールする権限を与えるよう、管理者としてログインするようユーザに求めます。以降の実行では、 root
権限は不要です。
Docker Desktop が特権ヘルパープロセス com.docker.vmnetd
を使うようにしている理由は、限定的な一連の特権が必要な操作を処理するためです。この手法は、最小限の権限という原則に従い、間違いなく必要な処理のみ root
にアクセスできるようにするため、Docker Desktop に特権を与えないまま利用できます。
Docker Desktop for Mac のバージョン 4.11 以上からは、 コマンドでのインストール に --user
フラグを使うと、バックグランドで特権ヘルパーサービスが実行するのを阻止します。この結果、 com.docker.vmnet
はインストール中のみ利用されますが、実行時には無効化されます。そうすると、 Docker Desktop を始めて実行する時に、管理者としてのログインを求める画面が表示されません。具体的に、 --user
フラグとは:
以前の
com.docker.vmnetd
が存在する場合、アンインストールユーザに対する :ruby;`シンボリックリンク <symlinks>` のセットアップ
localhost
とkubernetes.docker.internal
が/etc/hosts
に確実に現れるようにする
この手法には、以下の制限があります:
特権ヘルパー ¶
特権ヘルパーは launched
によって起動され、前述の通り、無効化しなければ実行時にバックグラウンドで動き続けます。Docker Desktop バックエンドとは、 Unix ドメインソケット /var/run/com.docker.vmnetd.sock
で通信します。次のような処理が行われます:
/usr/local/bin
にシンボリックリンクをインストールまたはアンインストールする。これによりdocker
CLI がユーザのシェル上のパスになくても、ログアウトやログアウトせずに利用できる。特権ポートの
確保 は 1024 以下。いわゆる「特権ポート 」は一般的にセキュリティ境界として使用していない。しかし、 OS では依然として特権のないプロセスによるポート確保を防ごうとするので、docker run -p 80:80 nginx
のようなコマンドは使えない。localhost
とkubernetes.docker.internal` が ``/etc/hosts
で定義されるようにする。いくつかの古い macOS へのインストールでは、/etc/hosts
にlocalhost
がないため、 Docker は起動失敗します。 DNS 名kubernetes.docker.internal
の定義により、Kubernetes のコンテキストにコンテナを共有できる。開発者には、読み込み専用のレジストリ アクセス管理ポリシーを、安全にキャッシュする。
特権へルパをアンインストールする。
Linux VM 内で root としてコンテナを実行¶
Docker デーモンとコンテナは、Docker によって管理されている軽量な Linux VM 内で実行されます。これはつまり、コンテナはデフォルトでは root
として実行しているとはいえ、Mac ホストマシンに対しての root
アクセス許可ではありません。Linux VM サーバはセキュリティ境界であり、ホストからどのリソースにアクセスできるか制限があります。ホストから Docker コンテナ内にバインド マウントされるあらゆるディレクトリは、元々のパーミッションを維持したままです。
参考
- Understand permission requirements for Mac
https://docs.docker.com/desktop/mac/permission-requirements/