839の日記

業務とは関係ない趣味の話を書くブログです。

Windowsのdocker for desktop(k8s)をmacから使う

家では基本的に開発作業はmac、その他全般をWindowsで行っている。 スペックはWindowsのほうが高いので、Windowsのdocker serverやk8sを使えないかなーというところから。

結論を言うとfirewallとproxyの設定をすれば両方共利用可能。

なお、この記事の手法にはwsl環境を前提としている。 wslの設定方法は適当にググったら出てくると思う。 ただ、nginxさえ使えれば特にwsl環境でなくても同じことはできるはず。

WindowsのDocker ServerをmacOSから使う

まずdockerのSettingsで Expose daemon on tcp://localhost:2375 without TLS にチェックを入れてtcp 2375 portでdocker daemonに繋げるようにする。 f:id:husq:20190522221013p:plain このあたりはwsl環境でdockerを使っている人なら利用したことがあると思う。

次にWindowsボタンを押した後にfirewallと文字列を打つと Windows Defender ファイアウォール というアプリがサジェストされるのでそれを開く。 f:id:husq:20190522221450p:plain 次に詳細設定を開く。 f:id:husq:20190522221555p:plain 左側の送信の規則というボタンをクリックした後、右側の操作から新しい規則をクリック。 以下の要領で入力欄を埋めていく。

  • 種類の規則
    • ポート
  • TCPUDPのどちら?
  • すべてのリモートポート or 特定のリモートポート
    • 特定のリモートポートで2374を入力
  • 操作の実行内容
    • 接続を許可する
  • 規則の適用
    • 環境によるけど自分は全部にチェックを入れた
  • 名前と説明
    • docker proxyとか適当なものを入力、説明は自分で読んでわかるものを設定

ここまで終わったらwslを起動して sudo apt-get update && sudo apt-get install -y nginx をする。 既にnginxを入れている人ならスキップ。

sudo vim /etc/nginx/nginx.conf でnginx.confを開いて、末尾に以下を追加する。

stream {
  error_log /var/log/nginx/docker.log info;

  server {
    listen 2374;
    proxy_pass localhost:2375;
  }
}

上記を記載した後に sudo service nginx restart を行えば設定は完了。 wsl環境でdocker for desktopのdockerを使う際には DOCKER_HOST=tcp://0.0.0.0:2375 のような環境変数を設定していると思うが、macOS側で似たようなことをするために必要な設定である。

macOSで以下のようなコマンドを打つと確認できるはず。

DOCKER_HOST=tcp://xxx.xxx.x.x:2374 docker images

xxx.xxx.x.xの部分にはwindowsで使っているプライベートIPを指定する。 正しく設定されていればwindows側に存在するdocker image一覧が取得できるはず。 何かの作業を常にWindowsのdockerを使いたい場合、direnvとかを使って export DOCKER_HOST=tcp://xxx.xxx.x.x とかを設定しておくと楽になると思う。

わざわざnginxを噛まさなくても良いのでは?と思った人もいるかもしれないが、直接2375のportを開放してもmacOS側からアクセスできなかったのでnginx proxyはどのみち必要になる。

Windowsk8smacOSから使う

docker serverのときと同じようにまずportを開放する必要がある。 当然だがwindows側でk8sを起動しておく必要がある。

まず上記のスクショの手順に従って、6444tcpポートを開放する。 次にnginx.confに6444のproxyを追記して全体としては以下のようになる。

stream {
  error_log /var/log/nginx/docker.log info;

  server {
    listen 2374;
    proxy_pass localhost:2375;
  }
  server {
    listen 6444;
    proxy_pass localhost:6445;
  }
}

kubeconfigの設定がmacOS側に必要なので C:\Users\ユーザ名\.kube に移動してconfigというファイル名の中身をコピーする。 大体以下のような感じだと思う。

apiVersion: v1
clusters:
- cluster:
    insecure-skip-tls-verify: true
    server: https://localhost:6445
  name: docker-for-desktop-cluster
contexts:
- context:
    cluster: docker-for-desktop-cluster
    user: docker-for-desktop
  name: docker-for-desktop
current-context: docker-for-desktop
kind: Config
preferences: {}
users:
- name: docker-for-desktop
  user:
    client-certificate-data: snip
    client-key-data: snip

次にmacOS側で vim ~/.kube/config をしてWindowsk8s情報を追加する。

apiVersion: v1
clusters:
- cluster:
    insecure-skip-tls-verify: true
    server: https://localhost:6443
  name: docker-for-desktop-cluster
# 以下のclusterを追加
- cluster:
    insecure-skip-tls-verify: true
    server: https://xxx.xxx.x.x:6444
# ここまで追加
  name: docker-for-windows-cluster
contexts:
- context:
    cluster: docker-for-desktop-cluster
    user: docker-for-desktop
  name: docker-for-desktop
# 以下のcontextを追加
- context:
    cluster: docker-for-windows-cluster
    user: docker-for-windows
  name: docker-for-windows
# ここまで追加
current-context: docker-for-desktop
kind: Config
preferences: {}
users:
- name: docker-for-desktop
  user:
    client-certificate-data: snip
    client-key-data: snip
# 以下のuserを追加
- name: docker-for-windows
  user:
    client-certificate-data: snip
    client-key-data: snip
# ここまで追加

GCPAWSのようにただcredential情報を手動で追加するだけである。 先述の通りxxx.xxx.x.xにはwindowsマシンのIPアドレスを入れる。

この後は kubectl config use-context docker-for-windows をした後に kubectl get po --all-namespaces とかでpodの情報が取れればWindowsk8sにアクセスできている。 やややることが多いが以上の手順でWindowsマシンのdocker(k8s)にmacOSからアクセスすることができる。 firewallを直接開けるだけではうまくいかないところにややハマったが、多分これはdocker側ではなくwindows側の影響によるもののように感じた。

macはしょぼいけどwindowsはゲーミングマシンでバリバリ!という人は上記の手順でwindowsのリソースを使えると割と快適かもしれない。 ここまで書いておいてあれだが自分はmacを新調したのであんまりこの手法を使っていない。 使っていた頃はvolume周りがうまく動作しない問題と遭遇した覚えがある、githubにもissueが立っていた気がするのでvolume周りでハマったらそのあたりで調べてみると良いかも。