如何在 Docker 中设置 Go 并部署应用

简介:

嗨,在本教程中,我们将学习如何使用 docker 部署 golang web 应用程序。 你可能已经知道,由于 golang 的高性能和可靠性,docker 是完全是用 golang 写的。在我们详细介绍之前,请确保你已经安装了 docker 以及 golang 并对它们有基本了解。

关于 docker

Docker 是一个开源程序,它可以将应用及其完整的依赖包捆绑到一起,并打包为容器,与宿主机共享相同的 Linux 内核。另一方面,像 VMware 这样的基于 hypervisor 的虚拟化操作系统容器提供了高级别的隔离和安全性,这是由于客户机和主机之间的通信是通过 hypervisor 来实现的,它们不共享内核空间。但是硬件仿真也导致了性能的开销,所以容器虚拟化诞生了,以提供一个轻量级的虚拟环境,它将一组进程和资源与主机以及其它容器分组及隔离,因此,容器内部的进程无法看到容器外部的进程或资源。

用 Go 语言创建一个 “Hello World” web 应用

首先我们为 Go 应用创建一个目录,它会在浏览器中显示 “Hello World”。创建一个 web-app 目录并使它成为当前目录。进入 web-app 应用目录并编辑一个名为 main.go 的文件。

 
  1. root@demohost:~# mkdir web-app
  2. root@demohost:~# cd web-app/
  3. root@demohost:~/web-app# vim.tiny main.go
  4. package main
  5. import (
  6. "fmt"
  7. "net/http"
  8. )
  9. func handler(w http.ResponseWriter, r *http.Request) {
  10. fmt.Fprintf(w, "Hello %s", r.URL.Path[1:])
  11. }
  12. func main() {
  13. http.HandleFunc("/World", handler)
  14. http.ListenAndServe(":8080", nil)
  15. }

使用下面的命令运行上面的 “Hello World” Go 程序。在浏览器中输入http://127.0.0.1:8080/World 测试,你会在浏览器中看到 “Hello World”。

 
  1. root@demohost:~/web-app# PORT=8080 go run main.go

下一步是将上面的应用在 docker 中容器化。因此我们会创建一个 dockerfile 文件,它会告诉 docker 如何容器化我们的 web 应用。

 
  1. root@demohost:~/web-app# vim.tiny Dockerfile
  2. # 得到最新的 golang docker 镜像
  3. FROM golang:latest
  4. # 在容器内部创建一个目录来存储我们的 web 应用,接着使它成为工作目录。
  5. RUN mkdir -p /go/src/web-app
  6. WORKDIR /go/src/web-app
  7. # 复制 web-app 目录到容器中
  8. COPY . /go/src/web-app
  9. # 下载并安装第三方依赖到容器中
  10. RUN go-wrapper download
  11. RUN go-wrapper install
  12. # 设置 PORT 环境变量
  13. ENV PORT 8080
  14. # 给主机暴露 8080 端口,这样外部网络可以访问你的应用
  15. EXPOSE 8080
  16. # 告诉 Docker 启动容器运行的命令
  17. CMD ["go-wrapper", "run"]

构建/运行容器

使用下面的命令构建你的 Go web-app,你会在成功构建后获得确认。

 
  1. root@demohost:~/web-app# docker build --rm -t web-app .
  2. Sending build context to Docker daemon 3.584 kB
  3. Step 1 : FROM golang:latest
  4. latest: Pulling from library/golang
  5. 386a066cd84a: Already exists
  6. 75ea84187083: Pull complete
  7. 88b459c9f665: Pull complete
  8. a31e17eb9485: Pull complete
  9. 1b272d7ab8a4: Pull complete
  10. eca636a985c1: Pull complete
  11. 08158782d330: Pull complete
  12. Digest: sha256:02718aef869a8b00d4a36883c82782b47fc01e774d0ac1afd434934d8ccfee8c
  13. Status: Downloaded newer image for golang:latest
  14. ---> 9752d71739d2
  15. Step 2 : RUN mkdir -p /go/src/web-app
  16. ---> Running in 9aef92fff9e8
  17. ---> 49936ff4f50c
  18. Removing intermediate container 9aef92fff9e8
  19. Step 3 : WORKDIR /go/src/web-app
  20. ---> Running in 58440a93534c
  21. ---> 0703574296dd
  22. Removing intermediate container 58440a93534c
  23. Step 4 : COPY . /go/src/web-app
  24. ---> 82be55bc8e9f
  25. Removing intermediate container cae309ac7757
  26. Step 5 : RUN go-wrapper download
  27. ---> Running in 6168e4e96ab1
  28. + exec go get -v -d
  29. ---> 59664b190fee
  30. Removing intermediate container 6168e4e96ab1
  31. Step 6 : RUN go-wrapper install
  32. ---> Running in e56f093b6f03
  33. + exec go install -v
  34. web-app
  35. ---> 584cd410fdcd
  36. Removing intermediate container e56f093b6f03
  37. Step 7 : ENV PORT 8080
  38. ---> Running in 298e2a415819
  39. ---> c87fd2b43977
  40. Removing intermediate container 298e2a415819
  41. Step 8 : EXPOSE 8080
  42. ---> Running in 4f639a3790a7
  43. ---> 291167229d6f
  44. Removing intermediate container 4f639a3790a7
  45. Step 9 : CMD go-wrapper run
  46. ---> Running in 6cb6bc28e406
  47. ---> b32ca91bdfe0
  48. Removing intermediate container 6cb6bc28e406
  49. Successfully built b32ca91bdfe0

现在可以运行我们的 web-app 了,可以执行下面的命令。

 
  1. root@demohost:~/web-app# docker run -p 8080:8080 --name="test" -d web-app
  2. 7644606b9af28a3ef1befd926f216f3058f500ffad44522c1d4756c576cfa85b

进入 http://localhost:8080/World 浏览你的 web 应用。你已经成功容器化了一个可重复的/确定性的 Go web 应用。使用下面的命令来启动、停止并检查容器的状态。

 
  1. ### 列出所有容器
  2. root@demohost:~/ docker ps -a
  3. ### 使用 id 启动容器
  4. root@demohost:~/ docker start CONTAINER_ID_OF_WEB_APP
  5. ### 使用 id 停止容器
  6. root@demohost:~/ docker stop CONTAINER_ID_OF_WEB_APP

重新构建镜像

假设你正在开发 web 应用程序并在更改代码。现在要在更新代码后查看结果,你需要重新生成 docker 镜像、停止旧镜像并运行新镜像,并且每次更改代码时都要这样做。为了使这个过程自动化,我们将使用 docker 卷在主机和容器之间共享一个目录。这意味着你不必为在容器内进行更改而重新构建镜像。容器如何检测你是否对 web 程序的源码进行了更改?答案是有一个名为 “Gin” 的好工具https://github.com/codegangsta/gin,它能检测是否对源码进行了任何更改,然后重建镜像/二进制文件并在容器内运行更新过代码的进程。

要使这个过程自动化,我们将编辑 Dockerfile 并安装 Gin 将其作为入口命令来执行。我们将开放 3030端口(Gin 代理),而不是 8080。 Gin 代理将转发流量到 web 程序的 8080 端口。

 
  1. root@demohost:~/web-app# vim.tiny Dockerfile
  2. # 得到最新的 golang docker 镜像
  3. FROM golang:latest
  4. # 在容器内部创建一个目录来存储我们的 web 应用,接着使它称为工作目录。
  5. RUN mkdir -p /go/src/web-app
  6. WORKDIR /go/src/web-app
  7. # 复制 web 程序到容器中
  8. COPY . /go/src/web-app
  9. # 下载并安装第三方依赖到容器中
  10. RUN go get github.com/codegangsta/gin
  11. RUN go-wrapper download
  12. RUN go-wrapper install
  13. # 设置 PORT 环境变量
  14. ENV PORT 8080
  15. # 给主机暴露 8080 端口,这样外部网络可以访问你的应用
  16. EXPOSE 3030
  17. # 启动容器时运行 Gin
  18. CMD gin run
  19. # 告诉 Docker 启动容器运行的命令
  20. CMD ["go-wrapper", "run"]

现在构建镜像并启动容器:

 
  1. root@demohost:~/web-app# docker build --rm -t web-app .

我们会在当前 web 程序的根目录下运行 docker,并通过暴露的 3030 端口链接 CWD (当前工作目录)到容器中的应用目录下。

 
  1. root@demohost:~/web-app# docker run -p 3030:3030 -v `pwd`:/go/src/web-app --name="test" -d web-app

打开 http://localhost:3030/World, 你就能看到你的 web 程序了。现在如果你改变了任何代码,会在浏览器刷新后反映在你的浏览器中。

总结

就是这样,我们的 Go web 应用已经运行在 Ubuntu 16.04 Docker 容器中运行了!你可以通过使用 Go 框架来快速开发 API、网络应用和后端服务,从而扩展当前的网络应用。

原文发布时间为:2017-01-12

本文来自云栖社区合作伙伴“Linux中国”

相关文章
|
1天前
|
Ubuntu Linux 测试技术
Linux(32)Rockchip RK3568 Ubuntu22.04上部署 Docker: 详细配置与功能测试(下)
Linux(32)Rockchip RK3568 Ubuntu22.04上部署 Docker: 详细配置与功能测试
10 1
|
4天前
|
存储 测试技术 文件存储
【Docker项目实战】使用Docker部署Sun-Panel导航面板
【4月更文挑战第19天】使用Docker部署Sun-Panel导航面板
54 7
|
4天前
|
监控 数据挖掘 Docker
《Docker 简易速速上手小册》第8章 Docker 在企业中的应用(2024 最新版)
《Docker 简易速速上手小册》第8章 Docker 在企业中的应用(2024 最新版)
21 0
|
4天前
|
Kubernetes Cloud Native Go
《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)(下)
《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)
38 0
|
4天前
|
Cloud Native 算法 Go
《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)(上)
《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)
29 0
|
6天前
|
测试技术 Linux 网络安全
【好玩的开源项目】使用Docker部署SyncTV视频同步和共享平台
【4月更文挑战第16天】使用Docker部署SyncTV视频同步和共享平台
43 1
|
9天前
|
Docker 容器
如何在Docker中设置环境变量?
如何在Docker中设置环境变量?
13 0
|
11天前
|
测试技术 Linux 数据安全/隐私保护
【Docker项目实战】使用Docker部署Seatsurfing预订座位系统
【4月更文挑战第12天】使用Docker部署Seatsurfing预订座位系统
35 3
|
14天前
|
JavaScript 前端开发 Docker
全栈开发实战:结合Python、Vue和Docker进行部署
【4月更文挑战第10天】本文介绍了如何使用Python、Vue.js和Docker进行全栈开发和部署。Python搭配Flask创建后端API,Vue.js构建前端界面,Docker负责应用的容器化部署。通过编写Dockerfile,将Python应用构建成Docker镜像并运行,前端部分使用Vue CLI创建项目并与后端交互。最后,通过Nginx和另一个Dockerfile部署前端应用。这种组合提升了开发效率,保证了应用的可维护性和扩展性,适合不同规模的企业使用。
|
14天前
|
Linux Shell 虚拟化
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
25 0

热门文章

最新文章