実現したいこと
TLS対応にしているGo言語のサーバを、Dockerコンテナの中から使えるようにしたい
前提
GO言語を使ってサーバを作っています。これらのサーバをDockerコンテナに格納して、運用しやすくしたいと考えております。
発生している問題・エラーメッセージ
Dockerコンテナに格納すると、https(×http)通信が使えません。
cert.pem、key.pemを使わない場合、http://127.0.0.1:18888で、ブラウザに"hello"メッセージがされますが、cert.pem、key.pemを使ってhttps://127.0.0.1:18888とした場合、「このサイトにアクセスできません」と表示されます。
該当のソースコード
GO言語
1package main 2 3import (4 "flag"5 "fmt"6 "log"7 "net/http"8 "net/http/httputil"9 "os"10)11 12var url_host string13 14func handler(w http.ResponseWriter, r *http.Request) {15 dump, err := httputil.DumpRequest(r, true)16 if err != nil {17 http.Error(w, fmt.Sprint(err), http.StatusInternalServerError)18 return19 }20 fmt.Println(string(dump))21 fmt.Fprintf(w, "<html><body>hello</body></html>\n")22}23 24var addr = flag.String("addr", "127.0.0.1:18888", "http service address") // テスト25 26func main() {27 http.HandleFunc("/", handler)28 fmt.Println("url_host:", url_host)29 30 log.Println("start http listening :18888")31 32 var httpErr error33 if _, err := os.Stat("./cert.pem"); err == nil {34 if httpErr = http.ListenAndServeTLS(*addr, "./cert.pem", "./key.pem", nil); httpErr != nil {35 log.Fatal("No pem file with https error: ", httpErr.Error())36 }37 }38}39
Dockerfile
1#FROM golang:apline 2FROM golang:1.16.3-alpine 3WORKDIR /go 4ADD . /go 5CMD ["go", "run", "main.go"]
docker
1version: '3'2services:3 app:4 build: . 5 ports:6 - "18888:18888" # "ホストのポート:コンテナのポート"
試したこと
上記のmain.go のfunc main()を以下のようにしている場合は,http(×https)で通信できます。
func main() { var httpServer http.Server http.HandleFunc("/", handler) log.Println("start http listening :18888") httpServer.Addr = ":18888" log.Println(httpServer.ListenAndServe()) }
補足情報(FW/ツールのバージョンなど)
■Windows10上のDocker for Windowsを使用しています。
■Dockerコンテナを使わないで、 windowsのコマンドプロンプトから起動する場合は、"https://127.0.0.1:18888"は問題なく起動します。
考察
考えてみれば、DockerコンテナへのアクセスにはTLSに関する情報が設定をしていないので、起動しないのは当然とも思えます。
そこで、
docker-compose start --tlscert="/go/cert.pem" --tlskey="/go/key.pem" (コンテナ内に置かれている場所)
やら、
docker-compose start --tlscert="c:\\user\\username\\go-docker\\cert.pem" --tlskey="c:\\user\\username\\go-docker\\cert.pem" (ローカルに置かれている場所)
なども試してみたのですが、上手く動かすことができませんでした。
ネットで色々探してみたのですが、これというものを見つけられておらず、頭を抱えています。
お助け頂けましたら、幸甚と存じます。

0 コメント