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
とすればよい。
-v
でのマウント
Windowsでデータを用意したい: コンテナ内のファイルは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
を頭に付けて実行する。