WSL2 Docker - eiichiromomma/CVMLAB GitHub Wiki
(WSL2) Dockerでの注意点
doker runのときの--rmオプション
このオプションはコンテナ終了時にコンテナが削除されることを意味する。これを付けないと,docker runのたびに同じイメージを使ったコンテナが生成され続けることになる。
都度消せば良いのだが,
- いったんrunして作られたコンテナに
docker run時のオプションは指定し直すことが出来ない(あとからボリュームをマウントとかできない) -pでのポート開放時に他のコンテナで同じポートが許容されない- 管理が杜撰になると最新のコンテナがどれかわからなくなる
といったデメリットがあるので,開発環境のセットアップ方針が固まるまでは--rmを付けては終了を繰替えしておいた方が良い。
--rmを付けずにrunしたコンテナを再び使うには
docker start -i コンテナ名
で再開できる。
docker runのときの--nameオプション
dockerはコンテナをrunする度にテキトーに名前を付ける。--rmを外して起動するときに--nameで名前を指定すると,そちらが優先される。
docker run -it --name myubuntu ubuntu /bin/bash
で
exit
してから
docker container ls -a
とするとNAMEにmyubuntuが並ぶ。
docker start -i myubuntu
で再開できるようになる。
作ったコンテナを消すには
docker container rm myubuntu
とすればよい。
Windowsでデータを用意したい: -vでのマウント
コンテナ内のファイルはWindows上,WSL上からは普通にはアクセスできない(ネット経由の転送は可能)が,
docker run時に-v $(HOME):/mnt/wslhomeとか指定すると,WSLでのホームディレクトリがコンテナ内の/mnt/wslhomeにマウントされる(アクセスできる)- WSLのファイルはWindowsのエクスプローラーからLinux→home→ユーザー名で参照可能
の組合せでWindowsからもファイルを参照できる。ただし,コンテナ上でユーザーではなくroot(管理者)で動くタイプだと,コンテナ上で何かファイルをマウント先に保存したとき,全て管理者権限で作成されてしまってやや面倒な状態になるので,以下のようにコンテナ上では通常ユーザーとして動くようにする
id -u
として出てくるのが自分のUID(システム上の管理番号)で,
id -g
として出てくるのが自分のGID(システム上の参加グループ番号)で,これらを使う。
echo $UID
として数字が出てこなかったら以下を実行する。
export UID=$(id -u)
続けて
echo $GID
で数字が出てこなかったら以下を実行する。
export GID=$(id -g)
で,WSLの/etc/passwd,/etc/group,etc/shadowをコンテナと読み取り専用で共有する設定を加え,作業場も/home/$USERとなるように指定する。
具体的には
docker run -it --rm --user $UID:$GID --workdir=/home/$USER \
-v $HOME:/mnt/wslhome -v /etc/passwd:/etc/passwd:ro \
-v /etc/group:/etc/group:ro -v /etc/shadow:/etc/shadow:ro \
ubuntu /bin/bash
でユーザー権限で動かせるコンテナになる。オススメはしないが,下記のように$HOMEのマウント先を変えればコンテナ上のホームディレクトリをWSL上のホームディレクトリとすることもできる
docker run -it --rm --user $UID:$GID --workdir=/home/$USER \
-v $HOME:/home/$USER -v /etc/passwd:/etc/passwd:ro \
-v /etc/group:/etc/group:ro -v /etc/shadow:/etc/shadow:ro \
ubuntu /bin/bash
このままだとsudoも入っていない状態なので,別のWSLを開いて管理者権限でこのコンテナに入る。
docker container ls
として表示されるNAMESの欄のコンテナの名前を使う(ここではstupefied_curie)
docker container exec -u 0 -it stupefied_curie /bin/bash
とすると管理者権限でコンテナに入れるので
apt update;apt install -y sudo
でsudoコマンドを入れる。
そして,自分を/etc/sudoersに追加する。ここではdockeruserとするが,自分のユーザー名に置き換えて以下のコマンドを実行する
echo '%dockeruser ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
でこっちの方はexitして良い。
あとはユーザー権限の方のコンテナで管理者権限のコマンドを実行するときはWSL同様にsudo を頭に付けて実行する。