家では基本的に開発作業は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に繋げるようにする。
このあたりはwsl環境でdockerを使っている人なら利用したことがあると思う。
次にWindowsボタンを押した後にfirewallと文字列を打つと Windows Defender ファイアウォール
というアプリがサジェストされるのでそれを開く。
次に詳細設定を開く。
左側の送信の規則というボタンをクリックした後、右側の操作から新しい規則をクリック。
以下の要領で入力欄を埋めていく。
- 種類の規則
- ポート
- TCPとUDPのどちら?
- すべてのリモートポート 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はどのみち必要になる。
Windowsのk8sをmacOSから使う
docker serverのときと同じようにまずportを開放する必要がある。 当然だがwindows側でk8sを起動しておく必要がある。
まず上記のスクショの手順に従って、6444のtcpポートを開放する。 次に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
をしてWindowsのk8s情報を追加する。
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 # ここまで追加
GCPやAWSのようにただcredential情報を手動で追加するだけである。 先述の通りxxx.xxx.x.xにはwindowsマシンのIPアドレスを入れる。
この後は kubectl config use-context docker-for-windows
をした後に kubectl get po --all-namespaces
とかでpodの情報が取れればWindowsのk8sにアクセスできている。
やややることが多いが以上の手順でWindowsマシンのdocker(k8s)にmacOSからアクセスすることができる。
firewallを直接開けるだけではうまくいかないところにややハマったが、多分これはdocker側ではなくwindows側の影響によるもののように感じた。
macはしょぼいけどwindowsはゲーミングマシンでバリバリ!という人は上記の手順でwindowsのリソースを使えると割と快適かもしれない。 ここまで書いておいてあれだが自分はmacを新調したのであんまりこの手法を使っていない。 使っていた頃はvolume周りがうまく動作しない問題と遭遇した覚えがある、githubにもissueが立っていた気がするのでvolume周りでハマったらそのあたりで調べてみると良いかも。