无法 运行 从 docker 图像在 docker 机器(Virtual Box)上运行(lang)应用程序

Can't run Go (lang) app from docker image on docker-machine (Virtual Box)

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

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]
}

它在本地进行了测试,而且我还尝试在我的机器上 运行 一个 docker 容器 (Ubuntu),它运行良好。但我想 运行 它在虚拟机上(我使用 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

我也试过跳过一个端口,添加协议(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