目錄
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網絡,提供網絡隔離能力。
參考博客: