Dockerを使用してアプリケーションを実行することは、接続しようとしているときにDocker権限が拒否されるなどのエラーに遭遇すると、日常業務が悪夢になることがあります。しかし心配しないでください、この記事はすぐに立ち上げるのに役立ちます。
このチュートリアルでは、恐れられているDocker権限が拒否されたエラーメッセージを解決するためのさまざまな方法を学びます。
前提条件
このチュートリアルは、実演を含みます。一緒に進むには、以下の事項を確認してください:
- このチュートリアルのデモはUbuntu 20.04で実行されますが、他のLinuxディストリビューションでも動作します。
- チュートリアルがバージョン20.10.8、ビルド3967b7dで実行されているDockerエンジン。
昇格されたDockerコマンドの実行
Dockerに接続しようとする際に権限が拒否されるエラーが発生する要因はさまざまです。その要因の1つは、sudo
コマンドを先頭に追加せずにDockerコマンドを実行している可能性があります。 sudo
コマンドは、コマンドを実行する際に昇格された管理権限とセキュリティ特権を提供します。
以下では、docker
コマンドを実行しようとする際に恐れられる権限が拒否されるエラーが表示されます。

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

Dockerエンジンの再起動
昇格されたDockerコマンドを実行してもpermission deniedエラーが解消されない場合は、Dockerエンジンが実行されているか確認してください。sudo
コマンドなしでdocker
コマンドを実行する場合と同様に、停止したDockerエンジンはpermission deniedエラーを引き起こします。エラーを修正するには、Dockerエンジンを再起動します。
以下のsystemctl
コマンドを実行して、Dockerエンジンのステータス(status docker
)と実行状態を確認します。
以下のステータスから、Dockerエンジンが実行中であることがわかります。ctive (running)

Dockerエンジンがアクティブでない場合は、以下のsystemctl
コマンドを実行してDockerエンジンを起動します(start docker
)。
今、エラーが解決されていることを確認するために、「昇格したDockerコマンドの実行」セクションで行ったように、hello-world Dockerコマンドを実行してください。
非ルートユーザーアクセスのグループにユーザーアカウントを追加する
あなたのDockerエンジンが動作していることを確認しましたが、まだDocker権限が拒否されましたエラーを取得していますか? そうであれば、非ルートユーザーアクセスのグループにユーザーアカウントを追加する必要があります。なぜなら、ユーザーグループに属さないLinuxマシンで実行するすべてのDockerコマンドは権限が拒否されましたエラーを引き起こします。
- 以下の
groupadd
コマンドを実行して、docker
という新しいグループを作成してください。 コマンドを継続するには、パスワードを入力してください。
dockerグループがユーザーグループに存在する場合は、以下のような出力が表示されます。

次に、-aG
オプションでprogrammer
(ユーザーアカウント)をdocker
(グループ)に追加するように指示するusermod
コマンドを実行します。 このコマンドにより、ユーザーアカウントに非ユーザーアクセスが付与されます。
現在の実際のグループIDをdocker
グループに変更するために、以下のnewgrp
コマンドを実行します。
非ルートユーザーとしてDockerを実行するたびにこのコマンドを実行してください。
4. 最後に、hello-world Dockerイメージを再実行して、エラーがもう表示されないことを確認してください。この時点で、まだエラーが発生している場合は、docker.sockファイルにより多くのアクセス権を与えることを検討してください。 docker.sockファイルは、ユーザーとシステム間のプロセス情報を通信するためのUNIXソケットであり、DockerデーモンがDocker APIのエントリーポイントとしてリッスンしているものです。
以下のchmod
コマンドを実行して、/var/run/docker.sock
ファイルにすべてのユーザーに読み書き(666
)アクセス権を付与します。 今度は、エラーが解決されているかどうかを確認するために、hello-world Dockerイメージを再実行します。
Dockerサービスユニットファイルの編集
非ルートユーザーとしてDockerを実行するだけではエラーが解決しない場合は、Docker SystemD、サービス制御システム、サービスユニットファイルを編集してみてください。 Dockerサービスファイルには、Dockerデーモンの動作を変更する可能性のある機密性の高いパラメータが含まれています。 サービスのデフォルト動作を変更するために、追加のコマンドを追加してDockerユニットファイルのデフォルト動作を変更できます。
この例では、Dockerサービスファイルがnanoテキストエディタで開きます。
2. Dockerサービスユニットファイル内で[Service]ヘッダーがあるエリアを見つけてください。以下に示すように、以下のコマンドをDockerサービスユニットファイルにコピー/貼り付けて変更を保存してください。
以下のSupplementaryGroups
コマンドは、プロセスが実行される場所の補助Unixグループを設定します。同時にExecStartPost
コマンドは、サービスが正常に起動しない場合でも実行される操作をクリーンアップします。

3. これで、以下のコマンドを実行してDockerサービスを再起動し有効にしてください。これにより、Dockerコマンドを実行する際にエラーが発生しないようにDockerサービスを新たに開始できます。
4. 最後に、hello-world
Dockerイメージを再実行して、まだ権限が拒否されているか確認してください。
特権モードでDockerを実行する
最後に、Dockerの権限が拒否されるエラーを修正するリストの中でDockerを特権モードで実行することがあります。これにより、Dockerコンテナにシステムへのルートアクセスが付与されます。
特権モードでDockerを実行することは危険で、ハッカーからの攻撃に対して脆弱です。したがって、正確に何をしているか分かる場合にのみ、特権モードでDockerを実行してください。
1. 以下のコマンドを実行して、システム内のすべてのDockerコンテナをリストアップし、実行したいコンテナのIDを取得します。

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

3. 最後に、以下のdocker
コマンドを実行して、Dockerコンテナを特権モードで実行します(--privileged hello-world
)。
結論
このチュートリアルを通じて、Docker permission deniedエラーを解決するための多くの方法を学びました。権限昇格コマンドの実行からDockerを特権モードで実行するまで。
これで、Dockerパワードのアプリケーションのビルド時にエラーを取り除く方法がわかりました。おそらく、常にDockerイメージをクリーンに保ちたいと思うかもしれませんか?
Source:
https://adamtheautomator.com/docker-permission-denied/