參考文檔: https://docs.docker.com/install/linux/docker-ce/centos/ http://www.dockerinfo.net/document https://dotnet.microsoft.com/download/linux-package-m ...
參考文檔:
https://docs.docker.com/install/linux/docker-ce/centos/
http://www.dockerinfo.net/document
https://dotnet.microsoft.com/download/linux-package-manager/centos/sdk-current
https://www.cnblogs.com/viter/p/10463907.html
https://www.cnblogs.com/freewsf/p/7818791.html
https://www.cnblogs.com/sheng-jie/p/8107877.html
環境
伺服器系統:CentOS Linux release 7.2.1511
相關工具:VS2017 xftp putty
伺服器軟體:.net core 2.0,docker 18.09.6,
前言
之前寫過一篇文章,《.net core項目部署到centos7》,最近看到很多關於docker的文章,感覺這種方式確實好,所以自己也按著別人的文章實現了一把,確實很方便。先來看一張圖片,下麵這條大鯨魚,很形象的描述了Docker的功能,上面的箱子就是一個一個獨立的容器。
這裡先引用官方文檔對Docker進行一下介紹:
Docker 是一個開源項目,誕生於 2013 年初,最初是 dotCloud 公司內部的一個業餘項目。它基於 Google 公司推出的 Go 語言實現。 項目後來加入了 Linux 基金會,遵從了 Apache 2.0 協議,項目代碼在 GitHub 上進行維護。
Docker 自開源後受到廣泛的關註和討論,以至於 dotCloud 公司後來都改名為 Docker Inc。Redhat 已經在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 產品中廣泛應用。
Docker 項目的目標是實現輕量級的操作系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。
在 LXC 的基礎上 Docker 進行了進一步的封裝,讓用戶不需要去關心容器的管理,使得操作更為簡便。用戶操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單。
下麵的圖片比較了 Docker 和傳統虛擬化方式的不同之處,可見容器是在操作系統層面上實現虛擬化,直接復用本地主機的操作系統,而傳統方式則是在硬體層面實現。
為什麼要使用Docker
容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘量小。傳統虛擬機方式運行 10 個不同的應用就要起 10 個虛擬機,而Docker 只需要啟動 10 個隔離的應用即可。
具體說來,Docker 在如下幾個方面具有較大的優勢。
1、更快速的交付和部署
對開發和運維(devop)人員來說,最希望的就是一次創建或配置,可以在任意地方正常運行。
開發者可以使用一個標準的鏡像來構建一套開發容器,開發完成之後,運維人員可以直接使用這個容器來部署代碼。 Docker 可以快速創建容器,快速迭代應用程式,並讓整個過程全程可見,使團隊中的其他成員更容易理解應用程式是如何創建和工作的。 Docker 容器很輕很快!容器的啟動時間是秒級的,大量地節約開發、測試、部署的時間。
2、更高效的虛擬化
Docker 容器的運行不需要額外的 hypervisor 支持,它是內核級的虛擬化,因此可以實現更高的性能和效率。
3、更輕鬆的遷移和擴展
Docker 容器幾乎可以在任意的平臺上運行,包括物理機、虛擬機、公有雲、私有雲、個人電腦、伺服器等。 這種相容性可以讓用戶把一個應用程式從一個平臺直接遷移到另外一個。
4、更簡單的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發和更新,從而實現自動化並且高效的管理。
一、伺服器安裝dotnet-sdk
如果CentOS伺服器沒有安裝netcore,需要先用下圖的命令安裝一下,我選擇的是dotnet-sdk-2.0.0,大家也可以根據自己的程式來選擇安裝,
安裝dotnet-sdk的參考文檔:https://dotnet.microsoft.com/download/linux-package-manager/centos/sdk-current
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm #在安裝.NET之前,您需要註冊Microsoft密鑰,註冊產品存儲庫並安裝所需的依賴項。每台機器只需要安裝一次。
sudo yum update
sudo yum install dotnet-sdk-2.0.0
二、Docker 安裝
在2017年的3月1號之後,Docker的版本命名開始發生變化,同時將CE版本和EE版本進行分開,這裡我們選擇安裝免費的CE社區版,
具體區別可以參考:https://docs.docker.com/install/linux/docker-ce/centos/
$ sudo yum install docker-ce docker-ce-cli containerd.io //安裝命令 $ sudo docker --version //查看版本 $ sudo systemctl start docker.service //啟動docker $ sudo systemctl enable docker.service //設置開機啟動
通過docker --version命令,可以看到版本號為18.09.6,用命令 systemctl start docker.service 啟動docker後,我們可以測試下docker是否安裝成功,執行docker run hello-world命令,會看見提示
Unable to find image 'hello-world:latest' locally,意思是說在本地倉庫沒有找到鏡像'hello-world',之後會從官方倉庫中拉取了該鏡像,然後執行。看到下圖的內容,就表示docker安裝成功並運行了。
三、創建.NetCore項目
3.1 創建演示項目
這個沒什麼好說的,我們用vs2017創建一個演示用的mvc項目。program.cs文件做如下修改
3.2為項目編寫Dockerfile文件
有兩種方法,一種是右鍵點擊項目:添加-->Docker支持,創建Dockerfile文件;
每二種是直接在項目根目錄下手動創建該文件,Dockerfile文件的內容大致如下:
# 添加基礎鏡像:docker會從網路下載這個鏡像 FROM microsoft/dotnet:2-aspnetcore-runtime #容器中系統的工作空間 WORKDIR /app #拷貝當前文件夾下的文件到容器中系統的工作空間(註意:“.”後面有空格) COPY . /app #設置Docker容器對外暴露的埠 EXPOSE 8080 #容器中使用 ["dotnet","系統啟動的dll"] 來運行應用程式 #使用ENTRYPOINT ["dotnet","系統啟動的dll"] #或使用 CMD ["dotnet","系統啟動的dll"] ENTRYPOINT ["dotnet", "WebTest.dll"]
3.3 構建鏡像
下麵到了關鍵的一步了,構建項目鏡像,我們將上面創建的mvc項目進行發佈,然後將發佈後的文件上傳至CentOS伺服器,然後定位到站點文件夾,執行下麵的命令:
sudo docker build -t webtest:1.0 .
webtest是我們創建的鏡像名字,冒號後面的1.0可以理解為版本號,再後面是一個空格再加一個點,這個點表示當前路徑!!
看到Successfully,表示鏡像構建成功。
可以輸入命令docker images查看倉庫中的鏡像。
sudo docker images //查看所有鏡像 sudo docker ps //查看運行中的容器 sudo docker ps -a //查看所有容器 sudo docker rm 容器id //刪除容器 sudo docker rmi 鏡像id //刪除鏡像 sudo docker pull microsoft/aspnetcore:2 //拉取指定版本的core
3.4 運行鏡像
現在就差最後一步運行了,我們用下麵的命令運行剛剛創建的webtest鏡像,
這裡通過 -p 參數映射容器的8080到宿主機的8080埠:8080:8080(宿主:容器)
-d 參數告訴docker以後臺任務形式運行鏡像
sudo docker run -d -p 8080:8080 webtest:1.0
輸入命令docker ps查看運行中的容器,註意Status列,Up表示我們剛剛創建的容器正在運行
四、測試站點運行情況
在我們的windows中,瀏覽器輸入伺服器IP+埠號,可以看到站點已經跑起來了
OK,任務完成。
五、擴展docker相關知識
Docker的卸載,不打字了,直接截圖了:
配置鏡像加速
//因為預設的鏡像倉庫遠在國外,拉取一個小的鏡像時間還可以忍受,若拉取一個上G的鏡像就有點太折磨人了,我們使用DaoCloud鏡像加速器來進行鏡像加速。Linux上配置方法如下:
$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://37bb3af1.m.daocloud.io`
$ sudo systemctl restart docker
docker常用命令
docker pull 鏡像名稱 //拉取鏡像 docker rm -f 容器id //強制刪除容器 docker rmi imageid //刪除鏡像 docker logs -f 容器ID //查看容器日誌
docker stop $CONTAINER_ID //終止容器
docker ps -a //查看所有的容器 docker attach 容器id //進入到容器 docker build -t s2appadmin . //使用Dockerfile文件編譯Docker dotnet publish //發佈dotnetcore應用 dotnet run //啟動dotnetcore應用 dotnet *.dll //在發佈後的目錄中執行dotnet 程式集的dll文件名,啟動應用 nginx -v //查看nginx版本 nginx -s reload //重新載入nginx nginx -s stop //停止nginx