使用 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 歲末總結
- 定製你的技術雷達:後篇