問題
- 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で表示される。




