使用 Docker 搭建屬於你自己的 Go Playground

語言: CN / TW / HK

本篇文章將介紹如何通過容器來部署屬於你自己的 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 -ddocker compose up -d (新版本 Docker) 命令來啟動程序。

使用程序

在啟動程序之後,我們打開瀏覽器,訪問 http://localhost:8080 ,就可以開始快捷的 Golang 之旅啦。

你可以在“代碼文本框”中自行輸入代碼,然後點擊“運行”,來讓代碼在容器中完成自動編譯、構建、鏈接、運行等一系列操作。

也可以使用頂部菜單欄的“內置示例”下拉框,來選擇某一個例子,學習如何使用 Golang 或者這個工具,比如:啟動並驗證 HTTP 服務器的返回、在一個編輯器中同時使用多個 Go 程序文件、如何編寫單元測試、如何使用併發來進行科學計算等等…

其他

如果你想了解 Go Playground 這個項目背後的“黑魔法”,可以閲讀 這篇官方博客 ,裏面詳細的介紹了項目的由來、如何模擬時鐘、避免死鎖、模擬文件系統、模擬網絡調用等。

**這些實現,是官方應用和目前開源社區裏的其他三方實現的主要差別。**換言之,如果不進行這些“tricks”,Playground 的計算結果的穩定性和結果的一致性其實存在比較大的挑戰。

當然,為了避免 DDoS 攻擊,官方還在實現中添加了 MemCached 組件,來緩存計算過程和結果。(支持 Sleep 這類異步輸出的日誌結果)

最後

關於 Go Playground 如何使用 Docker 進行本地化部署就聊到這裏。

我們下一篇文章再見。

–EOF