リモートサーバーの中のDockerにローカルから接続する

提供: Eospedia
2019年9月6日 (金) 13:05時点におけるKttn (トーク | 投稿記録)による版

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索

クライオ電顕備忘録に属する記事です。2019年9月6日。

この記事について

リモートサーバーの中で動いているDockerをローカルから使うときの話。

これまでは DockerでRELIONの様に、リモートの中でコンテナを起動し、そのコンテナの中でsshdを立ち上げておいて、ローカルからローカルポートフォワーディングを利用してコンテナ内へsshログインしていた。

色々調べてみると、それ以外にもリモートのDockerコンテナへアクセスする方法、というか、リモートのDockerデーモンに直接アクセスする方法があると知った。備忘録としてここに書いてく。


リモートのDockerのソケットに対しポートフォワードで直アクセス

表現がこれであっているかわからないが...

どうやらDockerは、まずDockerのデーモンプロセスを走らせておき、DockerのクライアントがUnixソケット(/var/run/docker.sock)を介してデーモンとやり取りする感じで動いている、らしい。

で、普通はDockerクライアントはローカルの/var/run/docker.sockを使うのでローカルのDockerデーモンとしかやり取りできないが、ポートフォワードを使ってリモートの/var/run/docker.sockと通信するように仕向けることで、リモートのDockerデーモンに対しローカルのDockerクライアントから直でアクセスできるように成る、みたいな、そんな感じ。

元記事 → https://code.visualstudio.com/docs/remote/containers-advanced#_option-2-connect-using-an-ssh-tunnel

ステップとしてはたったの2段階で良い。作業は全部ローカルで行う。

1. ローカルマシンの23750番ポートをリモートマシンの/var/run/docker.sockにポートフォワードで転送する。

# kttnは私のユーザー名、DL-Boxはリモートサーバー名。
> ssh -fNL localhost:23750:/var/run/docker.sock kttn@DL-Box

これでローカルの23750番ポートがリモートマシンの/var/run/docker.sockに化ける、みたいな感じ...

2. 環境変数DOCKER_HOSTの値をlocalhost:23750にする。

ローカルでDockerデーモンを動かしていない場合、環境変数設定前の挙動は以下のようになる。

> docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

で、環境変数を設定する。

> export DOCKER_HOST=localhost:23750

するとローカルのDockerクライアントはローカルの/var/run/docker.sockではなく、ローカルの23750番ポートを介してリモートの/var/run/docker.sockとやり取りをするようになる。即ち、リモートのDockerデーモンと直でやり取りをしてくれる。ので、

> docker ps
CONTAINER ID        IMAGE                                       COMMAND               CREATED             STATUS              PORTS                     NAMES
82c53187da91        kttn8769/cryoem/relion:3.0.7-cuda9.2-gctf   "/usr/sbin/sshd -D"   About an hour ago   Up About an hour    127.0.0.1:29290->22/tcp   kttn-relion

わーお。こいつはすげぇ。


この仕組を使うと、VSCodeのDocker拡張機能を使って、ローカルのVSCodeを使ってリモートのDockerコンテナ内環境で開発作業をする、みたいなことができる。Remote-SSHでコンテナに接続してもいいのだが、それよりこちらのほうがDockerちゃんと使っている感があってなんか良い。