使用 Docker 搭建属于你自己的 Go Playground
本篇文章将介绍如何通过容器来部署属于你自己的 Go Playground。
Go Playground 是 Golang 团队推出的在线语言工具,不论是对于初学者而言,还是对 Golang 开发者来说,它都不失为一个简单好用的神器。
但由于种种原因,国内部分用户使用这个功能可能会遇到一些网络问题,而无法使用这个服务;以及出于运行代码包含一些“隐私”,而无奈放弃这个服务。
写在前面
这个周末花了一些时间,对 Golang 官方 Go Playground 项目 进行了一些调整,让项目能够轻松的在 GCE 环境之外的普通 Docker 容器环境中运行起来,让我们能够在本地快速验证各种 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 -d
或 docker compose up -d
(新版本 Docker) 命令来启动程序。
使用程序
在启动程序之后,我们打开浏览器,访问 http://localhost:8080
,就可以开始快捷的 Golang 之旅啦。
你可以在“代码文本框”中自行输入代码,然后点击“运行”,来让代码在容器中完成自动编译、构建、链接、运行等一系列操作。
也可以使用顶部菜单栏的“内置示例”下拉框,来选择某一个例子,学习如何使用 Golang 或者这个工具,比如:启动并验证 HTTP 服务器的返回、在一个编辑器中同时使用多个 Go 程序文件、如何编写单元测试、如何使用并发来进行科学计算等等…
其他
如果你想了解 Go Playground 这个项目背后的“黑魔法”,可以阅读 这篇官方博客 ,里面详细的介绍了项目的由来、如何模拟时钟、避免死锁、模拟文件系统、模拟网络调用等。
**这些实现,是官方应用和目前开源社区里的其他三方实现的主要差别。**换言之,如果不进行这些“tricks”,Playground 的计算结果的稳定性和结果的一致性其实存在比较大的挑战。
当然,为了避免 DDoS 攻击,官方还在实现中添加了 MemCached 组件,来缓存计算过程和结果。(支持 Sleep 这类异步输出的日志结果)
最后
关于 Go Playground 如何使用 Docker 进行本地化部署就聊到这里。
我们下一篇文章再见。
–EOF
- 使用 Docker 搭建属于你自己的 Go Playground
- 使用 Golang 正确处理五大互联网注册机构的 IP 数据
- 走进向量计算:从源码编译 OpenBLAS
- 正确处理全球五大互联网注册机构的 IP 数据
- 用让新海诚本人惊讶的 AI 模型制作属于你的动漫视频
- 使用 Docker 来运行 HuggingFace 海量模型
- 聊聊代码仓库可视化:gource 篇
- 群晖 DSM 7.1 折腾笔记:卸载内置程序
- Apple 老设备(系统)精简记录
- 抢先体验 Ubuntu 22.04 Jammy Jellyfish
- 使用 Docker 搭建适用于 HomeLab 的轻量邮件网关
- 从零开始搭建个人书签导航应用:Flare
- 使用 Docker 搭建适用于 HomeLab 的书签导航
- 使用 Mastodon 搭建个人信息平台:调优篇
- 使用 Mastodon 搭建个人信息平台:前篇
- Flare 制作记录:应用前后端性能优化
- 深入浅出 Golang 资源嵌入方案:前篇
- 装在笔记本里的私有云环境:持续集成(上)
- 2021 岁末总结
- 定制你的技术雷达:后篇