我有一个非常简单的应用程序。这是代码:
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 机器 ip 地址来访问 ngnix 欢迎页面:
docker-machine ip default
但是当我尝试运行我自己的 docker 镜像时,我无法做到这一点。当我尝试访问它时,我得到:
curl $(docker-machine ip default):8080
curl: (7) Failed to connect to 192.168.99.100 port 8080: Connection refused
我也试过跳过一个端口,添加协议(protocol)(http,为了运气甚至是 https)——没有任何效果。
也许,我的 Dockerfile 有问题?
# Go experiments with cookies
FROM golang:1.8-onbuild
MAINTAINER vasyania2@gmail.com
你能帮帮我吗?
最佳答案
此命令将端口 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
关于docker - 无法从docker-machine(Virtual Box)上的docker图像运行Go(lang)应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46441235/