別ホストの Linux の Docker を使う方法

私は仮想マシン上の Windows 10 の WSL から Ubuntu Linux 18.04 のホスト上で動いている Docker を使うように設定しましたのでこのあとの記事の書き方はその環境が前提の書き方になっていますが、Windows仮想マシンである必要はなく、同じネットワーク内の別ホストであれば Windows である必要すらなく、Mac や他の Linux などからも使うことができると思います。

また、WSL の場合は WSL 自体に直接 Docker を入れることもできるようなのですが、ネット上で見つけたいくつかの方法は私が試したところいずれもうまく行きませんでした。Windows をそもそも仮想環境で動作させているためかもしれません。というわけで WSL に Docker を入れるのは諦めました。

Docker for Windows を入れてみても良かったのですが、これもやはりもともと仮想環境な Windows 上に更に仮想環境を作ることになりそうだったのでうまく動くかどうかわからなかったことと、せっかくホスト OS が Linux なのでそこでコンテナを動かせばよいではないかと思い、その方法を調べたところ非常に簡単だったのですが、将来の自分のためにメモしておこうという感じです。

大まかな手順は以下のとおりです。

  1. ホスト OS (Ubuntu Linux) 側で Docker の起動時オプションを変更して、TCP でもリモート API サーバーをホストする
  2. ゲスト OS (Windows 10 WSL) 側で DOCKER_HOST 環境変数を使ってホスト OS の Docker を使うようにする

これだけです。(実際には WSL に docker コマンドをインストールしたりしたかもしれません。)

注意していただきたいのは、この方法だとホストの Docker がネットワークに公開されることになりますので、セキュリティ面では十分に気をつける必要があります。 (信頼できるプライベートなネットワークにしか接続されないようにするとか、もしくはネットワークアクセス制御などを適切に適用して意図しないアクセスを受け付けないようにするなどの対策を講じる必要があります)

1. ホスト OS (Ubuntu Linux) 側で Docker の起動時オプションを変更して、TCP でも API サーバーをホストするようにする

まずはホスト OS 側で以下のコマンドを実行して現在の設定を取得します。Ubuntu 18.04 では以下のファイルでしたが、他のバージョンでは違う場所にファイルがあるかもしれません。

sudo grep ExecStart /lib/systemd/system/docker.service

私の環境では以下のように表示されました。

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

この表示された内容をコピーしておきます。

次に、以下のコマンドを実行します。これは systemd の既存の unit ファイルに対して適用するための差分のファイルを生成するコマンドです。

sudo systemctl edit docker

エディタが起動しますので、先程コピーした内容を貼り付け、さらにその行に -H tcp://0.0.0.0:2375 を追加します。(Docker の API サーバーを TCP で指定のアドレス/ポートでホストするというオプションです。既存の別の -H オプションが存在しますが、その後ろあたりに追加すると良いでしょう) また、その行の前に以下のように2行追加します。

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock

真ん中の行の ExecStart= だけの行は決して間違いではありません。 このように書くことで、既存の ExecStart の設定を上書きすることができます。

保存して閉じたら、以下のコマンドを実行して Docker を再起動し、設定の変更を適用します。

sudo systemctl restart docker

ここまででホスト側の準備は完了です。

2. ゲスト OS (Windows 10 WSL) 側で DOCKER_HOST 環境変数を使ってホスト OS の Docker を使うようにする

ゲスト OS (Windows 10 WSL) で以下のコマンドを実行してみます。

DOCKER_HOST=tcp://192.168.1.234:2375 docker ps -a

192.168.1.234 の部分はホスト OS の IP アドレスに置き換えてください。

これでエラーにならずにホスト上で実行されているはずのコンテナの一覧が表示されたら成功です! (事前にホスト上で docker run hello-world などを実行しておくとわかりやすいかもしれません)

毎回 DOCKER_HOST を指定するのが面倒なので .bashrc あたりに以下のような設定を書いておくと良いでしょう。

export DOCKER_HOST=tcp://192.168.1.234:2375

なおポート番号の 2375 は Docker デーモンの暗号化されていない API サーバーで慣習的に使われているポート番号のようですが、他の値に変えても大丈夫です。

Docker

Docker