Docker介紹(引用自https://www.runoob.com/docker/docker-tutorial.html)
Docker 是一個開源的應用容器引擎,基於 Go 語言 並遵從 Apache2.0 協議開源。
Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。
容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。Docker容器實際上是Docker鏡像的“運行實例”。
Docker 從 17.03 版本之后分為 CE(Community Edition: 社區版) 和 EE(Enterprise Edition: 企業版),我們這里用社區版(即docker -ce)。
准備系統和工具
centos7.8、Xftp6、Xshell6、VMware Workstation Pro 15
備注:Xftp6和Xshell6官方有個人版,不收費。下載地址:https://www.netsarang.com/en/free-for-home-school/
-
首先在VM中安裝一個centos7.8的虛擬機,賬號root,密碼123456 ,網絡選擇橋接方式。(后續操作都是基於root賬號,如果是非root賬號,請在命令前加上sudo ,如:sudo yum update)
-
開啟虛擬機,並輸入賬號密碼登錄后首先更新linux系統
命令: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 #永久生效,沒有此參數重啟后失效
關閉5000端口
命令:firewall-cmd --remove-port=5000/tcp --zone=public --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端口,大家避免踩坑。