トラブルシューティング Docker パーミッションが拒否される問題

Dockerを使用してアプリケーションを実行することは、接続しようとしているときにDocker権限が拒否されるなどのエラーに遭遇すると、日常業務が悪夢になることがあります。しかし心配しないでください、この記事はすぐに立ち上げるのに役立ちます。

このチュートリアルでは、恐れられているDocker権限が拒否されたエラーメッセージを解決するためのさまざまな方法を学びます。

前提条件

このチュートリアルは、実演を含みます。一緒に進むには、以下の事項を確認してください:

  • このチュートリアルのデモはUbuntu 20.04で実行されますが、他のLinuxディストリビューションでも動作します。
  • チュートリアルがバージョン20.10.8、ビルド3967b7dで実行されているDockerエンジン。

昇格されたDockerコマンドの実行

Dockerに接続しようとする際に権限が拒否されるエラーが発生する要因はさまざまです。その要因の1つは、sudoコマンドを先頭に追加せずにDockerコマンドを実行している可能性があります。 sudoコマンドは、コマンドを実行する際に昇格された管理権限とセキュリティ特権を提供します。

以下では、dockerコマンドを実行しようとする際に恐れられる権限が拒否されるエラーが表示されます。

Running into a permission denied error

ターミナルを起動し、以下のdockerコマンドの前にsudoを付けて、hello-world Dockerイメージを実行します。昇格されたコマンドを実行しているため、続行するにはパスワードを入力する必要があります。

sudo docker run hello-world

以下のような出力が表示され、Dockerが正しくインストールされていることが示されます。

Running Elevated (sudo) Docker Commands

Dockerエンジンの再起動

昇格されたDockerコマンドを実行してもpermission deniedエラーが解消されない場合は、Dockerエンジンが実行されているか確認してください。sudoコマンドなしでdockerコマンドを実行する場合と同様に、停止したDockerエンジンはpermission deniedエラーを引き起こします。エラーを修正するには、Dockerエンジンを再起動します。

以下のsystemctlコマンドを実行して、Dockerエンジンのステータス(status docker)と実行状態を確認します。

sudo systemctl status docker

以下のステータスから、Dockerエンジンが実行中であることがわかります。ctive (running)

Displaying Docker Engine status

Dockerエンジンがアクティブでない場合は、以下のsystemctlコマンドを実行してDockerエンジンを起動します(start docker)。

sudo systemctl start docker

今、エラーが解決されていることを確認するために、「昇格したDockerコマンドの実行」セクションで行ったように、hello-world Dockerコマンドを実行してください。

sudo docker run hello-world

非ルートユーザーアクセスのグループにユーザーアカウントを追加する

あなたのDockerエンジンが動作していることを確認しましたが、まだDocker権限が拒否されましたエラーを取得していますか? そうであれば、非ルートユーザーアクセスのグループにユーザーアカウントを追加する必要があります。なぜなら、ユーザーグループに属さないLinuxマシンで実行するすべてのDockerコマンドは権限が拒否されましたエラーを引き起こします。

  1. 以下のgroupaddコマンドを実行して、dockerという新しいグループを作成してください。 コマンドを継続するには、パスワードを入力してください。
sudo groupadd docker

dockerグループがユーザーグループに存在する場合は、以下のような出力が表示されます。

Creating a New Group Named ‘docker’

次に、-aGオプションでprogrammer(ユーザーアカウント)をdocker(グループ)に追加するように指示するusermodコマンドを実行します。 このコマンドにより、ユーザーアカウントに非ユーザーアクセスが付与されます。

sudo usermod -aG docker programmer

現在の実際のグループIDをdockerグループに変更するために、以下のnewgrpコマンドを実行します。

非ルートユーザーとしてDockerを実行するたびにこのコマンドを実行してください。

sudo newgrp docker 

4. 最後に、hello-world Dockerイメージを再実行して、エラーがもう表示されないことを確認してください。この時点で、まだエラーが発生している場合は、docker.sockファイルにより多くのアクセス権を与えることを検討してください。 docker.sockファイルは、ユーザーとシステム間のプロセス情報を通信するためのUNIXソケットであり、DockerデーモンがDocker APIのエントリーポイントとしてリッスンしているものです。

以下のchmod コマンドを実行して、/var/run/docker.sockファイルにすべてのユーザーに読み書き(666)アクセス権を付与します。 今度は、エラーが解決されているかどうかを確認するために、hello-world Dockerイメージを再実行します。

sudo chmod 666 /var/run/docker.sock

Dockerサービスユニットファイルの編集

非ルートユーザーとしてDockerを実行するだけではエラーが解決しない場合は、Docker SystemD、サービス制御システム、サービスユニットファイルを編集してみてください。 Dockerサービスファイルには、Dockerデーモンの動作を変更する可能性のある機密性の高いパラメータが含まれています。 サービスのデフォルト動作を変更するために、追加のコマンドを追加してDockerユニットファイルのデフォルト動作を変更できます。

この例では、Dockerサービスファイルがnanoテキストエディタで開きます。

sudo nano /usr/lib/systemd/system/docker.service

2. Dockerサービスユニットファイル内で[Service]ヘッダーがあるエリアを見つけてください。以下に示すように、以下のコマンドをDockerサービスユニットファイルにコピー/貼り付けて変更を保存してください。

以下のSupplementaryGroupsコマンドは、プロセスが実行される場所の補助Unixグループを設定します。同時にExecStartPostコマンドは、サービスが正常に起動しない場合でも実行される操作をクリーンアップします。

SupplementaryGroups=docker    
ExecStartPost=/bin/chmod 666 /var/run/docker.sock
Editing the Docker Service Unit File

3. これで、以下のコマンドを実行してDockerサービスを再起動し有効にしてください。これにより、Dockerコマンドを実行する際にエラーが発生しないようにDockerサービスを新たに開始できます。

# すべてのDockerユニットファイルをリロードし、完全な依存関係ツリーを再作成します。
sudo systemctl daemon-reload
# Dockerサービスを再起動します
sudo systemctl start docker
# Dockerをコンピュータで実行できるようにします。
sudo systemctl enable docker

4. 最後に、hello-world Dockerイメージを再実行して、まだ権限が拒否されているか確認してください。

特権モードでDockerを実行する

最後に、Dockerの権限が拒否されるエラーを修正するリストの中でDockerを特権モードで実行することがあります。これにより、Dockerコンテナにシステムへのルートアクセスが付与されます。

特権モードでDockerを実行することは危険で、ハッカーからの攻撃に対して脆弱です。したがって、正確に何をしているか分かる場合にのみ、特権モードでDockerを実行してください。

1. 以下のコマンドを実行して、システム内のすべてのDockerコンテナをリストアップし、実行したいコンテナのIDを取得します。

sudo docker ls -a
Listing all Docker Containers in the System

2. 次に、docker inspectコマンドを以下のように実行して、実行したいコンテナが既に特権モードであるかを確認します(--format='{{.HostConfig.Privileged}}')。以下のコードのCONTAINER_IDを、ステップ1でメモした実際のコンテナIDで置き換えます。

docker inspect --format='{{.HostConfig.Privileged}}' CONTAINER_ID

コンテナが特権モードである場合、コマンドはコンソールにtrueという値を返します。しかし、コマンドがfalseの値を返す場合(以下に示すように)、次のステップに進みます。

Checking if a Container is in Privileged Mode

3. 最後に、以下のdockerコマンドを実行して、Dockerコンテナを特権モードで実行します(--privileged hello-world)。

sudo docker run --privileged hello-world

結論

このチュートリアルを通じて、Docker permission deniedエラーを解決するための多くの方法を学びました。権限昇格コマンドの実行からDockerを特権モードで実行するまで。

これで、Dockerパワードのアプリケーションのビルド時にエラーを取り除く方法がわかりました。おそらく、常にDockerイメージをクリーンに保ちたいと思うかもしれませんか?

Source:
https://adamtheautomator.com/docker-permission-denied/