問題
- httpsがないと動かない機能とかある
- let's encryptですら面倒で自前でやりたくない
- IPベースでなくサブドメインとかも含めた名前解決でアクセスしたい
解決
docker + coredns
これでhostsファイルベースで管理できるようにする。
docker + caddy
これは素でcaddyのdocker版を使っても色々面倒なのでcaddy-docker-proxyを使う。
これを使うと、まずcaddy-docker-proxyを立てて、全く別のdocker-compose.ymlでcaddy用の設定をすると自動的に認識してくれて勝手にcaddyを設定してくれる。
caddy-docker-proxy
$ docker network create caddy
した後に
version: "3.7"
services:
caddy:
image: lucaslorentz/caddy-docker-proxy:2.3-alpine
ports:
- 80:80
- 443:443
environment:
- CADDY_INGRESS_NETWORKS=caddy
networks:
- caddy
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./caddy/data:/data
restart: unless-stopped
networks:
caddy:
external: true
local https
開発環境なので、正式なドメイン名はない。このためcaddyが自己証明書を生成、設定してくれる。
(このdocker-composeを動かした途端、上のcaddyが反応して勝手にCaddyfileを生成)
version: "3.7"
services:
whoami:
image: jwilder/whoami
networks:
- caddy
labels:
caddy: test.domain.dev # ping出来ることは事前に確認しておく
caddy.reverse_proxy: "{{upstreams 8000 }}"
caddy.tls: "internal"
caddy.tls: "internal"
が重要。
Local HTTPS does not use ACME nor does it perform any DNS validation. It works only on the local machine and is trusted only where the CA's root certificate is installed.
とあって、ローカル
マシン上ではROOT CAが入っているので鍵マークはグリーンだと思う。しかしながら、これはあくまでもローカル
なので、ここの場合はこのコンテナ内ということになり、dockerのホストですらリモートアクセスしているのと変わらない(dockerホストにはROOT CAは入らない)
caddy用のdockerで- ./caddy/data:/data
とvolume設定をしていて大切なデータはここに入ってる。
# apk add tree
# tree /data
...
...
└── pki
└── authorities
└── local
├── intermediate.crt
├── intermediate.key
├── root.crt
└── root.key
こうやってみるとroot.crt
が/data
内にあるのが分かるので、コンテナの中に入って
# cp /data/caddy/pki/authorities/local/root.crt /data/
とでもして、あとはdockerホスト側で
$ sudo chown $(whoami):$(whoami) data/root.crt
とかして自分がアクセスできるようにする。
これをMacであればKeychan Access
を開いてSystem
にドロップする。そのままだと信頼されていないので、
右クリックでGet Info
からAlways Trust
してやる。
そうするとリモートアクセスしても鍵がグリーンで表示できる。
Firefoxの場合
設定でcertificateを検索して表示して、Authorities
タブからroot.crtをインポートする。
というか、httpだけでいい
httpsなんか要らないよ、という場合は以下のように設定する。
version: "3.7"
services:
whoami:
image: jwilder/whoami
networks:
- caddy
labels:
caddy: http://domain.tld
caddy.reverse_proxy: "{{upstreams http 8000 }}"
.tld
は架空のTLD。これが.dev
などHSTSプレロードリストに入っていないものを使わないとだめ。
最初、.dev
を使ってみてどうしてもhttpsに転送されてた。
http://...
とupstreams http
が重要。この設定でhttp://domain.tld
にアクセスするとhttpsにリダイレクトされず、通常のhttpで表示される。