dockerでgoを導入する簡単なアプリケーション

14343 ワード

1.まずgo言語を用いて基本httpサービスを実現する
echo標準ライブラリを使用して8080ポート出力helloworldのサービスを実現します.echo mygohttpをインストールします.go:
import (
    "github.com/labstack/echo"
    "log"
    "net/http"
)

func main() {
    e := echo.New()
    e.GET("/", handlerindex)
    log.Println("starting echo")
    err := e.Start(":8080")
    if err != nil {
        log.Fatal("echo", err)
    }
}

func handlerindex(c echo.Context) error {
    log.Println("hello world handlerindex")
    return c.JSON(http.StatusOK, `{"hello":"world"}`)
}

最後にコンパイルは問題なく実行できます.
wang@wang:~/Desktop/mygohttp$ go build mygohttp.go 
wang@wang:~/Desktop/mygohttp$ ls
Dockerfile  mygohttp  mygohttp.go  package
wang@wang:~/Desktop/mygohttp$ ./mygohttp 

2.dockerfile作成
dockerfileで作成したソースミラーはhub.docker.comはgolangが公式に提供しているソースミラーを見つけ、golang:latestを採用しています.
#  
FROM golang:latest
#  
MAINTAINER Vong "[email protected]"
#      
WORKDIR $GOPATH/src/github.com/mygohttp
#     go       docker   
ADD . $GOPATH/src/github.com/mygohttp
#go get        copy  ,                 echo       
COPY package/package_golang_org $GOPATH/src
#  echo
RUN go get -u github.com/labstack/echo
#go       
RUN go build .
#    
EXPOSE 6064
#    docker   
ENTRYPOINT  ["./mygohttp"]

次のdockerfileを使用すると、2つのdockerfileが使用できることがわかります.
#  
FROM golang:latest
#  
MAINTAINER Vong "[email protected]"
#WORKDIR $GOPATH/src/mygohttp
#workdir      
#     go       docker   
COPY mygohttp.go $GOPATH/src/mygohttp/
#       mygohttp   /, WORKDIR   :
#Step 6/9 : WORKDIR $GOPATH/src/mygohttp
#Cannot mkdir: /go/src/mygohttp is not a directory
#      
COPY package/package_golang_org $GOPATH/src
#     echo
RUN go get -u github.com/labstack/echo
#go       
WORKDIR $GOPATH/src/mygohttp
RUN go build .
#    
EXPOSE 6064
#    docker   
ENTRYPOINT  ["./mygohttp"]
wang@wang:~/Desktop/mygohttp$ tree -L 5
.
├── Dockerfile
├── mygohttp
├── mygohttp.go
└── package
    └── package_golang_org
        └── golang.org
            └── x
                ├── crypto
                ├── net
                ├── sys
                └── text

8 directories, 3 files

注意dockerfileファイル名はDockerfileで、そのファイルはエンジニアリングディレクトリの下にある必要があります.
3.dockerfileを実行し、dockerミラーを生成する
wang@wang:~/Desktop/mygohttp$ docker build -t hellomygohttp .
Sending build context to Docker daemon  93.11MB
Step 1/9 : FROM golang:latest
 ---> dc7582e06f8e
Step 2/9 : MAINTAINER Vong "[email protected]"
 ---> Using cache
 ---> eac484e76a9b
Step 3/9 : WORKDIR $GOPATH/src/github.com/mygohttp
 ---> Using cache
 ---> 3d13786d3164
Step 4/9 : ADD . $GOPATH/src/github.com/mygohttp
 ---> d5278249d1fc
Step 5/9 : COPY package/package_golang_org $GOPATH/src
 ---> 0fcd383c661b
Step 6/9 : RUN go get -u github.com/labstack/echo
 ---> Running in 5f628ca631b5
Removing intermediate container 5f628ca631b5
 ---> 52662b89355a
Step 7/9 : RUN go build .
 ---> Running in 8b5bf90f4d2c
Removing intermediate container 8b5bf90f4d2c
 ---> 6ee33dd9a5b1
Step 8/9 : EXPOSE 6064
 ---> Running in 59855e66a139
Removing intermediate container 59855e66a139
 ---> 9de288b63b60
Step 9/9 : ENTRYPOINT  ["./mygohttp"]
 ---> Running in e9e544202997
Removing intermediate container e9e544202997
 ---> 81d7fc0aaf8f
Successfully built 81d7fc0aaf8f
Successfully tagged hellomygohttp:latest

作成が完了すると、作成したミラーをdocker imagesで表示できます.
wang@wang:~/go/src/github.com$ docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
hellomygohttp                  latest              81d7fc0aaf8f        2 minutes ago       1.01GB

4.docker mygohttpを実行
wang@wang:~/1.0/scripts$ docker run --name mygohttp -p 9090:8080 -d hellomygohttp
9ff0d40f234dab6d0baf1274f11c0639f3cb099d3837c0d70ea8c9076c6706c3

これでdockerコンテナが起動します.私たちはhttp://localhost:9090/このサービスにアクセスします.出力:用docker部署go简单应用_第1张图片これでサービスが開通しました.これは、コンテナ内のログを次のコマンドで表示することもできます.
wang@wang:~/Desktop/mygohttp/package$ docker logs -f mygohttp 

   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.1.11
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
⇨ http server started on [::]:8080
2019/10/28 08:57:39 starting echo
2019/10/28 09:13:19 hello world handlerindex


5.mygohttpサービスとミラーの停止と削除
#    
docker stop mygohttp
#  container  
docker rm mygohttp
#  container  
docker rmi mygohttp

6.goエンジニアリング起動時に変数パラメータを持ち込む方法
私たちはgoプロジェクトを実行するとき、動的変数を持ち込んで実行する必要があります.では、どうすればいいですか.私たちがシステム変数を採用する方法go言語に対応するライブラリはsyscallです.Getenvの修正コードは次のとおりです.
package main

import (
    "github.com/labstack/echo"
    "log"
    "net/http"
    "syscall"
)

func main() {
    v, ok := syscall.Getenv("TASKID")
    log.Println("Getenv", v, ok)
    e := echo.New()
    e.GET("/", handlerindex)
    log.Println("starting echo")
    err := e.Start(":8080")
    if err != nil {
        log.Fatal("echo", err)
    }
}

func handlerindex(c echo.Context) error {
    log.Println("hello world handlerindex")
    return c.JSON(http.StatusOK, `{"hello":"world"}`)
}

dockerfileは修正する必要がなく、dockerfileを再作成します.docker build -t hellomygohttp .
7.システムパラメータ付きgoエンジニアリング容器の運転
dockerランタイムバンド-eは、システム構成パラメータを追加できます.
wang@wang:~/Desktop/mygohttp$ docker run --name mygohttp2 -e TASKID=abc hellomygohttp

   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.1.11
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
2019/10/28 09:26:23 Getenv abc true
2019/10/28 09:26:23 starting echo
⇨ http server started on [::]:8080



そのうち:2019/10/28 09:26:23 Getenv abc true 2019/10/28 09:26:23 starting echoがログ出力