Docker 方式跑 Golang 程序 web 服务

2021-08-05 00:00:00 镜像 腾讯 内存 容器 打包


【导读】今天的文章中作者总结了高效快速部署个人博客的经验,介绍了打包方面优化对性能的提升。

自从上次博客从 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           128                                       *:80                                                    *:*                  
LISTEN           128                                       *:443                                                   *:*                  
LISTEN           128                                      :::8000                                                 :::*                  
LISTEN           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 的利用率相应的降低了。

转自:久未惹尘埃

58jb.com/html/goweb-run-on-docker.html

- EOF -



相关文章