実現したいこと
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 string 13 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 return 19 } 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 error 33 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" (ローカルに置かれている場所)
なども試してみたのですが、上手く動かすことができませんでした。
ネットで色々探してみたのですが、これというものを見つけられておらず、頭を抱えています。
お助け頂けましたら、幸甚と存じます。
回答1件
あなたの回答
tips
プレビュー