使用Docker部署ASP.NET Core應用程序實踐
前言
最近把很火的Docker給看了,於是就磨拳擦掌要去實踐一下。於是就拿之前一個aps.net core的項目(已被停止)去練手。該項目之前在ubuntu14.04上確保可以正常運行,所以docker化應該不會有太多問題。搜索了下微軟提供了asp.net core的官方docker鏡像,但我為了學習docker決定從linux的基礎鏡像開始制作docker鏡像,同時為了少繞彎路,決定從確保能運行的ubuntu14.04開始.
準備
環境
OS:Ubuntu 14.04
.NET Core SDK:2.0
DB:mysql
編譯發布程序
sudo dotnet publish -o ..\publish -c Release -r ubuntu.14.04-x64
將程序編譯成ubuntu平臺的二進制文件.
構建數據庫用Docker容器
既然應用程序Docker化了,那數據庫肯定也要Docker化,這裏數據庫我用的Mysql,直接使用的官方鏡像的mysql:5.7
sudo docker run --name demo-mysql -v /home/yotsuki/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7
這裏使用了將本地路徑/home/yotsuki/datadir設為映射為數據庫目錄,並把數據庫的3306端口給映射出來。
修改應用程序配置文件
因為docker容器的IP地址不固定,稍後的應用程序容器打算使用--link方式連接到數據庫,於是需要把應用程序配置文件中的數據庫連接從IP改為hostname,就先定義為demodb吧
// "ConnectionString": "server=127.0.0.1;user id=root;persistsecurityinfo=True;database=pmis;password=123456;port=3306;",
"ConnectionString": "server=demodb;user id=root;persistsecurityinfo=True;database=pmis;password=123456;port=3306;",
編寫Dockerfile 文件
# Version:0.0.1
FROM ubuntu:14.04
MAINTAINER yotsuki
RUN cp /etc/apt/sources.list /etc/apt/sources.list_backup
COPY ./sources.list /etc/apt/sources.list
RUN apt-get install libunwind8 liblttng-ust0 libcurl3 libssl1.0.0 libuuid1 libkrb5-dev zlib1g libicu52 -y
RUN apt-get update
RUN mkdir /usr/bin/pmis_web
COPY ./publish /usr/bin/pmis_web
WORKDIR /usr/bin/pmis_web
ENTRYPOINT ./PMIS.WebAPIs
EXPOSE 80
我使用了從官方的ubuntu14.04鏡像開始構建容器。
sources.list是國內訪問官方鏡像過慢的無奈之舉,我做了一個163鏡像文件直接COPY進去了(我知道這樣不好,但這不是重點)
根據微軟官方文檔查到要想運行.net core程序需要安裝以下幾個包,於是就先使用apt-get安裝必須包
apt-get install libunwind8 liblttng-ust0 libcurl3 libssl1.0.0 libuuid1 libkrb5-dev zlib1g libicu52 -y
apt-get update
然後創建目錄並copy程序文件進去
RUN mkdir /usr/bin/pmis_web
COPY ./publish /usr/bin/pmis_web
WORKDIR /usr/bin/pmis_web
最後設置啟動命令,並暴露端口
這樣Dockerfile就編寫完成了
sudo docker build -t demo-web .
運行鏡像
sudo docker run -d --name demowebapp --link demo-mysql:demodb -p 80:80 demo-web
打開我們的瀏覽器輸入127.0.0.1 就能看到程序在運行了
至此我們的一個簡單的docker化的asp.net core應用程序就部署完畢了。
總結
因為.net core的跨平臺特性保證了.net 也能擁抱docker,這是一件大好事。
在學習docker過程中,我感覺到容器化的.net程序和我們以前開發的還是要有一些不同的。比如配置文件中的數據庫鏈接,這裏雖然我該ip為demodb,並使用--link鏈接了,但這是我事先在編譯docker鏡像前固定好了名字。我覺得可能比較好的做法應該是通過docker run命令傳進來或者通過-v命令指定本地配置文件。後者不用更改程序,前者還是需要用到環境變量的(我以前的程序基本不用環境變量)。
希望以後能有.net core程序在docker中實踐的機會吧
使用Docker部署ASP.NET Core應用程序實踐