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

    文章

    10816

    浏览量

    210935
  • 数据库
    +关注

    关注

    7

    文章

    3754

    浏览量

    64251
  • PHP
    PHP
    +关注

    关注

    0

    文章

    452

    浏览量

    26633
  • Docker
    +关注

    关注

    0

    文章

    454

    浏览量

    11799

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

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

收藏 人收藏

    评论

    相关推荐

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

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

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

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

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

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

    Nginx在Windows/docker中的使用

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

    docker核心组件有哪些

    Docker 是一种开源的容器化平台,它能够实现将应用程序及其依赖项打包到一个可移植的容器中,从而实现快速、可重复、可扩展的部署和管理。Docker 的核心组件包括 Docker En
    的头像 发表于 11-23 09:47 1817次阅读

    如何启动本机docker服务

    Docker是一个开源项目,可以帮助开发者打包应用程序及其依赖,并且能够将其作为独立的容器来运行。本文将详细介绍如何在本机上启动Docker服务。 第一步:安装
    的头像 发表于 11-23 09:43 1968次阅读

    linux关闭docker的命令

    在 Linux 系统中,关闭 Docker 的操作可以通过以下多种方式进行。本文将详细讲解每一种方式,并提供示例代码和命令,以帮助读者更好地理解和实践。 使用 docker 命令 最常
    的头像 发表于 11-23 09:39 2724次阅读

    docker容器与容器之间通信

    Docker是一种轻量级容器化技术,能够将应用程序及其依赖项封装在一个独立、可移植的容器中。而容器化的应用程序通常是以分布式方式设计的,因此实现容器与容器之间的通信至关重要。 本文将详
    的头像 发表于 11-23 09:36 1456次阅读

    docker exec命令的使用方法

    Docker是一种开源的容器化平台,可以让开发人员在容器中打包和运行应用程序。它提供了一种快速、可靠和一致的方式来构建、部署和运行应用程序Dock
    的头像 发表于 11-23 09:33 1532次阅读

    docker部署对性能的影响

    Docker 是一个流行的容器化平台,它提供了一种轻量级的虚拟化技术,使得应用程序可以在独立的容器中运行。然而,部署应用程序Docker 容器中可能会对性能产生一些影响。在本文中,
    的头像 发表于 11-23 09:31 1486次阅读

    docker部署mysql的坏处

    Docker 是一种虚拟化技术,它允许开发人员在容器内打包应用程序及其所有依赖项,从而实现在不同环境中运行相同的应用程序的能力。然而,在使用 Docker 部署 MySQL 时,也存在
    的头像 发表于 11-23 09:29 1343次阅读

    docker服务架构实战

    随着云计算和容器化技术的快速发展,微服务架构在软件开发领域中变得越来越流行。微服务架构将一个大型的软件应用拆分成多个小型的、独立部署的服务,每个服务负责独立的业务功能。其中,
    的头像 发表于 11-23 09:26 620次阅读