2017-09-27 5 views
0

J'ai une application très simple. Voici le code:Impossible d'exécuter l'application Go (lang) à partir de l'image du docker sur le docker-machine (boîte virtuelle)

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

Il a été testé localement, et j'ai aussi essayé de courir un conteneur docker avec sur ma machine (Ubuntu) et il fonctionnait parfaitement. Mais je veux l'exécuter sur Virtual Machine (j'utilise Oracle Virtual Box).

Alors, je l'ai installé docker-machine:

Version docker machine 0.12.2, construire 9371605

Après cela, je l'ai commuté, comme il a été recommandé dans official documentation comme ceci:

eval "$ (par défaut env docker machine)"

Donc, je peux le faire maintenant du point de vue de cette machine.

Aussi j'ai essayé de courir ngnix de l'exemple de la documentation:

docker run -d -p 8000: 80 nginx

boucle $ (par défaut ip docker machine): 8000

Et j'obtenir le résultat, je peux arriver à ngnix page d'accueil en accédant à ma machine docker ip adresse qui est accessible par la commande:

ip docker machine par défaut

Mais lorsque je tente de lancer ma propre image docker, je ne pouvais pas le faire. Lorsque je tente d'y accéder, je reçois:

boucle $ (par défaut ip docker machine): 8080

boucle: (7) Impossible de se connecter à 192.168.99.100 port 8080: Connexion refusée

J'ai aussi essayé d'ignorer un port, d'ajouter un protocole (http, et même https pour la chance) - rien ne fonctionne.

Peut-être que quelque chose ne va pas dans mon Dockerfile?

# Go experiments with cookies 
FROM golang:1.8-onbuild 
MAINTAINER [email protected] 

Pourriez-vous m'aider s'il vous plaît?

+1

À quoi ressemble 'Dockerfile' comme? Est-ce que ces deux lignes sont tout ce qu'il y a dedans? – Carpetsmoker

+0

Oui, monsieur! C'est tout et ça a parfaitement fonctionné dans mon environnement local – SanchelliosProg

+0

à quoi ressemble votre commande 'docker run'? Avez-vous mappé le port correctement? – tanyehzheng

Répondre

1

Ce port cartes de commande 8080 de votre hôte docker au port 80 de votre conteneur:

docker run -d -p 8080: 80 cookie app

Cette instruction indique à votre application go à écouter sur le port 8080, à l'intérieur du conteneur:

http.ListenAndServe (": 8080", nil)

Vous avez une incompatibilité de port dans les lignes ci-dessus, votre application n'écoute pas sur le port vers lequel vous transférez.

Pour vous connecter au port 8080 de votre conteneur, vous pouvez exécuter les éléments suivants:

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