超級簡便的容器化部署工具(使用 ASP.NET Core 演示)

Docker 改變了咱們部署網站的方式,從原先的手動編譯打包上傳,到如今的構建鏡像而後推送部署,讓咱們在配置環境上所花費的時間大大減小了。不只如此,經過一系列相關的工具配合,能夠很輕鬆的實現 CI、CD。本文即將介紹的就是這麼一款很是簡便的工具——captainduckduck,使用 captainduckduck 只須要不多的 Docker 知識。前端

簡介

原先,咱們的部署流程多是這樣的:node

拉取代碼 -> 構建鏡像 -> 啓動容器

除此以外,還須要配置 HTTPS,配置反向代理,若是要更新應用的話,還須要手動去執行一遍部署流程,先不說一遍一遍執行這些個東西挺枯燥的,再一個,當同一臺服務器上託管的網站多了,時間一長,可能反向代理的端口號都記不清,以後再部署新的網站,還得把 nginx 配置文件看一遍。react

幸運的是,我無心間發現了 captainduckduck, 這是一個可以極大的簡化咱們使用 Docker 部署 Web 服務步驟的工具,完美的擊中了上面提到的痛點,並且使用起來很是的簡單。captainduckduck 是對 Docker swarm 技術一個較好的封裝,提供了一個 Web 面板以及一個客戶端命令行工具,即便用戶徹底沒有接觸過 Docker Swarm 甚至沒怎麼用過 nginx、Docker,也可以輕鬆的部署網站。linux

準備工做

首先須要準備這些東西:nginx

  • 一個支持泛解析的域名
  • 一臺安裝好了 Docker 17.06.x 的 Linux 服務器(最低配置 1核1G)

在校大學生可使用騰訊雲或者阿里雲提供的學生套餐,其中包含很多於 1G 內存的服務器跟一年的域名,也不貴,每個月支出一兩頓飯錢而已。git

安裝 Captain 服務端

mkdir /captain
docker run -v /var/run/docker.sock:/var/run/docker.sock dockersaturn/captainduckduck

運行上面的兩條 shell 命令並等待執行結束,就完成了服務端的部署,啊,就是這麼簡單。而後你就能夠在瀏覽器裏訪問:http://[IP_OF_YOUR_SERVER]:3000 Web 面板了。使用默認密碼登錄後,就能夠來配置服務端了。github

配置服務端

首先在你的域名解析處添加一個 A 記錄:*.something,IP 指向安裝了 captainduckduck 的服務器。而後在 Web 面板的 Dashboard 頁面設置 Captain Root Domainsomething.example.com。同時,你還能夠啓用 HTTPS,captainduckduck 會自動的使用 Let's Encrypt 給你的域名加上一個 HTTPS 證書。添加好根域名後,captainduckduck 會給 Web 面板分配一個用來直接訪問的域名:captain.something.example.comdocker

至此,captainduckduck 就已經部署完畢了,讓咱們測試一下,切換到 Apps 頁面,點擊 OneClick Apps/Databases,在下拉列表中選擇 WordPress,而後按照表單填寫數據庫相關的信息,稍等幾分鐘,就能夠一鍵部署一個 WordPress 站點了。這裏是我運行好的:https://test-wp.app.gianthard.rocks/shell

部署 ASP.NET Core 網站

Dockerfile

captainduckduck 默認並不支持 ASP.NET Core 網站的一鍵部署,須要本身動手寫一個 Dockerfile,不過好在微軟已經給了標準樣例:數據庫

# 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 .
RUN cd ./src && dotnet restore

# copies the rest of your code
COPY ./src/ .
RUN cd ./src && dotnet publish --output /app/ --configuration Release

# Stage 2
FROM microsoft/aspnetcore
WORKDIR /app
COPY --from=builder /app .
ENTRYPOINT ["dotnet", "myapp.dll"]

若是你的網站使用了現代前端框架的服務端渲染技術,你可使用下面的 Dockerfile 樣例:

# 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 cd ./src && dotnet restore && npm i

# copies the rest of your code
COPY ./src/ .
RUN cd ./src && 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

雖然上面介紹了 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 myapp
cd myapp
dotnet new react
yarn # Or npm i

而後把上面的 caption-definition 文件添加到項目根目錄。接着執行:

git init
git 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


參考列表:

相關文章
相關標籤/搜索