dongpan2788
2017-09-27 06:50
浏览 103

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

I have a very simple application. Here is the code:

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

It was tested locally, and, also I've tried to run a docker container with it on my machine (Ubuntu) and it was working perfectly. But I want to run it on Virtual Machine (I use Oracle Virtual Box).

So, I have installed docker-machine:

docker-machine version 0.12.2, build 9371605

After that, I've switched to it, like it was recommended in official documentation like this:

eval "$(docker-machine env default)"

So I can do now from a perspective of that machine.

Also I've tried to run ngnix from the documentation example:

docker run -d -p 8000:80 nginx

curl $(docker-machine ip default):8000

And I get the result, I can get to ngnix welcome page by accessing my docker machine ip-address which could be accessed by command:

docker-machine ip default

But when I try to run my own docker image, I could not do this. When I try to access it, I get:

curl $(docker-machine ip default):8080

curl: (7) Failed to connect to 192.168.99.100 port 8080: Connection refused

Also I've tried to skip a port, to add protocol (http, and even https for the sake of luck) - nothing works.

Maybe, something wrong with my Dockerfile?

# Go experiments with cookies
FROM golang:1.8-onbuild
MAINTAINER vasyania2@gmail.com

Could you help me please?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • dqk42179 2017-09-27 09:22
    已采纳

    This command maps port 8080 from your docker host to port 80 of your container:

    docker run -d -p 8080:80 cookie-app

    This instruction tells your go application to listen on port 8080, inside the container:

    http.ListenAndServe(":8080", nil)

    You have a port mismatch in those above lines, your application is not listening on the port you are forwarding to.

    To connect to port 8080 of your container, you can run the following:

    docker run -d -p 8080:8080 cookie-app
    
    点赞 打赏 评论

相关推荐 更多相似问题