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 を頭に付けて実行する。