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

    文章

    11327

    浏览量

    225880
  • 数据库
    +关注

    关注

    7

    文章

    4083

    浏览量

    68538
  • PHP
    PHP
    +关注

    关注

    0

    文章

    463

    浏览量

    28806
  • Docker
    +关注

    关注

    0

    文章

    537

    浏览量

    14401

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Docker容器网络模式全解析

    容器网络是Docker使用中最容易出问题的部分。容器之间怎么通信、容器怎么访问外网、外部怎么访问容器内的服务——这三个问题搞不清楚,排查网络故障就是抓瞎。
    的头像 发表于 02-26 16:39 472次阅读

    Python运行本地Web服务并实现远程访问

    本文介绍使用Python搭建本地Web服务并结合 ZeroNews 实现公网访问。
    的头像 发表于 02-06 11:39 346次阅读
    Python运行本地<b class='flag-5'>Web</b><b class='flag-5'>服务</b>并实现远程访问

    如何在2026年Rocky Linux(8、9和10)上安装Docker

    Docker 已成为现代应用部署、开发和基础设施自动化的核心技术。如果你在服务器或VPS上运行Rocky Linux,学会在Rocky Linux上安装Docker是你2026年能掌握的最宝贵技能
    的头像 发表于 01-12 17:21 1857次阅读

    使用 Docker 一键部署 PaddleOCR-VL: 新手保姆级教程

    → 拉起 PaddleOCR-VL 服务 → 本机用 HTTP 调用 /layout-parsing 接口通文档解析。 一,PaddleOCR-VL是什么、为什么用 Docker
    的头像 发表于 12-18 18:26 6775次阅读
    使用 <b class='flag-5'>Docker</b> 一键部署 PaddleOCR-VL: 新手保姆级教程

    如何在NVIDIA Jetson AGX Thor上通过Docker高效部署vLLM推理服务

    继系统安装与环境配置后,本期我们将继续带大家深入 NVIDIA Jetson AGX Thor 的开发教程之旅,了解如何在 Jetson AGX Thor 上,通过 Docker 高效部署 vLLM 推理服务
    的头像 发表于 11-13 14:08 4400次阅读
    如何在NVIDIA Jetson AGX Thor上通过<b class='flag-5'>Docker</b>高效部署vLLM推理<b class='flag-5'>服务</b>

    香港服务器支持Docker和Kubernetes吗?

    在云原生技术成为主流的今天,Docker和Kubernetes(K8s)已成为现代化应用开发和部署的事实标准。对于选择香港服务器的开发者与企业而言,一个核心问题是:香港服务器能否完美支持Doc
    的头像 发表于 10-21 15:47 911次阅读

    如何快速在云服务器上部署Web环境?

    如何快速在云服务器上部署Web环境
    的头像 发表于 10-14 14:16 859次阅读

    如何使用 CyCloneTCP 和 FreeRTOS 在 NuMaker IoT 板上构建 Web 服务器?

    使用 CyCloneTCP 和 FreeRTOS 在 NuMaker IoT 板上构建 Web 服务
    发表于 09-04 08:10

    如何使用 Mbed OS 在 NuMaker IoT 板上构建 Web 服务器?

    使用 Mbed OS 在 NuMaker IoT 板上构建 Web 服务
    发表于 09-04 06:33

    【HZ-T536开发板免费体验】5、安装sqlite3和使用golang读写数据库

    如果想在嵌入式设备上实现简单的设备管理功能,需要数据库和服务后端程序服务程序,我更倾向使用golang来实现。 安装sqlite3,使用
    发表于 08-26 00:04

    【EASY EAI Orin Nano开发板试用体验】使用stream推流代码和WEB服务器代码实现在客户端网页上查看摄像头图像

    重点。在嵌入式系统中,对摄像头图像的推流可以用两种方式,第一种是直接使用液晶显示屏显示摄像头图像,第二种就是在WEB服务器网页上推流,嵌入式系统自身作为WEB
    发表于 08-11 23:15

    docker无法启用怎么解决?

    mengxing@mengxing-virtual-machine:/etc/docker$ sudo systemctl daemon-reload
    发表于 06-23 07:17

    Docker Volume管理命令大全

    Docker Volume管理命令大全
    的头像 发表于 05-28 17:14 1082次阅读

    Docker Compose的常用命令

    。它通过一个配置文件(docker-compose.yml)来详细定义多个容器之间的关联、网络设置、服务端口等信息。使用一条简单的命令,就可以轻松启动、停止和管理这些容器,极大地简化了多容器应用的部署与管理流程,方便实现应用的快速构建、开发、测试以及部署。
    的头像 发表于 04-30 13:40 1389次阅读

    Docker基本命令及其用例

    Docker 已迅速成为容器化应用程序的事实标准。作为开发人员或 DevOps 工程师/系统管理员,熟悉 Docker 对于高效部署现代、可移植的应用程序至关重要。
    的头像 发表于 04-30 10:04 841次阅读