0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用Docker方式跑Golang程序web服务教程

开关电源芯片 来源:封尘网 作者:久未惹尘埃 2021-08-27 10:08 次阅读

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

自从上次博客从 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

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10854

    浏览量

    211576
  • 数据库
    +关注

    关注

    7

    文章

    3794

    浏览量

    64360
  • PHP
    PHP
    +关注

    关注

    0

    文章

    452

    浏览量

    26678
  • Docker
    +关注

    关注

    0

    文章

    457

    浏览量

    11846

原文标题:Docker 方式跑 Golang 程序 web 服务

文章出处:【微信号:gh_3980db2283cd,微信公众号:开关电源芯片】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    docker-compose配置文件内容详解以及常用命令介绍

    需要的所有服务(例如:Web服务器、数据库、缓存等)并轻松管理它们。 Docker Compose 使用的三个步骤: 使用 Dockerfile 定义应用
    的头像 发表于 12-02 09:29 229次阅读
    <b class='flag-5'>docker</b>-compose配置文件内容详解以及常用命令介绍

    AWTK-WEB 快速入门(1) - C 语言应用程序

    导读AWTK可以使用相同的技术栈开发各种平台的应用程序。有时我们需要使用Web界面与设备进行交互,本文介绍一下如何使用C语言开发AWTK-WEB应用程序。用AWTKDesigner新建
    的头像 发表于 11-27 11:46 185次阅读
    AWTK-<b class='flag-5'>WEB</b> 快速入门(1) - C 语言应用<b class='flag-5'>程序</b>

    Docker运行环境安装

    作者:京东科技 林中 Docker是一个开放的平台,用于开发、发布和运行应用程序Docker分离了应用程序和运行应用的基础设施,从而实现了软件的快速交付。利用
    的头像 发表于 10-29 11:28 201次阅读

    【米尔NXP i.MX 93开发板试用评测】4、使用golang搭建Modbus 服务

    负责处理来自客户端(通常称为Modbus客户端或从站)的请求,并根据请求提供相应的数据或执行操作。 快速开发modbus服务器 可以使用golang快速部署一个modbus服务器。我们先在开发板上安装
    发表于 09-21 22:51

    ARM平台实现Docker容器技术

    及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,亦可实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。使用Docker,可像管理应用程序一样管理基础结构
    发表于 07-25 14:36

    ARM平台实现Docker容器技术

    及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,亦可实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。使用Docker,可像管理应用程序一样管理基础结构
    发表于 07-17 11:05

    华纳云:java web和java有什么区别java web和java有什么区别

    Java Web和Java是两个不同的概念,它们在功能、用途和实现方式上存在一些区别,下面将详细介绍它们之间的区别。 1. 功能和用途: – Java是一种编程语言,它提供了一种用于开发各种应用程序
    的头像 发表于 07-16 13:35 785次阅读
    华纳云:java <b class='flag-5'>web</b>和java有什么区别java <b class='flag-5'>web</b>和java有什么区别

    鸿蒙原生应用元服务开发WEB-Cookie管理

    Cookie是网络访问过程中,由服务端发送给客户端的一小段数据。客户端可持有该数据,并在后续访问该服务端时,方便服务端快速对客户端身份、状态等进行识别。 Web组件提供了
    发表于 05-16 15:14

    鸿蒙原生应用元服务开发-Web相关说明

    Web组件用于在应用程序中显示Web页面内容,为开发者提供页面加载、页面交互、页面调试等能力。 页面加载:Web组件提供基础的前端页面加载的能力,包括加载网络页面、本地页面、Html格
    发表于 05-10 15:03

    使用Docker部署Go Web应用程序步骤

    大多数情况下Go应用程序被编译成单个二进制文件,web应用程序则会包括模版和配置文件。而当一个项目中有很多文件的时候,由于很多文件没有同步就会导致错误的发生并且产生很多的问题。
    发表于 04-20 09:33 493次阅读
    使用<b class='flag-5'>Docker</b>部署Go <b class='flag-5'>Web</b>应用<b class='flag-5'>程序</b>步骤

    ARM平台实现Docker容器技术

    ,亦可实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。使用Docker,可像管理应用程序一样管理基础结构。通过利用Docker的快速发布、测试和部署代码的方法,可显著减少产品开发时间。  
    的头像 发表于 03-07 13:48 793次阅读
    ARM平台实现<b class='flag-5'>Docker</b>容器技术

    【米尔-全志T113-i开发板试用】4、使用Gin框架搭建简易的web server和提供设备信息获取接口

    上一个章节,我们搞定了golang获取系统信息,在这一课,我们需要搭建一个简易的web服务器,将设备信息通过gin的json接口提供给网页。 1、编写定期获取信息功能的代码 Gin的web
    发表于 02-22 16:23

    如何使用Golang连接MySQL

    首先我们来看如何使用Golang连接MySQL。
    的头像 发表于 01-08 09:42 3337次阅读
    如何使用<b class='flag-5'>Golang</b>连接MySQL

    什么是web服务器?如何选择服务器配置?

    Web服务器是一种软件或硬件设备,用于托管和提供网页内容。它接收客户端(如浏览器)发送的HTTP请求,并返回相应的网页内容或其他资源,以实现更高的性能和可靠性。它是网站和应用程序在互联网上构建和交付
    的头像 发表于 01-03 15:25 1092次阅读

    Nginx在Windows/docker中的使用

    nginx 是一个高性能的开源反向代理服务器和 web 服务器,一般用来搭建静态资源服务器、负载均衡器、反向代理,本文将分享其在 Windows/d
    的头像 发表于 01-03 10:20 1856次阅读
    Nginx在Windows/<b class='flag-5'>docker</b>中的使用