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

自从上次博客从 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 的利用率相应的降低了。

转自:久未惹尘埃

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