Dockerfile
#部署golang环境
FROM golang:1.9
#下载gin包
RUN go get github.com/gin-gonic/gin
#开放端口
EXPOSE 7070
在Dockerfile目录打开一个终端,运行
sudo docker build -t my-gin .
之后待到镜像构建完毕之后通过
sudo docker images
可以查看到tag为latest的my-gin镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
my-gin latest 689590bc3953 28 minutes ago 756MB
这是因为我们用docker build命令的时候没有指定my-gin的tag,所以默认是latest,你也可以这样使用:
sudo docker build -t my-gin:test .
这样会得构建一个tag为test的my-gin镜像
启动容器
现在已经拥有一个tag为my-gin的镜像,我们需要利用这个镜像启动一个容器
docker run -it --rm --name gin-instance -p 7070:7070 -v /home/youngblood/Go/src/ginDocker:/go/src/ginDocker -w /go/src/ginDocker my-gin
说明
- docker run 用于从一个image上启动一个容器
- -it 标签以交互的方式启动容器
- --rm 标签在容器关闭后会会删除该容器,查看容器命令:sudo docker ps -a
- -p 7070:7070标签允许荣过主机的7070端口访问docker容器中的7070端口
- -v /home/youngblood/Go/src/ginDocker:/go/src/ginDocker表示将docker容器中的/go/src/ginDocker目录挂在到物理机的/home/youngblood/Go/src/ginDocker目录中,/home/youngblood/Go是我物理机的GOPATH,你也可以选择不用这个目录
- -w /go/src/ginDocker表示打开容器中的工作目录
- my-gin则是表示该容器使用的镜像文件
启动成功之后便会进入容器的/go/src/ginDocker目录,如下
root@774e60551b73:/go/src/ginDocker#
现在我们在物理机上编写ginDocker的一些功能,新建一个main.go,写入如下代码
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
router.GET("/hello/:name", func(c *gin.Context) {
name := c.Param("name")
c.String(http.StatusOK, "hello %s", name)
})
router.Run(":7070")
}
在容器中执行如下命令
root@774e60551b73:/go/src/ginDocker# go build ginDocker
root@774e60551b73:/go/src/ginDocker# ./ginDocker
出现如下结果
root@774e60551b73:/go/src/ginDocker# go build ginDocker
root@774e60551b73:/go/src/ginDocker# ./ginDocker
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /hello/:name --> main.main.func1 (3 handlers)
[GIN-debug] Listening and serving HTTP on :7070
现在在物理机上的浏览器访问localhost:7070/hello/初级赛亚人
这样我们就完成了一个go web项目的部署