Centos7系統Docker環境下運行Netcore

目錄

0.Docker簡介

1.Docker安裝

2.發佈NETCore項目

3.Docker環境下運行Netcore項目


0.Docker簡介

Docker是用Go語言編寫基於Linux操作系統的一些特性開發的,其提供了操作系統級別的抽象,是一種容器管理技術,它隔離了應用程序對基礎架構(操作系統等)的依賴。相較於虛擬機而言,Docker共享的是宿主機的硬件資源,使用容器來提供獨立的運行環境來運行應用。虛擬機則是基於Supervisor(虛擬機管理程序)使用虛擬化技術來提供隔離的虛擬機,在虛擬機的操作系統上提供運行環境!雖然兩者都提供了很好的資源隔離,但很明顯Docker的虛擬化開銷更低! 
Docker涉及了三個核心概念:Register、Image、Container。

1.Registry:倉庫。用來存儲Docker鏡像,比如Docker官方的Docker Hub就是一個公開的倉庫,在上面我們可以下載我們需要的鏡像。
2.Image:鏡像。開發人員創建一個應用程序或服務,並將它及其依賴關係打包到一個容器鏡像中。鏡像是應用程序的配置及其依賴關係的靜態形式。
3.Container:容器。Container是鏡像的運行實例,它是一個隔離的、資源受控的可移植的運行時環境,其中包含操作系統、需要運行的程序、運行程序的相關依賴、環境變量等。

它們三者的相互作用關係是:

當我們執行Docker pull或Docker run命令時,若本地無所需的鏡像,那麼將會從倉庫(一般爲DockerHub)下載(pull)一個鏡像。Docker執行run方法得到一個容器,用戶在容器裏執行各種操作。Docker執行commit方法將一個容器轉化爲鏡像。Docker利用login、push等命令將本地鏡像推送(push)到倉庫。其他機器或服務器上就可以使用該鏡像去生成容器,進而運行相應的應用程序。

Docker一些常用的指令

打包鏡像:docker build -t <鏡像名稱> <路徑>
查看鏡像:docker images
刪除鏡像:docker rmi <鏡像id>
查看容器:docker ps
創建容器:docker run -d -p <主機端口號>:<容器端口號> <鏡像名稱>
停止容器:docker stop <容器id>
停止所有容器:docker stop $(docker ps -a -q)
刪除所有容器:docker rm $(docker ps -a -q)
刪除容器:docker rm <容器id>
進入容器:docker exec -it <容器id> /bin/bash
導出鏡像:docker save > <導出文件名.tar> <鏡像名稱>
導入鏡像:docker load < <導入文件名>

1.Docker安裝

Docker 要求 CentOS 系統的內核版本高於 3.10 ,查看本頁面的前提條件來驗證你的CentOS 版本是否支持 Docker 。

在Centos 7系統下執行:

1.通過 uname -r 命令查看你當前的內核版本

uname -r

2.更新下yum包,更新到最新

sudo yum update

3.卸載舊版本(如果安裝過舊版本的話)

sudo yum remove docker  docker-common docker-selinux docker-engine

4.安裝需要的軟件包, yum-util 提供yum-config-manager功能,另外兩個是devicemapper驅動依賴的

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

5.添加軟件源信息

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

6.更新yum緩存

sudo yum makecache fast

7.安裝docker最新版

sudo yum -y install docker-ce

8.啓動docker服務

sudo systemctl start docker

9.設置docker開機啓動

sudo systemctl enable docker

10.驗證安裝是否成功(有client和service兩部分表示docker安裝啓動都成功了)

docker version

2.發佈NETCore項目

在Window下的VS 2017執行:

1.新建一個netcore項目:選擇ASP.NET CORE Web應用程序,把爲HTTPS配置勾掉,不然的話後面訪問5000端口會轉發到HTTPS協議的5001端口,docker去運行項目時會報“docker curl: (56) Recv failure: Connection reset by peer”。

2.新建後是一個空的項目,主要是做測試用的,所以直接編譯發佈。

3.發佈後進入發佈目錄,創建一個命名爲Dockerfile文件,注意該文件沒有擴展名,不是txt的文件。編輯該文件,寫入以下指令

FROM microsoft/dotnet:latest
WORKDIR /app
COPY . /app
EXPOSE 5000
ENV ASPNETCORE_URLS http://*:5000
ENTRYPOINT ["dotnet","DockerWeb.dll"]

解釋下以上指令的含義:

使用FROM指定容器使用的鏡像
使用WORKDIR指定容器工作目錄
使用COPY指令,複製當前目錄(其中.即代表當前目錄)到容器中的/app目錄下
使用EXPOSE指定容器暴露的端口號
使用ENV指定環境參數,上面用來告訴.NETCore項目在所有網絡接口上監聽5000端口
使用ENTRYPOINT制定容器的入口點,我項目命名爲DockerWeb,所以執行的是DockerWeb.dll文件,查看自己發佈的目錄對應應該執行哪個文件。

4.保存退出,將該發佈項目拷貝到CentOS7系統裏的任意位置。我的目錄是/root/Documents/DockerWeb。

3.Docker環境下運行Netcore項目

回到CentOS7系統下,我們已經安裝了Docker,也有Netcore項目了,但是我們想要在Dcoker環境下運行Netcore還需要dotnet鏡像。

1.dotnet鏡像可以從Docker鏡像倉庫拉取,但是默認的鏡像倉庫遠在國外,我們需要使用DaoCloud鏡像加速器來進行鏡像加速。配置方法如下:

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://37bb3af1.m.daocloud.io
#在重啓下docker
systemctl restart docker

2.配置完畢後執行以下指令拉取dotnet鏡像,安裝完畢後執行docker images可以看到本地已經包含了microsoft/dotnet鏡像。

docker pull microsoft/dotnet

3.下面我們將發佈的項目打包成鏡像以分發部署。使用docker build -t <name> <path>指令打包鏡像,name一定要是小寫否則報錯。

docker build -t dockerweb /root/Documents/DockerWeb

4.最後執行以下指令運行項目

docker run -d -p 80:5000 dockerweb

5.可以用curl指令來測試是否運行成功

curl http://localhost

如果報以下錯誤:

docker curl: (56) Recv failure: Connection reset by peer

這個可能是端口映射的問題,那麼第4部可以嘗試用以下指令:

docker run -d --net="host"  --privileged=true -p 5000:5000 dockerweb
curl http://localhost:5000

--privileged參數表示Docker將擁有訪問主機所有設備的權限,同時Docker也會在apparmor或者selinux做一些設置,使容器可以容易的訪問那些運行在容器外部的設備。

--net表示容器的網絡模式,docker容器有5種網絡模式

1)bridge模式,--net=bridge(默認)
這是dokcer網絡的默認設置,爲容器創建獨立的網絡命名空間,容器具有獨立的網卡等所有單獨的網絡棧,是最常用的使用方式。
在docker run啓動容器的時候,如果不加--net參數,就默認採用這種網絡模式。安裝完docker,系統會自動添加一個供docker使用的網橋docker0,我們創建一個新的容器時,
容器通過DHCP獲取一個與docker0同網段的IP地址,並默認連接到docker0網橋,以此實現容器與宿主機的網絡互通。

2)host模式,--net=host
這個模式下創建出來的容器,直接使用容器宿主機的網絡命名空間。
將不擁有自己獨立的Network Namespace,即沒有獨立的網絡環境。它使用宿主機的ip和端口。
 
3)none模式,--net=none
爲容器創建獨立網絡命名空間,但不爲它做任何網絡配置,容器中只有lo,用戶可以在此基礎上,對容器網絡做任意定製。
這個模式下,dokcer不爲容器進行任何網絡配置。需要我們自己爲容器添加網卡,配置IP。
因此,若想使用pipework配置docker容器的ip地址,必須要在none模式下才可以。

4)其他容器模式(即container模式),--net=container:NAME_or_ID
與host模式類似,只是容器將與指定的容器共享網絡命名空間。
這個模式就是指定一個已有的容器,共享該容器的IP和端口。除了網絡方面兩個容器共享,其他的如文件系統,進程等還是隔離開的。

5)用戶自定義:docker 1.9版本以後新增的特性,允許容器使用第三方的網絡實現或者創建單獨的bridge網絡,提供網絡隔離能力。

參考博客:

docker容器的網絡配置,允許docker可以被宿主機以外的其它主機訪問以及局域網內可以直接訪問docker容器ip

.NET Core容器化(Docker)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章