博客合辑 诗词鉴赏

如何使用docker部署一个beego项目

 
0 评论0 浏览

理解Docker

Docker帮助你为应用程序创建一个单独的可部署单元。这个单元,也被称为容器,包含该应用程序需要的所有东西。它包括代码(或者二进制文件)、runtime(运行环境)、系统工具盒系统库。将所有必需的资源打包成一个单元将确保无论应用程序部署到哪里都有完全相同的环境。这也有助于维护一个完全相同的开发和生产配置,这在以前是很难追踪的。

一旦开始,容器的创建和部署将自动完成。它消除了一大类问题。这些问题主要是由于文件没有同步或者开发和生产环境之间的差异导致的。Docker帮助解决了这些问题。

相比于虚拟机的优势

容器提供了与虚拟机相似的资源分配和隔离优势。然而,相同之处仅此而已。

一个虚拟机需要它自己的客户操作系统而容器共享主机操作系统的内核。这意味着容器更加轻量而且需要更少的资源。从本质上讲,一个虚拟机是操作系统中的一个操作系统。而另一方面的容器则更像是操作系统中的其它应用程序。基本上,容器需要的资源(内存、磁盘空间等等)比虚拟机少很多,并且具有比虚拟机快很多的启动时间。

Docker在开发阶段的优势

在开发中使用Docker的优势包括:

  • 一个用于所有团队成员的标准开发环境
  • 更新的依赖性集中化以及在任何地方都能使用相同的容器
  • 在开发和生产中完全相同的环境
  • 修复了可能只会出现在生产环境中的潜在问题

<a href="https://hacpai.com/article/1525961874479">准备阶段可参考黑客派中这篇文章</a>

开始准备:
  • 安装好go环境和docker环境的centos7.0 服务器一台
  • /root目录(或者其他目录)下有go工作目录(我的以/root/go/src/为例)
  • 在本机上安装好bee工具(便于调试)
  • src目录下面bee new test_docker
配置Docker用于开发:
  • 创建Dockerfile
在root目录下mkdir docker_test 在此目录下创建Dockerfile
vi Dockerfile (一般将Dockerfile放入所对应需要部署的文件夹中以便于将对应的文件加入到docker中)
FROM golang:1.9.1

# Install beego and the bee dev tool*
RUN go get github.com/astaxie/beego && go get github.com/beego/bee

# Expose the application on port 8080
EXPOSE 8080

# Set the entry point of the container to the bee command that runs the
# application and watches for changes
CMD ["bee", "run"]

FROM golang:1.9.1 

Go的官方映像文件作为基础映像。该映像文件预安装了 Go 1.9.1 该映像已经把 $GOPATH的值设置到了 /go。所有安装在 /go/src中的包将能够被go命令访问。

RUN go get github.com/astaxie/beego && go get github.com/beego/bee

安装 beego包和 bee工具。beego包将在应用程序中使用。bee工具用语在开发中再现地重新加载我们的代码。

EXPOSE 8080

在开发主机上利用容器为应用程序开放8080端口

CMD ["bee", "run"]

使用 bee命令启动应用程序的在线重新加载

  • 构建image

进入创建好的docker_test文件夹,运行如下的命令来创建image(注意后面的 .)


docker build -t test-image .

-t 是指tag的意思 构建了一个叫做test-image的镜像

为了查看你的系统上的image列表,运行如下的命令:

docker images

这行该命令将输出与以下类似的内容:

REPOSITORY  TAG     IMAGE ID      CREATED         SIZE
test-image    latest  8d53aa0dd0cb  31 seconds ago  784.7 MB
golang      1.9.1     22a6ecf1f7cc  5 days ago      743.9 MB

注意image的确切名字和编号可能不同,但是,你应该至少看到列表中有 golangtest-imageimage

如果发现在尝试过程中 build了多余的无效的镜像,可以尝试使用

docker rmi [IMAGE ID](上图中的IMAGE ID)

使用rmi移除对应的ID的镜像
  • 运行容器

一旦 test-image已经完成,你可以使用以下的命令启动一个容器:


 docker run -it --name test-instance -p 8080:8080  -v /root/go/src/docker_test:/go/src/docker_test -w /go/src/docker_test test-image

让我们分析一下上面的命令来看看它做了什么。

  • docker run命令用于从一个image上启动一个容器
  • -it 标签以交互的方式启动容器
  • --rm 标签在容器关闭后将会将其清除
  • --name test-instance 将容器命名为test-instance
  • -p 8080:8080 标签允许通过8080端口访问该容器
  • -v /root/go/src/docker_test:/go/src/docker_test更复杂一些。它将主机的/root/go/src/docker_test映射到容器中的/go/src/docker_test。这将使得开发文件在容器的内部和外部都可以访问。test-image 部分声明了用于容器的image

运行完后你会发现,你的beego项目运行起来了此时是处于调试 ctrl+c就直接停了,重新再执行上述的命令的时候会发现说容器已经存在

解决方法:

docker ps -a 查看容器运行状态
1、docker rm [容器id] 直接删除容器 然后再执行上述命令运行
2、
 1>命令中加 -d参数 后台运行  [我没有试成功]
 2>或者跑起来后ctrl+p+q
 3>或者在命令最后 空格+& 挂起
等等

最后我们访问 ip+端口应该是可以访问到我们运行起来的web应用

此时我们就用 docker部署了一个开发模式下的web应用

<a href="http://dockone.io/article/1269">以上参考《docker构建一个go web应用》</a>

由于在<a href="https://semaphoreci.com/">Semaphore</a>一直没有注册成功用户名一直被占用QAQ,后面的自动化部署就没做了。

于是乎我马上将自己以前写的一个web应用用docker开始部署。

首先我将Dockerfile 放在了beego项目与main.go平级下 由于项目中用了vendor 于是Dockerfile修改如下


 FROM golang:1.9.1

# Install beego and the bee dev tool*
RUN go get github.com/astaxie/beego && go get github.com/beego/bee
RUN go get -u github.com/kardianos/govendor

ADD vendor /TlfShaw

RUN govendor get -v github.com/jinzhu/inflection
RUN govendor get -v github.com/go-sql-driver/mysql
RUN govendor get -v github.com/iqysf/gorm
RUN govendor get -v gopkg.in/chanxuehong/wechat.v2
# Expose the application on port 8080*
EXPOSE 8087

# Set the entry point of the container to the bee command that runs the*
# application and watches for changes*
CMD ["bee", "run"]

ADD vendor /TlfShaw 这是将主机中vendor文件夹添加到beego项目中

关于数据库 docker中连接主机数据库直接用ip远程连接的方式了
docker还有许多学习的地方