LoginSignup
4
8

More than 1 year has passed since last update.

coredns + caddy + dockerで開発環境的なhttps

Last updated at Posted at 2021-05-17

問題

  1. httpsがないと動かない機能とかある
  2. let's encryptですら面倒で自前でやりたくない
  3. 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

した後に

docker-compose.yml(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を生成)

docker-compose.yml(local-https使う版)
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にドロップする。そのままだと信頼されていないので、

Screen_Shot_2021-05-17_at_10_06_59.png

右クリックでGet InfoからAlways Trustしてやる。

Screen Shot 2021-05-17 at 10.05.40.png

そうするとリモートアクセスしても鍵がグリーンで表示できる。

Screen Shot 2021-05-17 at 9.55.56.png

Firefoxの場合

Screen Shot 2021-05-17 at 10.42.10.png

設定でcertificateを検索して表示して、Authoritiesタブからroot.crtをインポートする。

Screen Shot 2021-05-17 at 10.42.10.png

というか、httpだけでいい

httpsなんか要らないよ、という場合は以下のように設定する。

docker-compose.yml
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で表示される。

4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8