dockerコマンドを実行するときにsudoをつけずに実行できるようにする方法について解説します。
一般ユーザーがsudoなしで実行できるのは好ましい設定ではありません。本設定はローカル環境での利用にとどめ、ほかの人と共有して使用するサーバーや本番環境では、誤ってコンテナを停止してしまうなどの事故を防ぐため、sudoを使用して操作することを推奨します。
ユーザーをdockerグループに追加する
手順自体はとてもシンプルですが、一つずつ確認していきます。
dockerグループの確認
まずはdockerグループがあるか確認します。
$ cat /etc/group | grep docker
docker:x:957:
Dockerのインストール方法にもよりますが、たいていはdockerグループが存在しています。
dockerグループが存在しない場合(コマンドを実行しても何も表示されない場合)は、以下のコマンドを実行してdockerグループを作成してください。
$ sudo groupadd docker
ユーザーをdockerグループに追加する
gpasswdコマンドを使ってdockerコマンドを使用したいユーザーをdockerグループに追加します。現在のユーザーを追加したい場合は以下のように実行します。
$ sudo gpasswd -a $USER docker
[sudo] password for xxx:
Adding user xxx to group docker
現在のユーザー以外を追加したい場合は、$USERの部分を対象のユーザーに置き換えてください。
dockerデーモンを再起動する(dockerグループを作成した場合のみ)
dockerグループを作成した場合は、dockerデーモンの再起動が必要な場合があります。
systemctlを使用している場合は、以下のコマンドを実行します。
$ sudo systemctl restart docker
[sudo] password for xxx:
ローカル環境で再起動しても問題ないのであれば、再起動していただいても構いません。
ログアウトして再度ログインする
前の手順で再起動している方はそのままログインしてください。それ以外の場合は一度ログアウトしてから、再度ログインしてください。
以上で、sudoなしでdockerコマンド(docker-composeコマンドも)が実行できるようになります。
なぜPermission deniedになるのか
そもそも、なぜdockerコマンドをsudoなしで実行するとPermission deniedになるかというと、dockerデーモンがUnixソケットを使用しており、dockerデーモンがrootユーザーで実行しているためです。
$ ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0 Mar 19 09:51 docker.sock
実際に/var/run/docker.sockを見てみると、rootユーザーが所有者になっていることがわかります。
このことから、dockerデーモンと通信するdockerコマンドの実行には、docker.sockを読み取ることのできるrootユーザーまたはrootユーザー相当の権限が必要なため、sudoを使用します。
一方で、グループはdockerになっており、同様に読み取り権限があるため、ユーザーをdockerグループに追加することで、sudoを使用したときと同様にdockerコマンドが使用できるようになるという仕組みです。
