使用 Docker 搭建属于你自己的 Go Playground

本篇文章将介绍如何通过容器来部署属于你自己的 Go Playground。

Go Playground 是 Golang 团队推出的在线语言工具,不论是对于初学者而言,还是对 Golang 开发者来说,它都不失为一个简单好用的神器。

但由于种种原因,国内部分用户使用这个功能可能会遇到一些网络问题,而无法使用这个服务;以及出于运行代码包含一些“隐私”,而无奈放弃这个服务。

写在前面

这个周末花了一些时间,对 Golang 官方 Go Playground 项目[1]进行了一些调整,让项目能够轻松的在 GCE 环境之外的普通 Docker 容器环境中运行起来,让我们能够在本地快速验证各种 Golang 代码片段。

调整后的项目有哪些特点呢:

支持完全离线运行,无需“联网”,不需担心有任何信息泄漏的风险(比如包含密钥的程序)。支持使用容器进行快速启动,不锁定任何公有云或者复杂的运行环境。和官方程序一样,使用沙盒方式运行 Golang 程序,确保运行程序安全,无副作用。和官方程序一样,使用 faketime “模块”,让程序能够提供确定性的输出,让程序复现和结果缓存变的更加容易。合并了来自 go.dev 的默认示例,并进行了适当的界面“汉化”。大幅精简程序模块和依赖,减少不必要的资源消耗。

完整的项目代码,我已经上传到了 GitHub,如果你需要的话,可以自取[2]

准备工作

想要使用这个项目非常简单,准备工作只有三步:准备 Docker 环境、下载容器镜像、准备容器编排文件。

准备 Docker 环境

我们需要先完成 Docker 运行环境的安装,如果你的本地环境中已经安装了 Docker,那么可以跳过这个小节,阅读后面的内容。

如果你是桌面运行环境,可以访问官网下载安装文件[3],如果你使用的是服务端环境,可以参考这篇文章中的“更简单的 Docker 安装[4]”,来完成 Docker 环境的准备。

获取必要的容器镜像

在 Docker 环境就绪之后,我们需要执行下面的命令,来获取必要的容器镜像:

docker pull soulteary/golang-playground:web-1.18.4
docker pull soulteary/golang-playground:sandbox-1.18.4
docker pull soulteary/golang-playground:actuator-1.18.4
docker pull memcached:1.6.15-alpine

准备容器编排文件

在镜像文件就绪之后,我们需要先编写一个容器编排文件,来定义各种容器服务该如何运行:

version: '3'
services:

  sandbox:
    image: soulteary/golang-playground:sandbox-1.18.4
    restart: always
    command: -mode=server -listen=0.0.0.0:80 -workers=1 -untrusted-container=soulteary/golang-playground:actuator-1.18.4
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - playground
    depends_on:
      - memcached

  web:
    image: soulteary/golang-playground:web-1.18.4
    restart: always
    environment:
      - SANDBOX_BACKEND_URL=http://sandbox:/run
      - MEMCACHED_ADDR=memcached:11211
    ports:
      - 8080:8080
    depends_on:
      - sandbox
    networks:
      - playground

  memcached:
    image: memcached:1.6.15-alpine
    command: memcached -m 64
    networks:
      - playground
networks: 
  playground:

将上面的文件保存为 docker-compose.yml 之后,我们使用 docker-compose up -d 或 docker compose up -d(新版本 Docker) 命令来启动程序。

使用程序

在启动程序之后,我们打开浏览器,访问 http://localhost:8080,就可以开始快捷的 Golang 之旅啦。

使用 Docker 搭建属于你自己的 Go Playground
浏览器中的界面

你可以在“代码文本框”中自行输入代码,然后点击“运行”,来让代码在容器中完成自动编译、构建、链接、运行等一系列操作。

也可以使用顶部菜单栏的“内置示例”下拉框,来选择某一个例子,学习如何使用 Golang 或者这个工具,比如:启动并验证 HTTP 服务器的返回、在一个编辑器中同时使用多个 Go 程序文件、如何编写单元测试、如何使用并发来进行科学计算等等…

其他

如果你想了解 Go Playground 这个项目背后的“黑魔法”,可以阅读这篇官方博客[5],里面详细的介绍了项目的由来、如何模拟时钟、避免死锁、模拟文件系统、模拟网络调用等。

这些实现,是官方应用和目前开源社区里的其他三方实现的主要差别。换言之,如果不进行这些“tricks”,Playground 的计算结果的稳定性和结果的一致性其实存在比较大的挑战。

当然,为了避免 DDoS 攻击,官方还在实现中添加了 MemCached 组件,来缓存计算过程和结果。(支持 Sleep 这类异步输出的日志结果)

最后

关于 Go Playground 如何使用 Docker 进行本地化部署就聊到这里。

我们下一篇文章再见。

–EOF


引用链接

[1] 官方 Go Playground 项目: https://github.com/golang/playground
[2] 可以自取: https://github.com/soulteary/golang-playground
[3] 下载安装文件: https://www.docker.com/get-started/
[4] 更简单的 Docker 安装: https://soulteary.com/2022/06/21/building-a-cost-effective-linux-learning-environment-on-a-laptop-the-basics.html#%E6%9B%B4%E7%AE%80%E5%8D%95%E7%9A%84-docker-%E5%AE%89%E8%A3%85
[5] 这篇官方博客: https://blog.go-zh.org/playground


如果你觉得内容还算实用,欢迎点赞分享给你的朋友,在此谢过。

如果你想更快的看到后续内容的更新,请戳 “点赞”、“分享”、“喜欢” ,这些免费的鼓励将会影响后续有关内容的更新速度。


本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

原文始发于微信公众号(折腾技术):使用 Docker 搭建属于你自己的 Go Playground

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/26378.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!