如何利用Docker来部署一个go web应用程序

Docker 是一个开源的商业容器产品,方便软件的统一生产环境和开发环境的安装部署,它有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,个人开发者一般用不到。本文使用CE版

1.mac docker的安装

(1)下载mac docker客户端
https://hub.docker.com/editions/community/docker-ce-desktop-mac

下载安装后,通过如下命令测试是否安装成功
 

➜  ~ docker --version
Docker version 18.09.2, build 6247962
➜  ~ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

docker run hello-world会先从本地找hello-world的image文件,如果找不到就会到docker hub上pull下来

其他操作系统如Ubuntu的安装,请参考
https://docs.docker.com/install/linux/docker-ce/ubuntu/

2.image的查看和删除

image 文件可以看作是容器的模板。Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。

 

(1)列出本机的所有image文件

docker image ls

(2)删除image文件

docker image rm [名称或id]

如果出现错误,无法删除,可以加上 -f 强制删除image

docker rmi -f b99

image 文件是通用的,image 文件制作完成后,可以上传到网上的仓库。Docker 的官方仓库 Docker Hub 是最重要、最常用的 image 仓库

3.拉取远程image文件

docker image pull [image名称]

4.编写dockerfile文件

(1)新建main.go文件

package main

import (
	"fmt"
	"log"
	"net/http"

	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	// Set a lower memory limit for multipart forms (default is 32 MiB)
	// router.MaxMultipartMemory = 8 << 20  // 8 MiB
	r.POST("/upload", func(c *gin.Context) {
		// single file
		file, _ := c.FormFile("file")
		log.Println(file.Filename)

		// Upload the file to specific dst.
		c.SaveUploadedFile(file, "/go/src/app")
		c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))
	})
	r.Run(":8080") // listen and serve on 0.0.0.0:8080
}

 

(2)新建Dockerfile文件

在笔者的工作目录/Users/hufox/go/src/github.com/puma007/gindocker 下新建Dockerfile文件

FROM golang:1.11
ENV PATH=$PATH:$GOPATH/bin:$GOROOT/bin
RUN mkdir -p $GOPATH/src/golang.org/x/
WORKDIR $GOPATH/src/golang.org/x
RUN git clone https://github.com/golang/net.git
RUN git clone https://github.com/golang/sys.git
RUN git clone https://github.com/golang/tools.git
RUN git clone https://github.com/golang/text.git
RUN git clone https://github.com/golang/crypto.git
RUN go install ./...
RUN go get -u github.com/gin-gonic/gin
RUN echo $HOME
RUN echo $GOPATH
RUN mkdir /go/src/app
COPY . /go/src/app
WORKDIR /go/src/app
EXPOSE 8080
#RUN go run main.go 这个命令会挂起,导致无法生成image文件,应该用cmd
CMD go run main.go

(3)生成image文件

docker image build -t gindocker:1.0 .

上面代码中,-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点。

5.运行容器文件

docker run 命令会从 image 文件,生成一个正在运行的容器实例

例如docker run hello-world
 

docker container run --rm -p 8080:8080 -it -v /upload:/go/src/app  -w /go/src/app 6c86

如果你的映射文件出错在macos系统下执行该命令会出错

docker: Error response from daemon: Mounts denied:
The path /upload
is not shared from OS X and is not known to Docker.

在网上查到如下解释

Docker for Mac volume mounts behave differently than the base Docker system. This is mostly because Docker tries to comply with Apple's filesystem sandbox guidelines.

mac系统只有/Users,/Volumes,/private,/tmp四个目录以及子目录可以挂载,打开docker for mac desktop-》perference-》file sharing 只有列出的目录及其子目录可以挂载,将命令修改为

docker container run --rm -p 8080:8080 -it -v /Users/hufox/go/src/github.com/puma007/gindocker:/go/src/app  -w /go/src/app 6c86

docker run命令用于从一个image上启动一个容器
-it 标签以交互的方式启动容器;
--rm 标签在容器终止运行后自动删除容器文件;
--name gogin-instance 将容器命名为 gogin-instance;
-p 8080:8080 标签允许通过外部8080端口访问该容器的8080;
-v /Users/hufox/go/src/github.com/puma007/gindocker:/go/src/app 它将主机的/Users/hufox/go/src/github.com/puma007/gindocker映射到容器中的/go/src/app 。这将使得开发文件在容器的内部和外部都可以访问,并且在容器关闭后文件要会在主机保留,否则容器关闭后文件会丢失;
6c86 代表imageid,声明了用于容器的image;
-w 指定容器的工作目录为/go/src/app

如果要在容器启动进入shell命令行,加上 /bin/bash 例如

docker container run -p 8000:3000 -it image名称:tag /bin/bash

6.测试访问

在宿主机上我们可以通过

http://localhost:8080/ping

访问get请求

在命令下通过:

curl -F "file=@/Users/hufox/data/test.png" localhost:8080/upload

发送post请求

参考资料:

[1]https://docs.docker.com/docker-for-mac/
[2]https://docs.docker.com/install/linux/docker-ce/ubuntu/
[3]http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
[4]https://semaphoreci.com/community/tutorials/how-to-deploy-a-go-web-application-with-docker?spm=a2c4e.11153940.blogcont225570.22.73731da27kbD5S

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值