Docker介紹(引用自https://www.runoob.com/docker/docker-tutorial.html)html
Docker 是一個開源的應用容器引擎,基於 Go 語言 並聽從 Apache2.0 協議開源。linux
Docker 可讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,而後發佈到任何流行的 Linux 機器上,也能夠實現虛擬化。web
容器是徹底使用沙箱機制,相互之間不會有任何接口(相似 iPhone 的 app),更重要的是容器性能開銷極低。Docker容器其實是Docker鏡像的「運行實例」。docker
Docker 從 17.03 版本以後分爲 CE(Community Edition: 社區版) 和 EE(Enterprise Edition: 企業版),咱們這裏用社區版(即docker -ce)。shell
準備系統和工具centos
centos7.八、Xftp六、Xshell六、VMware Workstation Pro 15api
備註:Xftp6和Xshell6官方有我的版,不收費。下載地址:https://www.netsarang.com/en/free-for-home-school/瀏覽器
-
首先在VM中安裝一個centos7.8的虛擬機,帳號root,密碼123456 ,網絡選擇橋接方式。(後續操做都是基於root帳號,若是是非root帳號,請在命令前加上sudo ,如:sudo yum update)網絡
-
開啓虛擬機,並輸入帳號密碼登陸後首先更新linux系統app
命令:yum update
提示選擇【y/n】時輸入y便可
看到Complete!表示更新完成
-
查看虛擬機IP地址
命令:ip addr
-
爲了操做更加方便,也符合實際應用場景,咱們使用xshell6登陸到虛擬機。
用戶身份驗證選擇密碼驗證,並輸入帳號和虛擬機密碼
點擊連接後彈出以下提示,選擇-接受並保存(下次就不會再要求輸入密碼了)
成功登陸到虛擬機
接下來在centos7系統中安裝docker
-
爲了方便添加軟件源,支持 devicemapper 存儲類型,安裝以下軟件包(\分割多條命令)
命令:yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
執行結果以下:
-
添加 yum 軟件源,添加 Docker 穩定版本的 yum 軟件源
命令:yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
此處執行結果以下:
-
安裝docker-ce
命令:yum install docker-ce
這裏會下載docker安裝包,根據網速不一樣,須要的時間不一樣,耐心等待,提示【y/d/n】時輸入y
輸入y繼續下載包文件
網速太慢,等的我N急,讓他繼續下載……,我去上個廁所,稍後回來
終於安裝好了,以下圖:
-
默認的 docker 組是沒有用戶的(也就是說須要使用 sudo 才能使用 docker 命令)。
您能夠將用戶添加到 docker 組中(此用戶就能夠直接使用 docker 命令了),將root用戶加入docker組
命令:usermod -aG docker root
-
設置docker開機啓動
命令:systemctl enable docker
-
啓動docker
命令:systemctl start docker
-
中止docker
命令:systemctl stop docker
-
更新docker -ce
命令:yum update docker-ce
-
再次啓動docker
命令:systemctl start docker
-
查看docker信息
命令:docker info
咱們的docker版本爲19.03.9,尚未容器運行(還沒啓動),若是docker沒啓動的話,執行docker info會返回錯誤信息,具體本身試驗下。
-
卸載docker(根據須要執行)
命令:yum remove docker-ce
-
刪除本地docker文件(docker 的本地文件,包括鏡像(images), 容器(containers), 存儲卷(volumes)等,都須要手工刪除。默認目錄存儲在 /var/lib/docker)
命令:rm -rf /var/lib/docker
-
檢查docker是否能夠正常運行(運行hello-world鏡像,若是本機沒有hello-world鏡像,系統會自動拉取hello-world鏡像)
命令:docker run hello-world
上圖提示沒有找到hello-world鏡像,稍後會自動拉取該鏡像。
拉取成功後,再次執行docker run hello-world 以下圖:
看到Hello from Docker!表示,docker運行正常
-
下載微軟官方推薦的基礎鏡像(搭建了.NET CORE 3.1運行環境)
命令:docker pull mcr.microsoft.com/dotnet/core/aspnet:3.1
-
查看本地的鏡像
命令:docker images
如今有mcr.microsoft.com/dotnet/core/aspnet:3.1 和 hello-world兩個鏡像
-
建立一個.net core3.1的webapi項目,名稱爲OrderApp,並添加一個控制器,添加一個get接口
在Program中指定端口爲5000
發佈爲文件(部署模式爲框架依賴,由於鏡像中已經包含了運行環境)
-
使用xftp6工具連接到虛擬機(協議選擇SFTP)
-
咱們在虛擬機中建立一個咱們本身的目錄,用來構建docker鏡像時使用
命令:mkdir data
mkdir data命令是在當前目錄(我這裏是根目錄)建立data目錄,而後cd到data目錄中,在data目錄下建立一個docker目錄,在docker目錄下新建app目錄
目錄結構爲:/data/docker/app
-
我這裏是使用Dokerfile方式構建鏡像,因此咱們要添加一個Dokerfile文件
打開Dockerfile文件內容爲:
咱們將Dockerfile文件的內容替換爲:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
MAINTAINER PDF
LABEL description="orderservice webapi"
LABEL version="1.0"
WORKDIR /app
COPY . .
EXPOSE 5000
ENV ASPNETCORE_ENVIRONMENT Production
ENTRYPOINT ["dotnet","OrderApp.dll"]
替換後爲:
內容說明:
FROM 基於那個鏡像來構建新的鏡像
MAINTAINER 鏡像構建者是誰
LABEL 用來添加備註信息,以便之後能夠查看這個鏡像的信息
WORKDIR 鏡像的工做目錄(這裏的工做目錄爲app目錄)
COPY 複製文件(將Dockerfile文件所在的當前目錄下的文件複製到鏡像中的工做目錄中)
EXPOSE 容器要開放的端口(咱們用.NET CORE默認的5000端口)
ENV 設置環境變量(咱們設置ASPNETCORE_ENVIRONMENT變量值爲Production)
ENTRYPOINT 爲容器啓動後要執行的命令 (這裏將執行dotnet OrderApp.dll命令)
-
咱們用Xftp6將Dockerfile文件和發佈後的.NET CORE項目文件上傳到虛擬機的/data/docker/app目錄中
上傳後:
-
虛擬機防火牆打開5000端口(若是沒安裝防火牆須要先安裝防火牆 )
防火牆經常使用相關命令:
安裝:yum install firewalld
啓動: systemctl start firewalld
關閉: systemctl stop firewalld
查看狀態: systemctl status firewalld
開機禁用 : systemctl disable firewalld
開機啓用 : systemctl enable firewalld
開放5000端口
命令:firewall-cmd --add-port=5000/tcp --zone=public --permanent
(--permanent表示永久開放5000端口,不然重啓防火牆後,5000端口將被關閉)
命令含義:
–zone #做用域
–add-port=5000/tcp #添加端口,格式爲:端口/通信協議
–permanent #永久生效,沒有此參數重啓後失效
重啓防火牆
命令:firewall-cmd --reload
查看防火牆狀態:
命令:systemctl status firewalld
查看防火牆已經開放的端口
命令:firewall-cmd --list-all
能夠看到,咱們已經開放了5000端口
-
構建docker鏡像
進入/data/docker/app文件夾下(ls命令爲查看目錄中全部文件)
構建名稱爲pdf/orderserviec,版本號爲V1的鏡像(警告:命令末尾有個空格和.號)
命令:docker build -t pdf/orderapp .
查看當前系統中已有的鏡像
命令:docker images
建立並運行容器
命令:docker run -d -p 5000:5000 pdf/orderapp
命令說明:
-d 之後臺模式運行(和服務等效)
-p 將容器的5000端口映射到主機的5000端口(主機端口:容器端口,若不指定則將容器的80端口映射到主機隨機端口)
查看docker運行日誌
命令:docker logs confident_hodgkin
這裏咱們看到容器運行後正在監聽5000端口
說明:confident_hodgkin爲docker容器名稱,用docker run 命令建立的容器,名稱是隨機生成的,若是要指定容器名稱,可使用docker run --name 命令來建立容器。(強烈建議指定容器名稱,不然會增長維護難度)
命令:docker run --name pdf_orderapp_client1 -d -p 5000:5000 pdf/orderapp
命令說明:
--name 指定容器名稱(我這裏指定的名稱爲pdf_orderapp_client1)
訪問5000端口
咱們再運行一個容器,用虛擬機的4999端口來訪問
命令:docker run -d -p 4999:5000 pdf/orderapp
訪問4999端口
這樣,咱們就能夠在一臺虛擬機中或物理機中建立不少個獨立運行的容器了。
最後:
更多docker命令學習請參考:https://www.runoob.com/docker/docker-command-manual.html
小插曲:
一開始我使用主機的6000端口映射到容器的5000端口,而firefox和google瀏覽器不容許訪問6000端口,你們避免踩坑。