リモートのGPUサーバにDockerデーモンを立てて,そこに手元のPCから(docker desktopを起動して)VSCodeのRemote Development / Dev Containersで接続して,コンテナ内でコードを書いて実行しています.
正常な場合
通常は以下のようなログが表示されて,リモートサーバのコンテナにvscodeが接続されます.
[2023-03-30T07:08:06.858Z] Dev Containers 0.282.0 in VS Code 1.76.2 (ee2b180d582a7f601fa6ecfdad8d9fd269ab1884).
[2023-03-30T07:08:06.858Z] Start: Resolving Remote
[2023-03-30T07:08:06.858Z] Setting up container for folder or workspace: /foo/bar/dir
[2023-03-30T07:08:06.858Z] Host: ssh://my.ssh.ip.address
[2023-03-30T07:08:06.858Z] Local Docker: true
[2023-03-30T07:08:06.860Z] Start: Check Docker is running
[2023-03-30T07:08:06.860Z] Start: Run: docker version --format {{.Server.APIVersion}}
...
ダメな場合
ところが,なぜか繋がらなくなってしまう現象が,謎のタイミングで発生します.
「繋がらなくなってしまう」というのは,vscodeが「ローカルの」PCのdockerのコンテナを起動してしまうのです.
その時のvscodeのログがこちら.
[2023-03-30T07:08:06.858Z] Dev Containers 0.282.0 in VS Code 1.76.2 (ee2b180d582a7f601fa6ecfdad8d9fd269ab1884).
[2023-03-30T07:08:06.858Z] Start: Resolving Remote
[2023-03-30T07:08:06.858Z] Setting up container for folder or workspace: /foo/bar/dir
[2023-03-30T07:08:06.858Z] Context: desktop-linux
[2023-03-30T07:08:06.858Z] Start: Check Docker is running
[2023-03-30T07:08:06.858Z] Start: Run: docker version --format {{.Server.APIVersion}}
...
Host: ssh://my.ssh.ip.address
という一行が出てこないので,sshが動いていない様子.
たまになったりならなかったり,誰かがなったり自分がなったり.一旦なったら直らない現象で,vscodeを再起動・再インストールしてもダメ,docker desktopを再起動・再インストールしてもだめ.直るときもあったりなかったり.OSもwinだったりmacだったりと,原因がつかめません.
直し方
で,あるとき上のログをよくよくながめてみたら,
[2023-03-30T07:08:06.858Z] Context: desktop-linux
という行があるので,contextというのを調べてみたら,これが原因でした.
$ docker context ls
NAME TYPE DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
default moby Current DOCKER_HOST based configuration unix:///var/run/docker.sock swarm
desktop-linux * moby unix:///Users/tamaki/.docker/run/docker.sock
正常に接続できている場合には,以下のように表示されます.
$ docker context ls
NAME TYPE DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
default * moby Current DOCKER_HOST based configuration unix:///var/run/docker.sock swarm
desktop-linux moby unix:///Users/tamaki/.docker/run/docker.sock
変更するには以下のようにします.
$ docker context use default
default
Current context is now "default"
これでvscodeで無事リモートサーバのコンテナに接続できるようになりました.
原因
直し方は分かったので問題は解決したのですが,なぜcontextがdefaultでなくなってしまうのかは謎のまま.
docker desktopをアップデートするとcontextが変わってしまう,という問題があったらしいのですが,それが原因だったかどうかは不明.