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
コマンドが使用できるようになるという仕組みです。