sudoなしでdockerコマンドを実行できるようにする(dockerグループへユーザーを追加)

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

ISOファイルをUSBフラッシュドライブ(USBメモリ)に書き込む(Rufus)

最近では、CD/DVDドライブが搭載されていないPCが多いため、LinuxのインストールなどではUSBフラッシュドライブ(以降はUSBメモリと表記)を使うことが一般的です。

本記事では、WindowsでISOファイルをUSBメモリに書き込むRufusというツールの使い方について解説します。

Rufusのダウンロード

まずは、公式サイトへアクセスします。

下のほうへスクロールしていくと、ダウンロードというセクションが見つかります。ここにある「Rufus x.xx」(執筆時点では「Rufus 3.18」)というリンクをクリックしてダウンロードしてください。

使用方法

ダウンロードしたrufus-x.xx.exeを起動すると、初回は以下のようなダイアログが表示される場合があります。

お好きなほうを選択してください。

ダイアログが閉じると、Rufusが起動します。

デバイスやボリュームラベルの表示内容はご使用のUSBメモリによって異なりますが、特に気にする必要はありません。
私は前回Linux Mint 20.3をインストールしたUSBメモリを使用しているため、このような表示になっています。

使用方法について行うことは多くなく、以下の3点を押さえておけば問題ありません。

  1. USBメモリを挿す
  2. ISOファイルを選択する
  3. 「スタート」ボタンをクリック(そして待つ)

まずは、USBメモリを挿しておいてください。デバイス欄にそのUSBの情報が表示されます。USBメモリを挿していない場合やうまく認識していない場合はデバイス欄は空欄になります。

USBメモリが認識されたら、次にISOファイルを選択します。ブートの種類欄の右の「選択」ボタンをクリックしてファイル選択ダイアログを表示します。

事前にダウンロードしておいたISOファイルを選択して、「開く」ボタンをクリックしてください。

USBメモリに書き込む準備ができました。「スタート」ボタンをクリックしてください。

いくつかダイアログが表示される場合があります。

ISOHybrid イメージの検出

ISO イメージモードで書き込む(推奨)」を選択したままで、「OK」ボタンをクリックしてください。

ダウンロードが必要です

「はい」ボタンをクリックしてください。

警告

すでにUSBメモリにデータがある場合に表示されます。使用しているUSBメモリが間違っていないことが確認できているのであれば「OK」ボタンをクリックしてください。

USBメモリへの書き込みが始まると、プログレスバーが増えていきます。

プログレスバーが100%になると、「スタート」ボタンがクリックできるようになります。

完了を通知するダイアログは示されないため、デバイス欄のUSBメモリの名前が変更されていること、やプログレスバーが100%で「準備完了」になっていることを確認してください。

asdfでよく使うコマンド集(アップデート、プラグイン、バージョン)

asdfの中でもよく使う、アップデート関連、プラグイン関連、バージョン関連のコマンドについて解説します。

アップデート関連

プラグイン自体のアップデートや追加したプラグインのアップデートについて解説します。

asdf自体のアップデート

それほど頻繁に実施する必要はりませんが、asdf自体をアップデートする場合は、以下のコマンドを実行します。

asdf update

すべてのプラグインのアップデート

特段理由がなければすべてのプラグインをアップデートする方が楽です。すでに追加済みのプラグインをすべてアップデートするときは、以下のコマンドを実行します。

asdf plugin-update --all

特定のプラグインのみをアップデート

たくさんのプラグインを追加していて全部アップデートするのは時間がかかる、バージョンをあげたくないプラグインがある、など何かしらの理由があって特定のプラグインのみをアップデートしたいときは、以下のコマンドを実行します。

asdf plugin-update <プラグイン名>

<プラグイン名>には、アップデートしたいプラグインを指定します。

プラグイン関連

プラグインの表示、追加、削除など基本的な操作について解説します。

プラグインの一覧表示

プラグインを一覧表示するときは、以下のコマンドを実行します。

asdf plugin list all

大量に表示されますので、Grepで対象を絞り込む方がよいでしょう。

$ asdf plugin list all | grep node                                                                                                                                                                                
nodejs                       *https://github.com/asdf-vm/asdf-nodejs.git

上記の例では、Node.jsのプラグイン名を調べるためににnodeでGrepし、nodejsであることが分かりました。

現在インストール中のプラグインの一覧表示

すでにインストール済みのプラグインをしたいときは、以下のコマンドを実行します。

asdf plugin list

プラグインの追加

プラグインを追加するときは、以下のコマンドを実行します。

asdf plugin add <プラグイン名>

<プラグイン名>のところは、追加したいプラグインの名前を指定します。

プラグインの削除

プラグインを削除するときは、以下のコマンドを実行します。

asdf plugin remove <プラグイン名>

<プラグイン名>のところは、削除したいプラグインの名前を指定します。

バージョン関連

バージョンに関する操作について解説します。

使用可能なバージョンの一覧表示

特定のプラグインの使用可能なバージョンを一覧表示したいときは、以下のコマンドを実行します。

asdf list all <プラグイン名>

こちらもGrepを併用することでインストールしたいバージョンを特定するのがよいでしょう。

asdf list all nodejs | grep ^11.

上記のでは、nodejsパッケージのうち、11系だけをGrepで絞り込んでいます。

インストール済みのバージョンを一覧表示

すでにインストール済みのバージョンを一覧表示したいときは、以下のコマンドを実行します。

asdf list <プラグイン名>

バージョンをインストールする

指定したバージョンをインストールするときは、以下のコマンドを実行します。

asdf install <プラグイン名> <バージョン>

<プラグイン名>はインストールしたいプラグインの名前、<バージョン>はインストールしたいバージョンを指定します。

バージョンをアンインストールする

指定したバージョンをアンインストールするときは、以下のコマンドを実行します。

asdf uninstall <プラグイン名> <バージョン>

<プラグイン名>はアンインストールしたいプラグインの名前、<バージョン>はアンインストールしたいバージョンを指定します。

バージョンの設定

asdfでは、globallocalshellの3つの設定範囲があります。使用目的によって適切な設定範囲を選択することで、効率よくバージョン管理を行うことができます。

globalバージョンの設定

globalバージョンは、特に指定がない場合に使用されるバージョンです。globalバージョンを設定するときは、以下のコマンドを実行します。

asdf global <プラグイン名> <バージョン>

<プラグイン名>はglobalバージョンを設定したいプラグインの名前、<バージョン>はglobalバージョンに設定したいバージョンを指定します。

globalバージョンは、システム全体で使用するバージョンを設定するとよいでしょう。言い方を変えると、特段理由がない場合に使用するバージョンであるとも言えます。例えば、メインストリームのバージョンやLTSのバージョンを設定しておく運用方法が適切です。

localバージョンの設定

特定のフォルダ(ディレクトリ)内でのみ有効なバージョンです。globalバージョンで使用しているバージョンとは異なるバージョンを使いたい場合に使用するとよいでしょう。

localバージョンを設定するときは、以下のコマンドを実行します。

asdf local <プラグイン名> <バージョン>

現在のフォルダ(ディレクトリ)およびそのサブフォルダ(ディレクトリ)ではlocalバージョンが有効になります。このとき、.tool-versionsが作成され、使用するプラグインとバージョンが記録されます。

localバージョンは、プロジェクトで使用するバージョンを指定するために使用するとよいでしょう。
例えば、普段はPython 3.9.xを使用していますが、今携わっているプロジェクトでは、Python 3.7.xでないとビルドができないとしましょう。
この場合、globalバージョンは3.9.xですが、プロジェクトのフォルダ(ディレクトリ)内ではPython 3.7.xをlocalバージョンに指定しておくことで、このプロジェクト内だけは3.7.xを使用することができます。
もし、複数の保守プロジェクトを抱えている場合であれば、この恩恵はとても大きいものになります。

shellバージョンの設定

シェル内でのみ有効なバージョンです。使用頻度は高くありませんが、使用するコマンドが特定のバージョンを要求する場合などに重宝します。

shellバージョンを設定するときは、以下のコマンドを実行します。

asdf shell <プラグイン名> <バージョン>

これは現在のシェルの設定が変わるわけではなく、新にシェルを起動し、そこでのバージョンが設定したバージョンになります。そのため、使用を終了する場合は、exitコマンドで抜けることができます。

shellバージョンは、特定のコマンドやツールを実行する際に、特定のバージョンまたは特定のバージョン以下でないと実行できない、といった場合に使用するとよいでしょう。
例えば、プロジェクトでは、Node.js 16.xを使用しています。リリース用のツールもNode.jsで書かれていますが、古いツールなためNode.js 11.xでないと動作しません。
こういった場合には、globalバージョンまたはlocalバージョンは16.xを設定し、ツールを実行するときだけ、shellバージョンに11.xを設定してコマンドを実行する運用にする方が、バージョンアップ対応を行うよりもコストメリットがあります。

Gitを使い始めるときに行う設定(git config)

Gitをインストールした後など、使い始めるときに行う2つの設定について解説します。

ユーザー名を設定する

使い始める前に行う設定の1つ目はユーザー名の設定です。

git config --global user.name "Taro Yamada"

user.nameユーザー名を表します。一般的には本名をローマ字で書くのが一般的ですが、ハンドル名やニックネーム等を使用しても構いません。

仕事で使う場合は、組織やプロジェクトでのルールに従ってください。

氏名をユーザー名に設定する場合、姓と名の間に半角スペースを含むため、ユーザー名全体を「”」(ダブルクォーテーション)で囲みます。スペースを含まない場合は「”」(ダブルクォーテーション)で囲む必要はありません。

メールアドレスを設定する

使い始める前に行う設定のもう一つは、メールアドレスの設定です。

git config --global user.email taro.yamada@example.com

user.emailメールアドレスを表します。

使用可能なメールを使用することが強く推奨されるため、個人開発の場合は個人のメールアドレス、仕事での開発の場合は組織で使用されているメールアドレスを使用してください。

メールアドレスにはスペースを含むことがないので「”」(ダブルクォーテーション)は必要ありません。

設定を確認する

現在の設定を確認するには、-lオプションを使います。

前述の設定を行ったあとに、設定を確認すると以下のような結果になります。

$ git config --global -l

user.name=Taro Yamada
user.email=taro.yamada@example.com

ユーザー名とメールアドレスは何に使うの?

設定したユーザー名とメールアドレスはどこに使われるのでしょうか?

設定したユーザー名とメールアドレスは、コミットログのAuthorに使用されます。
前述の設定を行ったうえでファイルをコミットして、ログでコミットログを確認すると以下のようになります。

$ git log       
commit daa1b044d5794411dd25e9f404a4f96a0b4d1006 (HEAD -> main)
Author: Taro Yamada 
Date:   Sat Mar 12 20:45:39 2022 +0900

    add test.txt

Author欄に先ほど設定したユーザー名とメールアドレスが設定されていることが分かります。

プロジェクト固有の設定を行いたい場合は?

すでに説明した設定はグローバル設定(--global)となっています。

例えば、

在宅勤務で自宅のPCをしており、普段は個人で開発していますが、仕事でも使うことになりました。
個人で開発する際のユーザー名とメールアドレスはグローバル設定として登録済みです。仕事では会社のメールアドレスを使う必要があります。

この場合、ローカル設定を使うことで解決できます。

まずは現在のグローバル設定を確認します。

$ git config --global -l

user.name=Taro Yamada
user.email=taro.yamada@example.com

次に仕事で使うプロジェクト(ここでは「user_service」)に移動して、再度設定を確認します。

$ cd user_service
$ git config --global -l

user.name=Taro Yamada
user.email=taro.yamada@example.com

当然ですが、設定は変わりません。
ここではローカル設定(--local)を行います。

まずは設定を行います。

$ git config --local user.name t-yamada
$ git config --local user.email t-yamada@kaisha.com

先ほどとの違いは、--global--localになっただけです。

では、設定を確認してみましょう。設定の確認も同様に--localオプションを使用します。

$ git config --local -l
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
user.name=t-yamada
user.email=t-yamada@kaisha.com

少し余計な設定が出力されていますが、一番下にuser.nameuser.emailが出力されており、設定値は--localオプションを使用して設定したものになっています。

では適当なファイルをコミットして、コミットログを確認してみます。

$ touch test.txt
$ git add test.txt
$ git commit -m 'add test.txt'
[main (root-commit) 11eecab] add test.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test.txt
$ git log 
commit 11eecab9335ca6e43e4efc6c2a43f37fb7be41b3 (HEAD -> main)
Author: t-yamada 
Date:   Sat Mar 12 21:55:04 2022 +0900

    add test.txt

ファイルの追加やコミットのオプションは特に変えていませんが、確かに--localで設定したユーザー名、メールアドレスで記録されています。

このように複数の環境を使い分ける場合はローカル設定を活用してください。

Gitリポジトリの初期化を行う(git init)

Gitでファイル管理を始めるために初期化を行う方法を解説します。

Gitリポジトリの初期化を行う

では、フォルダ/ディレクトリ(以降はフォルダと表記)を作成し、そこに空のリポジトリを作成する手順を見てみましょう。

まずは、フォルダを作成し、その中に移動します。

$ mkdir test
$ cd test
$ ls -a
./  ../

隠しファイルも含めて表示し、空のフォルダであることがわかります。

次にgit initコマンドを実行します。

$ git init
Initialized empty Git repository in /home/taro/test/.git/

空のGitリポジトリを初期化した旨のメッセージが出力されています。では、再度フォルダの中がどうなっているか確認してみます。

$ ls -a
./  ../  .git/

先ほどまではなかった.gitという隠しフォルダが作成されていることがわかります。

これでGitリポジトリの初期化が完了し、gitコマンドが使えるようになります。

オプションはあるが使用することはほとんどない

実はgit initには、オプションがあります。

ですが、オプションを使用することはほとんどないと言っていいので、気にする必要はありません。実用上は、

Gitリポジトリの初期化を行いたいフォルダへ移動して、git initを実行する

とだけ理解しておけば充分です。

モバイルバージョンを終了