Dockerを使用してアプリケーションを日常的に実行すると、接続の試行中にDocker権限が拒否されるなどのエラーが発生した場合、悪夢になる可能性があります。ただし、心配しないでください。この記事は、すぐに実行を再開するのに役立ちます。
このチュートリアルでは、恐ろしいDocker権限が拒否されたというエラーメッセージを解決する多くの方法を学びます。
前提条件
このチュートリアルは、実践的なデモンストレーションで構成されています。フォローするには、次のものが適切に配置されていることを確認してください。
- このチュートリアルのデモはUbuntu20.04で実行されますが、他のLinuxディストリビューションでも機能します。
- バージョン20.10.8を実行するチュートリアルを備えたDockerエンジンは、3967b7dをビルドします。
高度なDockerコマンドの実行
多くの要因が許可の拒否につながる可能性があります Dockerへの接続中にエラーが発生しました。これらの要因の1つは、sudo
を付加せずにDockerコマンドを実行している可能性があることです。 指図。 sudo
コマンドは、コマンドを実行するときにセキュリティ権限とともに昇格された管理者権限を与えるものです。
以下に、恐ろしい許可が拒否されましたを示します。 docker
を実行しようとしたときにエラーが発生しました コマンド。
ターミナルを起動し、sudo
を先頭に追加します docker
に 以下のコマンドでrun
hello-world
Dockerイメージ。昇格したコマンドを実行しているため、続行するにはパスワードを入力する必要があります。
sudo docker run hello-world
以下に示すような出力が表示され、Dockerが正しくインストールされていることを示します。
Dockerエンジンの再起動
昇格されたDockerコマンドを実行しても、許可が拒否されましたが修正されない場合 エラーが発生した場合は、Dockerエンジンが実行されていることを確認してください。 docker
を実行するのと似ています sudo
なしのコマンド コマンドを実行すると、Dockerエンジンが停止すると許可が拒否されました エラー。エラーをどのように修正しますか? Dockerエンジンを再起動する。
systemctl
を実行します 以下のコマンドを使用して、Dockerエンジンのステータスを確認します(status docker
)そしてそれが実行されているかどうか。
sudo systemctl status docker
以下では、アクティブ(実行中)を示す返されたステータスからDockerエンジンが実行中であることがわかります。
Dockerエンジンがアクティブでない場合は、systemctl
を実行します 以下のコマンドを使用してDockerエンジンを起動します(start docker
。
sudo systemctl start docker
ここで、「昇格されたDockerコマンドの実行」セクションで行ったようにhello-world Dockerコマンドを実行して、エラーが解決されたことを確認します。
sudo docker run hello-world
root以外のユーザーアクセスを持つグループへのユーザーアカウントの追加
Dockerエンジンが機能していることを確認しましたが、Dockerの許可が拒否されました エラー?その場合は、root以外のユーザーアクセス権を持つグループにユーザーアカウントを追加する必要があります。なんで?ユーザーグループに属していないLinuxマシンで実行するDockerコマンドは、許可が拒否されましたをトリガーするためです。 エラー。
-
groupadd
を実行します 以下のコマンドを使用して、docker
という新しいグループを作成します 。コマンドの実行を続行するには、パスワードを入力してください。
sudo groupadd docker
Dockerグループがユーザーグループに存在する場合は、次のような出力が表示されます。
2.次に、usermod
を実行します 以下のコマンド-aG
オプションは、コマンドにユーザーアカウントを追加するように指示します(programmer
)から(docker
) グループ。このコマンドにより、ユーザーアカウントに非ユーザーアクセスが許可されます。
sudo usermod -aG docker programmer
3. newgrp
を実行します 以下のコマンドを使用して、現在の実際のグループIDをdocker
に変更します。 グループ。
Dockerをroot以外のユーザーとして実行するたびに、このコマンドを実行します。
sudo newgrp docker
4.最後に、hello-world Dockerイメージを再実行して、エラーが表示されなくなったことを確認します。この時点でまだエラーが発生する場合は、docker.sockファイルへのアクセスを増やすことを検討してください。 docker.sock fileはUNIXソケットであり、ユーザーとシステムの間でプロセス情報を伝達する方法であり、DockerデーモンがDockerAPIのエントリポイントとしてリッスンします。
chmod
を実行します 以下のコマンドを使用して、すべてのユーザーに読み取り/書き込みを許可します(666
)/var/run/docker.sock
へのアクセス ファイル。次に、hello-world Dockerイメージを再度実行して、エラーが解決されたかどうかを確認します。
sudo chmod 666 /var/run/docker.sock
Dockerサービスユニットファイルの編集
root以外のユーザーとしてDockerを実行してもエラーを修正できない場合は、Docker SystemD、サービス制御システム、サービスユニットファイルを編集してみてください。 Dockerサービスファイルには、Dockerデーモンの動作を変更する可能性のある機密パラメーターが含まれています。追加のコマンドを追加してサービスのデフォルトの動作を変更することで、Dockerユニットファイルのデフォルトの動作を変更できます。
1.以下のコマンドを実行して、お気に入りのテキストエディターでDockerサービスユニットファイルを開きます。この例では、Dockerサービスファイルがnanoテキストエディターで開きます。
sudo nano /usr/lib/systemd/system/docker.service
2.[サービス]でエリアを見つけます 以下に示すように、Dockerサービスユニットファイル内のヘッダー。以下のコマンドをDockerサービスユニットファイルにコピーして貼り付け、変更を保存します。
以下、SupplementaryGroups
コマンドは、補足のUnixグループをプロセスが実行される場所に設定します。同時に、ExecStartPost
コマンドは、サービスが正しく起動しなかった場合でも実行される操作をクリーンアップします。
SupplementaryGroups=docker
ExecStartPost=/bin/chmod 666 /var/run/docker.sock
3.次に、以下のコマンドを実行して、Dockerサービスを再起動して有効にします。そうすることで、Dockerコマンドを実行するときにエラーが発生しないように、Dockerサービスを新たに開始できます。
# Reloads all the Docker unit files and recreates the entire dependency tree.
sudo systemctl daemon-reload
# Restarts the Docker service
sudo systemctl start docker
# Enable the Docker to run on your computer.
sudo systemctl enable docker
4.最後に、hello-world
を再実行します Dockerイメージを使用して、アクセス許可が拒否されたというエラーが引き続き発生するかどうかを確認します。
Dockerを特権モードで実行する
最後になりましたが、Docker権限拒否エラーの修正リストには、Dockerを特権モードで実行しています。そうすることで、Dockerコンテナにシステムへのルートアクセスが許可されます。
Dockerを特権モードで実行することは危険であり、ハッカーからの攻撃に対して脆弱です。したがって、注意して、自分が何をしているかを正確に理解している場合にのみ、Dockerを特権モードで実行してください。
1.以下のコマンドを実行して、システム内のすべてのDockerコンテナーを一覧表示し、実行するコンテナーのIDを取得します。
sudo docker ls -a
2.次に、docker inspect
を実行します 以下のコマンドを実行して、実行するコンテナがすでに特権モードになっているかどうかを確認します(--format='{{.HostConfig.Privileged}}'
)。 CONTAINER_ID
を置き換えます 以下に、手順1でメモした実際のコンテナIDを示します。
docker inspect --format='{{.HostConfig.Privileged}}' CONTAINER_ID
コンテナが特権モードの場合、コマンドは trueを返します コンソールへの値。ただし、以下に示すように、コマンドがfalse値を返した場合は、次の手順に進みます。
3.最後に、docker
を実行します 以下のコマンドでrun
特権モードのDockerコンテナ(--privileged hello-world
)。
sudo docker run --privileged hello-world
結論
このチュートリアルを通じて、Dockerの許可が拒否されたを解決する多くの方法を学びました。 エラー、昇格されたコマンドの実行から特権モードでのDockerの実行まで。
これで、Dockerを利用したアプリケーションを構築するときにエラーを取り除く方法がわかりました。 Dockerイメージを常にクリーンに保ちたいと思うかもしれませんか?