容器部署 .NET Core API

微軟在其官方網站 - .NET Core 中提供了各類平臺下 .NET Core 環境的搭建方法,其中包括了 Windows、Linux、Mac 以及 Docker 。其代碼託管在GitHub - dotnet/cli。若是你使用Docker進行部署的話,微軟官方也提供了相應的已經搭建好環境的官方鏡像:microsoft/dotnetmicrosoft/dotnet-preview,並且針對不一樣的用途發佈了不一樣的版本,即鏡像的標籤不一樣,這裏用的是 microsoft/dotnet:latest。其鏡像構建文件 Dockerfile。接下來是個人一些操做記錄。
部署的demo文件:點擊下載git

在Linux系統中部署virgo-api-demo

這裏我選擇的操做系統:Ubuntu Server 16.04 LTS,也可點擊這裏直接下載;
接下來須要在實體機或者虛擬機上進行 Ubuntu Server 16.04 LTS 的安裝
緊接着就是要搭建 .NET Core 環境:github

sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet/ xenial main" > /etc/apt/sources.list.d/dotnetdev.list'
sudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893
sudo apt-get update

若是現有環境中已安裝有 .NET Core ,請先用下面的腳本進行卸載清理:docker

#!/usr/bin/env bash
#
# Copyright (c) .NET Foundation and contributors. All rights reserved.
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
#

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

current_user=$(whoami)
if [ $current_user != "root" ]; then
    echo "$(basename "$0") uninstallation script requires superuser privileges to run"
    exit 1
fi

host_package_name="dotnet-host"

remove_all(){
    apt-get purge -y $host_package_name
}

is_dotnet_host_installed(){
    local out="$(dpkg -l | grep $host_package_name)"
    [ -z "$out" ]
}

is_dotnet_host_installed
[ "$?" -eq 0 ] && echo "Unable to find dotnet installation to remove." \
    && exit 0

remove_all
[ "$?" -ne 0 ] && echo "Failed to remove dotnet packages." && exit 1

is_dotnet_host_installed
[ "$?" -ne 0 ] && \
    echo "dotnet package removal succeeded but appear to still be installed. Please file an issue at https://github.com/dotnet/cli" && \
    exit 1

echo "dotnet package removal succeeded."
exit 0

安裝 .NET Core SDK:ubuntu

sudo apt-get install dotnet-dev-1.0.0-preview2-003121

查看 .NET Core 的版本信息:segmentfault

dotnet --version

作一個簡單的demo並編譯運行:api

mkdir demo
cd demo
dotnet new
dotnet restore
dotnet run

若是上面兩步都正常,說明安裝沒什麼問題,接下來就進行部署操做。上面提供的demo下載是發佈好的文件,因此這裏就不須要編譯了。將下載好的文件解壓後直接連同文件夾一塊兒上傳到host的根路徑「/」下。而後進入發佈文件夾並執行部署操做:瀏覽器

cd virgo-api-demo
dotnet Virgo.WebApi.dll

會有這樣的提示:bash

Hosting environment: Production
Content root path: /app
Now listening on: http://*:5000
Application started. Press Ctrl+C to shut down.

再經過另一個ssh客戶端鏈接該host,而後執行:app

curl http://localhost:5000/api/values

若是返回結果以下則正常:ssh

["value1","value2"]

可是當經過局域網的其餘主機訪問http://localhost:5000/api/values時則會發現被拒絕···說到這裏須要謝謝VIVA LA VIDA的解惑。在部署完成後,運行的過程當中偵聽的是host內部的5000端口,與外部的其餘主機是不互通的,因此本地訪問正常,而外部卻被拒絕。要解決這個問題有兩個方法:
運行時傳入參數--server.urls http://*:5000

dotnet Virgo.WebApi.dll --server.urls http://*:5000

或者在項目的 program 下的 host 中添加參數.UseUrls("http://*:5000")
而後再從局域網中的其餘主機經過瀏覽器訪問http://192.168.2.129:5000/api/values便可返回正確的結果["value1","value2"]。如需瞭解更多詳情請移步 .NET Core

經過Docker部署virgo-api-demo

在主機上部署完成且能夠正常訪問後在用Docker部署就很容易了。我部署的過程當中主要就是不知道上面提到的那個參數,經過上面的操做明白了其做用,再來用Docker部署就只需三條命令:

# 第一條命令用於定位到發佈文件夾所在的位置
cd /opt/virgo-api-demo
docker run --rm -ti -p 8888:5000 -v $(pwd)/virgo-api-demo:/virgo microsoft/dotnet:latest
dotnet ./virog/Virgo.WebApi.dll --server.urls http://*:5000

接着就能夠經過外部其餘主機的瀏覽器訪問了。固然,也能夠先構建鏡像而後直接啓動容器
Dockerfile:

FROM microsoft/dotnet:latest                                    
MAINTAINER Mongo <willem@xcloudbiz.com>

# 這裏Dockerfile和virgo-api-demo在同一目錄下
ADD virgo-api-demo /virgo-api
WORKDIR /virgo-api
EXPOSE 5000 
CMD dotnet Virgo.WebApi.dll --server.urls http://*:5000

構建鏡像,啓動容器:

docker build -t virgoapi .
docker run -d -p 6677:5000 virgoapi

外部主機經過瀏覽器訪問 hostip:6677/api/values

相關文章
相關標籤/搜索