超級簡便的容器化部署工具
Docker 改變了我們部署網站的方式,從原先的手動編譯打包上傳,到現在的構建鏡像然後推送部署,讓我們在配置環境上所花費的時間大大減少了。不僅如此,通過一系列相關的工具配合,可以很輕鬆的實現 CI、CD。本文即將介紹的就是這麼一款非常簡便的工具——captainduckduck,使用 captainduckduck 只需要很少的 Docker 知識。
簡介
原先,我們的部署流程可能是這樣的:
拉取代碼 -> 構建鏡像 -> 啟動容器
除此之外,還需要配置 HTTPS,配置反向代理,如果要更新應用的話,還需要手動去執行一遍部署流程,先不說一遍一遍執行這些個東西挺枯燥的,再一個,當同一台伺服器上託管的網站多了,時間一長,可能反向代理的埠號都記不清,之後再部署新的網站,還得把 nginx 配置文件看一遍。
幸運的是,我無意間發現了 captainduckduck, 這是一個能夠極大的簡化我們使用 Docker 部署 Web 服務步驟的工具,完美的擊中了上面提到的痛點,而且使用起來非常的簡單。captainduckduck 是對 Docker swarm 技術一個較好的封裝,提供了一個 Web 面板以及一個客戶端命令行工具,即使用戶完全沒有接觸過 Docker Swarm 甚至沒怎麼用過 nginx、Docker,也能夠輕鬆的部署網站。
準備工作
首先需要準備這些東西:
一個支持泛解析的域名
一台安裝好了 Docker 17.06.x 的 Linux 伺服器(最低配置 1核1G)
在校大學生可以使用騰訊雲或者阿里雲提供的學生套餐,其中包含不少於 1G 內存的伺服器跟一年的域名,也不貴,每月支出一兩頓飯錢而已。
安裝 Captain 服務端
mkdir /captaindocker run -v /var/run/docker.sock:/var/run/docker.sock dockersaturn/captainduckduck
運行上面的兩條 shell 命令並等待執行結束,就完成了服務端的部署,啊,就是這麼簡單。然後你就可以在瀏覽器里訪問:http://[IP_OF_YOUR_SERVER]:3000 Web 面板了。使用默認密碼登陸後,就可以來配置服務端了。
配置服務端
至此,captainduckduck 就已經部署完畢了,讓我們測試一下,切換到 Apps 頁面,點擊 OneClick Apps/Databases,在下拉列表中選擇 WordPress,然後按照表單填寫資料庫相關的信息,稍等幾分鐘,就可以一鍵部署一個 WordPress 站點了。這裡是我運行好的:https://test-wp.app.gianthard.rocks/
部署 ASP.NET Core 網站
Dockerfile
captainduckduck 默認並不支持 ASP.NET Core 網站的一鍵部署,需要自己動手寫一個 Dockerfile,不過好在微軟已經給了標準樣例:
# Sample contents of Dockerfile# Stage 1FROM microsoft/aspnetcore-build AS builderWORKDIR /source# caches restore result by copying csproj file separatelyCOPY ./src/*.csproj .RUN cd ./src && dotnet restore# copies the rest of your codeCOPY ./src/ .RUN cd ./src && dotnet publish --output /app/ --configuration Release# Stage 2FROM microsoft/aspnetcoreWORKDIR /appCOPY --from=builder /app .ENTRYPOINT ["dotnet", "myapp.dll"]
如果你的網站使用了現代前端框架的服務端渲染技術,你可以使用下面的 Dockerfile 樣例:
# Sample contents of Dockerfile# Stage 1FROM microsoft/aspnetcore-build AS builderWORKDIR /source# caches restore result by copying csproj file separatelyCOPY ./src/*.csproj .COPY ./src/package.json .# 如果你的伺服器網路不好,請自行在這裡修改 npm 倉庫RUN cd ./src && dotnet restore && npm i# copies the rest of your codeCOPY ./src/ .RUN cd ./src && dotnet publish --output /app/ --configuration Release# Stage 2FROM microsoft/aspnetcore:2.0.5ENV NODE_VERSION 9.3.0RUN curl -SLO "https://mirrors.ustc.edu.cn/node/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz" && curl -SLO --compressed "https://mirrors.ustc.edu.cn/node/v$NODE_VERSION/SHASUMS256.txt" && grep " node-v$NODE_VERSION-linux-x64.tar.gz$" SHASUMS256.txt | sha256sum -c - && tar -xf "node-v$NODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1 --no-same-owner && rm "node-v$NODE_VERSION-linux-x64.tar.gz" SHASUMS256.txt && ln -s /usr/local/bin/node /usr/local/bin/nodejsWORKDIR /appCOPY --from=builder /app .ENTRYPOINT ["dotnet", "myapp.dll"]
captain-definition
雖然上面介紹了 Dockerfile,但最終要使用的是 captain-definition 這個文件,這個文件的詳細說明請看:https://github.com/githubsaturn/captainduckduck/wiki/Captain-Definition-File,不過 captainduckduck 的作者提供了一個在線轉換工具:https://githubsaturn.github.io/dockerfile-to-captain/。
轉換後的結果如下:
{ "schemaVersion": 1, "dockerfileLines": [ "# Sample contents of Dockerfile", "# Stage 1", "FROM microsoft/aspnetcore-build AS builder", "WORKDIR /source", "# caches restore result by copying csproj file separately", "COPY ./src/*.csproj .", "COPY ./src/package.json .", "# 如果你的伺服器網路不好,請自行在這裡修改 npm 倉庫", "RUN dotnet restore && npm i", "# copies the rest of your code", "COPY ./src/ .", "RUN dotnet publish --output /app/ --configuration Release", "# Stage 2", "FROM microsoft/aspnetcore:2.0.5", "ENV NODE_VERSION 9.3.0", "RUN curl -SLO "https://mirrors.ustc.edu.cn/node/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz" ", " && curl -SLO --compressed "https://mirrors.ustc.edu.cn/node/v$NODE_VERSION/SHASUMS256.txt" ", " && grep " node-v$NODE_VERSION-linux-x64.tar.gz\$" SHASUMS256.txt | sha256sum -c - ", " && tar -xf "node-v$NODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1 --no-same-owner ", " && rm "node-v$NODE_VERSION-linux-x64.tar.gz" SHASUMS256.txt ", " && ln -s /usr/local/bin/node /usr/local/bin/nodejs", "WORKDIR /app", "COPY --from=builder /app .", "ENTRYPOINT ["dotnet", "myapp.dll"]" ]}
這裡需要注意的是,即使 captain-definition 文件位於項目根目錄,但在服務端構建的時候,項目文件夾的內容會被克隆到 ./src,而由 captainduckduck 生成的 Dockerfile 會位於 ./Dockerfile,所以在編寫 Dockerfile 的時候,就應該考慮到這個情況。
客戶端命令行工具
captainduckduck 命令行工具可以用來讓我們不用打開 Web 面板就來部署網站,命令行工具安裝起來也很簡單:
npm i -g captainduckduck# 或者# yarn global add captainduckduck
接下來讓我們連接到 captainduckduck 服務端:
captainduckduck login
部署一個試試
部署網站之前需要先創建一個 App,首先登陸 Web 面板,切換到 App 頁面,輸入 App 的名字:react,然後點擊 Create A New App。這樣,一個 App 就創建完成了,現在我們可以關掉網站,接著在本地創建一個樣例項目:
mkdir myappcd myappdotnet new reactyarn # Or npm i
然後把上面的 caption-definition 文件添加到項目根目錄。接著執行:
git initgit add .git commit -m "init commit"captainduckduck deploy
稍等幾分鐘,你就可以打開 http://react.something.example.com 來訪問這個樣例網站了。這裡給出我的例子:http://react.app.gianthard.rocks/
更多功能
captainduckduck 還能跟代碼託管系統,例如:Github、Gitlab 通過 WebHook 集成,實現持續的部署,關於更詳細的介紹,請看項目 Wiki:https://github.com/githubsaturn/captainduckduck/wiki
參考列表:
https://github.com/githubsaturn/captainduckduck/wiki/Getting-Started
原文地址: https://www.cnblogs.com/JacZhu/p/8463663.html


※net的retrofit-WebApiClient庫深入篇
※dotnet core webapi+vue 搭建前後端完全分離web架構(一)
TAG:dotNET跨平台 |