參考文檔:html
https://docs.docker.com/install/linux/docker-ce/centos/linux
http://www.dockerinfo.net/documentnginx
https://dotnet.microsoft.com/download/linux-package-manager/centos/sdk-currentgit
http://www.javashuo.com/article/p-hpjsqqtr-ev.htmlgithub
http://www.javashuo.com/article/p-kkjokozm-cm.htmlweb
http://www.javashuo.com/article/p-bcicqkzx-bx.htmldocker
服務器系統:CentOS Linux release 7.2.1511windows
相關工具:VS2017 xftp puttycentos
服務器軟件:.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 在以下幾個方面具備較大的優點。
一、更快速的交付和部署
對開發和運維(devop)人員來講,最但願的就是一次建立或配置,能夠在任意地方正常運行。
開發者可使用一個標準的鏡像來構建一套開發容器,開發完成以後,運維人員能夠直接使用這個容器來部署代碼。 Docker 能夠快速建立容器,快速迭代應用程序,並讓整個過程全程可見,使團隊中的其餘成員更容易理解應用程序是如何建立和工做的。 Docker 容器很輕很快!容器的啓動時間是秒級的,大量地節約開發、測試、部署的時間。
二、更高效的虛擬化
Docker 容器的運行不須要額外的 hypervisor 支持,它是內核級的虛擬化,所以能夠實現更高的性能和效率。
三、更輕鬆的遷移和擴展
Docker 容器幾乎能夠在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、我的電腦、服務器等。 這種兼容性可讓用戶把一個應用程序從一個平臺直接遷移到另一個。
四、更簡單的管理
使用 Docker,只須要小小的修改,就能夠替代以往大量的更新工做。全部的修改都以增量的方式被分發和更新,從而實現自動化而且高效的管理。
若是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
在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安裝成功並運行了。
這個沒什麼好說的,咱們用vs2017建立一個演示用的mvc項目。program.cs文件作以下修改
有兩種方法,一種是右鍵點擊項目:添加-->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"]
下面到了關鍵的一步了,構建項目鏡像,咱們將上面建立的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
如今就差最後一步運行了,咱們用下面的命令運行剛剛建立的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的卸載,不打字了,直接截圖了:
配置鏡像加速
//由於默認的鏡像倉庫遠在國外,拉取一個小的鏡像時間還能夠忍受,若拉取一個上G的鏡像就有點太折磨人了,咱們使用DaoCloud鏡像加速器來進行鏡像加速。Linux上配置方法以下:
$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io $ sudo systemctl restart docker
若是服務器重啓reboot,你會發現站點隨即掛掉了,由於容器也自動退出,若是想讓服務器重啓後容器內的鏡像自動啓動,能夠在運行docker容器時,加上下面的命令:
docker run --restart=always -d -p 8080:8080 webtest:1.0
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 exec -it 容器id /bin/bash
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