我有一个非常简单的应用程序。这是代码:
package main
import (
"fmt"
"math/rand"
"time"
"net/http"
"encoding/base64"
"encoding/json"
)
type Message struct {
Text string `json:"text"`
}
var cookieQuotes = []string{
// Skipped all the stuff
}
const COOKIE_NAME = "your_cookie"
func main() {
http.HandleFunc("/set_cookie", setCookie)
http.HandleFunc("/get_cookie", getCookie)
http.Handle("/favicon.ico", http.NotFoundHandler())
http.ListenAndServe(":8080", nil)
}
func setCookie(w http.ResponseWriter, r *http.Request) {
quote := getRandomCookieQuote()
encQuote := base64.StdEncoding.EncodeToString([]byte(quote))
http.SetCookie(w, &http.Cookie{
Name: COOKIE_NAME,
Value: encQuote,
})
}
func getCookie(w http.ResponseWriter, r *http.Request) {
cookie, err := r.Cookie(COOKIE_NAME)
if err != nil {
fmt.Fprintln(w, "Cannot get the cookie")
}
message, _ := base64.StdEncoding.DecodeString(cookie.Value)
msg := Message{Text:string(message)}
fmt.Println(msg.Text)
respBody, err := json.Marshal(msg)
fmt.Println(string(respBody))
if err != nil {
fmt.Println("Cannot marshall JSON")
}
w.Header().Set("Content-Type", "application/json")
fmt.Fprintln(w, string(respBody))
}
func getRandomCookieQuote() string {
source := rand.NewSource(time.Now().UnixNano())
random := rand.New(source)
i := random.Intn(len(cookieQuotes))
return cookieQuotes[i]
}
它在本地进行了测试,并且我也试图在我的机器(Ubuntu)上运行一个docker容器,它运行得很好。但我想在虚拟机上运行它(我使用的是Oracle Virtual Box)。
所以,我安装了docker-machine:
docker-machine version 0.12.2,build 9371605
之后,我已切换到它,就像official documentation中推荐的那样:
eval" $(docker-machine env default)"
所以我现在可以从那台机器的角度来做。
此外,我还尝试从文档示例中运行 ngnix :
docker run -d -p 8000:80 nginx
curl $(docker-machine ip default):8000
我得到了结果,我可以通过访问我的docker machine ip-address来访问 ngnix欢迎页面,这可以通过命令访问:
docker-machine ip default
但是当我尝试运行自己的docker镜像时,我无法做到这一点。当我尝试访问它时,我得到:
curl $(docker-machine ip default):8080
卷曲:(7)无法连接到192.168.99.100端口8080:拒绝连接
此外,我还试图跳过一个端口,为了运气添加协议(http,甚至https) - 没有任何作用。
也许,我的Dockerfile出了问题?
# Go experiments with cookies
FROM golang:1.8-onbuild
MAINTAINER vasyania2@gmail.com
你能帮我吗?
答案 0 :(得分:1)
此命令将端口8080从docker主机映射到容器的端口80:
docker run -d -p 8080:80 cookie-app
该指令告诉你的go应用程序监听容器内的端口8080:
http.ListenAndServe(":8080",nil)
上述行中的端口不匹配,您的应用程序没有侦听您要转发的端口。
要连接到容器的端口8080,您可以运行以下命令:
docker run -d -p 8080:8080 cookie-app