自架 Play With Docker

自架 Play With Docker

Issue

學過 Docker 的人都應該有用過 Docker Playground 來學習或是測試過軟體,不想在本機跑 Docker 可以先用 Docker Playground 試試看軟體可不可以跑。

官方已經有架設 Docker Playground,可以讓大家方便使用,但我使用的時後常發現他會 Lag,也不知道是 Docker Server 的問題,還是臺灣網路的問題。剛好最近想要教社團 Docker,這樣我架好一個,大家就不需要準備環境,直接就可以開始學了。

本專案的 GitHub

準備環境

  • Docker 18.06.0+

  • Go 最新版

以上的安裝兩個在這邊都不贅述,請自行參閱官方文檔。

開始部署

第一步:下載專案

git clone https://github.com/play-with-docker/play-with-docker
cd play-with-docker

第二步:確認驅動

其實我不是很確定這一步驟是要幹嘛,但是官方文檔有寫到,但是我在 Mac 上無法執行此命令,也可以順利部署。

sudo modprobe xt_ipvs

第三步:Docker swarm

docker swarm init

第四步:下載 image

這個 Image 是之後在 PWD 中創建容器時要用到的 Image。

docker pull franela/dind

第五步:go mod

這步也是非必要的,我也不懂 Golang 所以也不確定是要幹嘛。

go mod vendor

最後:啟動

docker-compose up

若沒有其他問題,理論上現在連接到 http://localhost:80 就可以看到 PWD 正在執行,也可以開始創建容器使用。

localhost or 404

上一段的最後寫到可以連接到 localhost,但如果你試著用 localhost 以外的方式連接,就會出現問題,不管是 127.0.0.1 或是用網址 pwd.example.com 之類的都沒有辦法連接到 PWD,會不斷地出現 404,就是只有 localhost 可以。官方的文件就寫到這裡,也沒寫解法,以下是我自己發現的解決方法。

基本上這個問題是 DNS 解析發生的問題,PWD 一次只能解析一種網址,預設是 localhost,我們可以去他的設定檔中變更他。

設定檔案在 play-with-docker/config/config.go 之中,其中會有一行長下面的樣子:

flag.StringVar(&PlaygroundDomain, "playground-domain", "localhost", "Domain to use for the playground")

可以看到 PWD 這裡可以設定要解析的網址就是 localhost,所以只要將此變更為 pwd.example.com,就可以用這個網址連上 PWD。

連上容器內的 Port

就算做完上面的設定,也順利了啟動 Docker 容器,但最後才發現想要連上特定的 Port 還是會失敗,因為他是用子網域的方式去連線 http://ip<hyphen-ip>-<session_jd>-<port>.direct.pwd.example.com,所以又會遇到無法解析 DNS 的情況,我的解法是在 DNS 的設定中把 pwd.example.com*.pwd.example.com 都加入 A Record,才順利連上。

Nginx Proxy Pass

這部分我研究了蠻久,如果要把 Server 隱藏在 Nginx 後面,要設定的東西比較複雜,因為 PWD 有使用到 WebSocket,但是這部分我沒有過多的心得,所以直接把我的 conf 放在下面,容我不做解釋了:

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen       80;
    server_name  pwd.example.com *.pwd.example.com;

    location / {
        proxy_pass http://192.168.1.1:80;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

上面是假設 PWD Server 跑在 192.168.1.1:80 上。

Reference


TonyPepe
Made with Love in Taiwan
Copyright
2020 - 2023