封尘网

让学习成为一种习惯!

Docker方式跑Golang程序web服务

自从上次博客从PHP切换到GO语言后,博客上线已经一段时间了,最大的变化就是部署简单,高效,省去了以前配置PHP的部署问题。另外一个就是系统的资源也有明显降低了。

首先,本博客使用的云主机是1核1G内存,之前就是一个Nginx+Mysql+一个Golang程序就把内存耗剩20M左右。自己还添加了一个虚拟交换内存Swap 1G的空间,避免内存用完,卡一点都比服务宕掉好。

虽说博客没什么流量,但是一有请求,就会发现网络,CPU,内存,磁盘等IO操作。如果CPU暴满,或者内存暴满都会导致程序处理或者响应慢。正是因为这样,有时候使用Xshell登陆ECS服务器也会卡着。所以最后选择使用Docker方式来跑Golang程序。

系统环境: CentOS Linux release 7.3.1611 (Core) Docker-ce: 19.03.1

使用以下的镜像:

[root@VM_0_5_centos ~]# docker images
REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
ccr.ccs.tencentyun.com/swper/58jb   v1                  2fc4f9bb90c8        13 days ago         35.8MB
blog                                latest              fd226a862210        13 days ago         5.58MB
alpine                              latest              961769676411        2 weeks ago         5.58MB
mariadb                             latest              99c1098d5884        3 weeks ago         355MB

基础镜像使用了alpine因为它够小了,5M多点。这里没有把Nginx也跑在Docker上,而是把占内存比较大的Mariadb和博客程序跑在Docker中。

因为目前云主机是在腾讯云的,所以把镜像也PUSH到腾讯的Docker仓库了。

Dockerfile文件的内容: 这里添加了一个时区,方便让容器里的时间跟时区一致.同时也把执行程序blog58复制的方式添加到镜像中。

FROM alpine
MAINTAINER swper <hz328@qq.com>
ADD static/Shanghai /etc/localtime
COPY . /blog58
EXPOSE 8000
WORKDIR /blog58
CMD ["sh","-c","/blog58/app"]

打包镜像

查看当前的目录结构:

[root@VM_0_5_centos test]# tree -L 2
.
|-- blog58
|   |-- app
|   |-- docs
|   |-- static
|   `-- templates
|-- Dockerfile
`-- Shanghai

打包并传入到腾讯镜像仓库

docker build . -t ccr.ccs.tencentyun.com/swper/58jb:v1
docker push

注意

  • 这里并没有把Go里的静态资源加入,我是通过挂载的方式加入的。原因一个里面有系统,数据库帐号的配置。放在外网的Docker仓库不太放心,所以就没有直接打包到镜像,同时也为了让镜像更小。
  • 没打包静态资源就多了一步,需要把静态的文件,配置文件,模版文件,样式,jS等上传到服务器
  • WORKDIR目录,所以挂载时要注意
  • 关于腾讯云的镜像,是需要一个认证的,通过帐号申请即可。

 

启动容器

1、先把数据库启动起来

docker run -d --name mariadb -p 3306:3306 -v /data/mysql/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=数据库密码 --privileged=true --restart unless-stopped mariadb:latest

启动后需要操作一步把之前的数据库重新导入容器之中。数据库不存在,需要先创建,这里不详细说了。

启动容器时就要把静态资源挂载:

docker run -d --name app --restart=always -p 8000:8000 -v /data/blog58/conf:/blog58/conf --link mariadb:mariadb blog
  • 这里把没有打包进镜像的配置文件以挂载的方式挂载到容器的相应目录。/blog58/conf这个目录就是跟程序配置中的一致,不然无法读取到配置文件,这样挂载是有方便的地方,可以通过它修改,如果直接打包到配置文件中就要重新打包镜像了。
  • --link通过它来连接mariadb容器,不然两个容器之间不能连接就不能获取到数据库内容了

最后检查服务是否成功启动,可以查看宿主机的端口,或者直接请求访问服务。

[root@VM_0_5_centos ]# ss -lnt
State      Recv-Q Send-Q                        Local Address:Port                                       Peer Address:Port              
LISTEN     0      128                                       *:80                                                    *:*                  
LISTEN     0      128                                       *:443                                                   *:*                  
LISTEN     0      128                                      :::8000                                                 :::*                  
LISTEN     0      128                                      :::3306                                                 :::* 

最后查看一下使用容器后的系统资源使用情况.

[root@VM_0_5_centos]# free -m
              total        used        free      shared  buff/cache   available
Mem:            985         200         216           0         568         666
Swap:          1023         310         713

明显看到的效果,内存是有比较大的资源空闲,而CPU的利用率相应的降低了。