无法在docker-machine(Virtual Box)上从docker镜像运行Go(lang)应用程序

时间:2017-09-27 06:50:11

标签: docker go docker-machine

我有一个非常简单的应用程序。这是代码:

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

你能帮我吗?

1 个答案:

答案 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