3

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

 1 year ago
source link: https://soulteary.com/2022/07/17/build-your-own-go-playground-with-docker.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

2022年07月17日阅读Markdown格式2751字6分钟阅读

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

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

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

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

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

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

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

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

准备 Docker 环境

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

如果你是桌面运行环境,可以访问官网下载安装文件,如果你使用的是服务端环境,可以参考这篇文章中的“更简单的 Docker 安装”,来完成 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 -ddocker compose up -d(新版本 Docker) 命令来启动程序。

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

浏览器中的界面

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

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

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

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

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

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

我们下一篇文章再见。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK