docker学习笔记(2)-如何部署go到docker
1.编写go程序
这里的demo,我写的是一个Restful Api,没有进行封装,只写了一个go文件
package main
import (
"github.com/gorilla/mux"
"net/http"
"fmt"
"log"
"time"
"os"
)
func main() {
t1 := time.Now()
file, err := os.Create("test.log")
if err != nil {
log.Fatalln("fail to create test.log file")
}
logger := log.New(file, "", log.Llongfile)
logger.SetFlags(log.LstdFlags)
router := mux.NewRouter().StrictSlash(true)
router.HandleFunc("/", Index)
router.HandleFunc("/version", Version)
router.HandleFunc("/date", Date)
t2 := time.Since(t1)
fmt.Println("Startup time by : ", t2)
logger.Println("Startup time by : ", t2)
logger.Fatal(http.ListenAndServe(":8080", router))
}
func Date(writer http.ResponseWriter, request *http.Request) {
fmt.Fprintln(writer, time.Now().Local().Format("2006-01-02"))
}
func Version(writer http.ResponseWriter, request *http.Request) {
fmt.Fprintln(writer, "1.0.0")
}
func Index(writer http.ResponseWriter, request *http.Request) {
fmt.Fprintln(writer, "Hello!")
}
下载相关包到本地,这里只有 github.com/gorilla/mux 需要下载
- 需要设置好GOPATH环境变量并已安装好git,否则不生效
go get github.com/gorilla/mux
如果没有go的编译环境,可以下载docker的go镜像来进行编译,这里使用最新版本,可以根据自己的go程序需要下载对应版本
docker pull golang
- 接下来利用golang的镜像编译go代码
docker run --rm -it -v "$GOPATH":/gopath -v "$(pwd)":/app -e "GOPATH=/gopath" -w /app golang:latest sh -c 'CGO_ENABLED=0 go build --ldflags="-s" -o your_app_bin_name'
顺利的话可执行程序已经生成了,不顺利就找找原因吧^_^!
go程序已经就顺利写好,接下来就是生成镜像了。
2.生成镜像
这里我采用了Dockerfile生成镜像,其他生成方式不做概述
- 编写Dockerfile
FROM iron/base
WORKDIR /app
COPY rest_api_test /app/
ENTRYPOINT ["./rest_api_test"]
Dockerfile编写完就可以来生成镜像了,命令比较简单
docker build -t restapitest:1.0.0 .
这时通过docker images可以看到镜像已经生成了,在容器中运行一下试试
docker run -it --rm -p 80:8080 -d restapitest:1.0.0
此时访问本机地址的restfulApi接口就可以看到以下结果
curl http://127.0.0.1/version
1.0.0
curl http://127.0.0.1/date
2019-2-12
镜像已顺利制作成功^_^!
3.上传镜像到 hub.docker.com
镜像成功生成,我们可以利用docker ps 看到刚刚运行在容器中的究镜像
想要上传需要在hub.docker.coms上注册账号并建立自己的仓库哦。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2ca8f61a3e0f restapitest:1.0.0 "./rest_api_test" 3 seconds ago Up 2 seconds 0.0.0.0:80->8080/tcp angry_haibt
利用docker commit 生成准备上传的latest版本(需要版本号可指定)
docker commit 2ca8f61a3e0f 用户名/仓库名
此时镜像的latest版本已经生成,可以通过docker images查看生成的镜像名称和版本,准备上传。
上传之前需要登录刚刚注册的账号使用docker login登录即可
开始上传
docker pull 镜像名称:版本
当当当当!成功啦(如果pull超时失败多尝试几次就好啦)。