Docker小白到实战之开篇概述
前言
“不對啊,在我這運行很正常啊”,這句話小伙伴們在前幾年應該聽得很多;每次一到安裝、部署時總有一堆問題,畢竟操作系統(tǒng)版本、軟件環(huán)境、硬件資源、網(wǎng)絡等因素在作怪,此時難免會導致開發(fā)小伙伴和運維哥們互相甩鍋,其實很多時候與要部署的系統(tǒng)沒有太大關系。如果能減少差異化帶來的不和諧,同時還能提高工作效率,肯定是最好的解決方案;Docker的出現(xiàn)讓此類問題迎刃而解,即把應用程序、配置依賴等打包形成一個可交付的運行環(huán)境,直接啟動運行即可,當然不限于此,接下來就一起來學習和探究吧。
正文
1. 概述
1.1 Docker簡介
Docker 是一個開源的應用容器引擎,是用Go語言開發(fā)的。用于開發(fā)、交付和運行應用程序的開放平臺,能夠將應用程序與基礎設施分開,從而可以快速交付軟件。
看看Docker 的Logo圖
image-20210814101505393,Docker就好比是下面的小鯨魚,上面裝滿的每個集裝箱(方塊)可以理解為容器,不管集裝箱里面裝的什么,統(tǒng)一按集裝箱的形式打包存放、運輸即可,集裝箱之間互不影響;即Docker不在乎容器里的內容是什么,統(tǒng)一基于容器這種形式進行標準化管理,容器之間相互隔離,所以Docker上運行的多個容器是相互不影響的。Docker 從 17.03 版本之后分為 CE(Community Edition: 社區(qū)版) 和 EE(Enterprise Edition: 企業(yè)版),通常社區(qū)版足夠用了,功能強大,還免費。
1.2 Docker架構
Docker Architecture DiagramDocker是客戶端/服務器模式架構(C/S),Client(客戶端)和Docker daemon(守護進程)通信, 后者接收到客戶端指令并執(zhí)行。簡述上圖的三個流程:
客戶端(Client) 發(fā)送docker build指令, 服務端(Docker daemon) 收到指令之后就執(zhí)行,將對應文件打包生成為鏡像(Images) ;
客戶端(Client) 發(fā)送docker pull指令,服務端(Docker daemon) 收到指令之后就執(zhí)行,從遠程倉儲中(Registry) 尋找鏡像(Images) ,并下載到Docker主機上(DOCKER_HOST) ,如果找不到就報錯;
客戶端(Client) 發(fā)送docker run指令,服務端(Docker daemon) 收到指令之后就執(zhí)行,先從本地查找鏡像(Images) ,如果本地存在,直接通過鏡像啟動容器(Containers) 實例;如果本地沒有鏡像(Images),就會從遠程倉儲中(Registry)下載,然后再根據(jù)鏡像啟動容器(Containers) 實例,如果都沒找到,那就報錯。
上面只是用三關鍵指令大概描述了從客戶端到服務端的執(zhí)行流程,其實還有很多指令,后續(xù)會專門整理文章分享。
上圖術語解釋及作用:
Docker daemon(守護進程) :負責監(jiān)聽客戶端發(fā)過來的指令請求,并管理Docker的各種對象,如鏡像(Images)、容器(Containers)、網(wǎng)絡等。
Client(客戶端) :用戶和Docker主機交互的主要方式,就是用來發(fā)指令請求的。
遠程倉儲(Registry) :用于各種鏡像的存儲,Docker Hub是最大的鏡像存儲庫,基本上平時能用到的鏡像都可以找到;為了提升拉取速度,可以指定國內的一些倉儲。
鏡像(Images) :是一個啟動容器(Containers) 的只讀模板;比較容易理解的比喻:鏡像就是編程語言中的類(Class),容器就是通過類(Class) new出來的實例。
容器(Containers) :就是鏡像(Images) 可運行的實例。
1.3 Docker帶來的好處
開發(fā)更加敏捷: 讓開發(fā)人員可以自由定義環(huán)境,創(chuàng)建和部署的應用程序更快、更容易,運維人員快速應對變化也更加靈活性。
高可移植性和擴展性: Docker容器可以運行在各種設備環(huán)境中,如開發(fā)電腦、虛擬機、服務器上等;根據(jù)業(yè)務需求,可實時擴展或拆除應用程序及相關服務;
充分利用硬件資源:Docker輕量級、啟動快,能共用公共服務,不像傳統(tǒng)的虛擬機那樣,需要單獨虛擬出整個系統(tǒng),占用資源多,速度還不夠快。Docker容器之間相互隔離,互不沖突,所以同時可運行很多個容器,充分利用資源。
理論先說那么多,主要是實操應用,用明白了,理論自然就清晰了。
2. 安裝
這里安裝的主機環(huán)境是我之前的買的云服務器,系統(tǒng)為CentOS7,其他系統(tǒng)版本安裝會有差別,具體細節(jié)小伙伴可以參考官網(wǎng)(https://docs.docker.com/get-docker/),里面步驟都很詳細。
1、移除移動舊版本
???sudo?yum?remove?docker?\docker-client?\docker-client-latest?\docker-common?\docker-latest?\docker-latest-logrotate?\docker-logrotate?\docker-engine2、安裝需要的依賴包
???sudo?yum?install?-y?yum-utils3、設置鏡像倉庫
???sudo?yum-config-manager?\--add-repo?\https://download.docker.com/linux/centos/docker-ce.repo??4、更新Yum軟件包索引
???sudo?yum?makecache?fast?#?提高安裝速度5、開始安裝Docker
???sudo?yum?install?docker-ce?docker-ce-cli?containerd.io6、啟動Docker
???sudo?systemctl?start?docker7、測試Docker
???sudo?docker?run?hello-world?#?運行Hello-world 安裝成功以上步驟已經(jīng)完成Docker的安裝,但由于拉取鏡像時是從國外下載,比較慢,所以通常我們會配置鏡像加速器,國內騰訊云、阿里云等都提供加速站點,這里還是用阿里云演示,因為有賬號。
配置鏡像加速器3. 初體驗
安裝完成之后,這里不急著往下說,先來體驗一下;很方便的就將自己的項目打包然后運行,步驟如下:
準備一個項目
這里就直接創(chuàng)建一個默認的API項目(基于.NetCore3.1)即可,什么都不做。
編寫Dockerfile
在項目根目錄下增加一個Dockerfile文件,里面內容如下:
具體內容如下
FROM?mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim WORKDIR?/app COPY?.?. EXPOSE?80 ENTRYPOINT?["dotnet",?"DockerDemo.dll"]設置Dockerfile的文件屬性為始終復制,如下:
以文件系統(tǒng)的形式發(fā)布項目,指定本地目錄,如下:
將發(fā)布之后的文件拷貝到裝有Docker的主機上
將項目進行發(fā)布,把發(fā)布之后的文件拷貝到我的阿里云服務器上,用到的工具是FinalShell(一個工具完成連接服務器和上傳文件,很好用),如下:
打包為鏡像
進入發(fā)布文件目錄,執(zhí)行docker build命令,將發(fā)布文件打包為一個鏡像,如下:
上圖中的mydockerdemo 是鏡像名,可以自定義;通過docker images查看鏡像是否生成,如下:
根據(jù)鏡像啟動容器(里面包含我們的項目)
鏡像生成之后,就可以通過docker run指令根據(jù)鏡像啟動容器了,即啟動我們的項目
docker?run?-d?--name?mydockerdemo?-p?9999:80?mydockerdemo-d:后臺模式運行;
--name:給運行中的容器指定一個名字;
-p:指定端口映射, 主機的端口9999映射到容器的端80,因為在容器里面我們的項目是以80 端口啟動的;
最后一個參數(shù)是上一步生成的鏡像名稱, 即根據(jù)此鏡像啟動一個容器實例。
測試訪問看看,只要配置了云服務器的安全組和防火墻放開9999端口,那么外網(wǎng)就可以訪問了,如下:
可能有小伙伴說,也挺麻煩的;其實編寫Dockerfile,打包鏡像等操作都是一次性的,只要生成了鏡像,后續(xù)其他環(huán)境直接根據(jù)鏡像啟動即可,不用再單獨安裝.NetCore運行時等基礎設施了,打包好的鏡像里包含了完整的運行環(huán)境。
總結
這里先初步了解Docker,并進行安裝和體驗,接下來的文章會把常用命令、Dockerfile、容器數(shù)據(jù)卷掛載、DockerCompose及DockerSwarm等相關知識依次說到。Docker已經(jīng)成為必備技能,再不學習就Out了,關注“Code綜藝圈”,和我一起學習吧;
圖片\
總結
以上是生活随笔為你收集整理的Docker小白到实战之开篇概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 10 完整特性介绍
- 下一篇: 如何摆脱「自我否定」状态