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

标签 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 机器 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/

相关文章:

docker - 从docker-compose启动特定服务

go - 在 Go 中按子数组值对 slice 进行分组

c - Go中的递归链表类型别名

VirtualBox:VERR_VM_DRIVER_NOT_INSTALLED

docker - 如何解决Docker中磁盘空间不足的错误?

docker - 将 redis 与 docker-compose 一起使用时连接被拒绝

docker - 如何创建仅在centos上运行的docker centos镜像

java - 连接被拒绝 : accessing a spring boot application running in docker container

go - Go中的动态函数调用

linux - 如何在 docker-machine 中保存对 boot2docker 的更改?