前言
“不對啊,在我這執行很正常啊”,這句話小夥伴們在前幾年應該聽得很多;每次一到安裝、部署時總有一堆問題,畢竟作業系統版本、軟體環境、硬體資源、網路等因素在作怪,此時難免會導致開發小夥伴和運維哥們互相甩鍋,其實很多時候與要部署的系統沒有太大關係。如果能減少差異化帶來的不和諧,同時還能提高工作效率,肯定是最好的解決方案;Docker的出現讓此類問題迎刃而解,即把應用程式、配置依賴等打包形成一個可交付的執行環境,直接啟動執行即可,當然不限於此,接下來就一起來學習和探究吧。
正文
1. 概述
1.1 Docker簡介
Docker 是一個開源的應用容器引擎,是用Go語言開發的。用於開發、交付和執行應用程式的開放平臺,能夠將應用程式與基礎設施分開,從而可以快速交付軟體。
看著Docker 的Logo圖,Docker就好比是下面的小鯨魚,上面裝滿的每個集裝箱(方塊)可以理解為容器,不管集裝箱裡面裝的什麼,統一按集裝箱的形式打包存放、運輸即可,集裝箱之間互不影響;即Docker不在乎容器裡的內容是什麼,統一基於容器這種形式進行標準化管理,容器之間相互隔離,所以Docker上執行的多個容器是相互不影響的。
Docker 從 17.03 版本之後分為 CE(Community Edition: 社群版) 和 EE(Enterprise Edition: 企業版),通常社群版足夠用了,功能強大,還免費。
1.2 Docker架構
Docker是客戶端/伺服器模式架構(C/S),Client(客戶端)和Docker daemon(守護程式)通訊, 後者接收到客戶端指令並執行。簡述上圖的三個流程:
- 客戶端(Client) 傳送docker build指令, 服務端(Docker daemon) 收到指令之後就執行,將對應檔案打包生成為映象(Images) ;
- 客戶端(Client) 傳送docker pull指令,服務端(Docker daemon) 收到指令之後就執行,從遠端倉儲中(Registry) 尋找映象(Images) ,並下載到Docker主機上(DOCKER_HOST) ,如果找不到就報錯;
- 客戶端(Client) 傳送docker run指令,服務端(Docker daemon) 收到指令之後就執行,先從本地查詢映象(Images) ,如果本地存在,直接通過映象啟動容器(Containers) 例項;如果本地沒有映象(Images),就會從遠端倉儲中(Registry)下載,然後再根據映象啟動容器(Containers) 例項,如果都沒找到,那就報錯。
上面只是用三關鍵指令大概描述了從客戶端到服務端的執行流程,其實還有很多指令,後續會專門整理文章分享。
上圖術語解釋及作用:
- Docker daemon(守護程式) :負責監聽客戶端發過來的指令請求,並管理Docker的各種物件,如映象(Images)、容器(Containers)、網路等。
- Client(客戶端) :使用者和Docker主機互動的主要方式,就是用來發指令請求的。
- 遠端倉儲(Registry) :用於各種映象的儲存,Docker Hub是最大的映象儲存庫,基本上平時能用到的映象都可以找到;為了提升拉取速度,可以指定國內的一些倉儲。
- 映象(Images) :是一個啟動容器(Containers) 的只讀模板; 比較容易理解的比喻:映象就是程式語言中的類(Class),容器就是通過類(Class) new出來的例項。
- 容器(Containers) :就是映象(Images) 可執行的例項。
1.3 Docker帶來的好處
- 開發更加敏捷: 讓開發人員可以自由定義環境,建立和部署的應用程式更快、更容易,運維人員快速應對變化也更加靈活性。
- 高可移植性和擴充套件性: Docker容器可以執行在各種裝置環境中,如開發電腦、虛擬機器、伺服器上等;根據業務需求,可實時擴充套件或拆除應用程式及相關服務;
- 充分利用硬體資源:Docker輕量級、啟動快,能共用公共服務,不像傳統的虛擬機器那樣,需要單獨虛擬出整個系統,佔用資源多,速度還不夠快。Docker容器之間相互隔離,互不衝突,所以同時可執行很多個容器,充分利用資源。
理論先說那麼多,主要是實操應用,用明白了,理論自然就清晰了。
2. 安裝
這裡安裝的主機環境是我之前的買的雲伺服器,系統為CentOS7,其他系統版本安裝會有差別,具體細節小夥伴可以參考官網(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-engine
2、安裝需要的依賴包
sudo yum install -y yum-utils
3、設定映象倉庫
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.io
6、啟動Docker
sudo systemctl start docker
7、測試Docker
sudo docker run hello-world # 執行Hello-world
以上步驟已經完成Docker的安裝,但由於拉取映象時是從國外下載,比較慢,所以通常我們會配置映象加速器,國內騰訊雲、阿里雲等都提供加速站點,這裡還是用阿里雲演示,因為有賬號。
3. 初體驗
安裝完成之後,這裡不急著往下說,先來體驗一下; 很方便的就將自己的專案打包然後執行,步驟如下:
-
準備一個專案
這裡就直接建立一個預設的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的檔案屬性為始終複製,如下:
以檔案系統的形式釋出專案,指定本地目錄,如下:
-
將釋出之後的檔案拷貝到裝有Docker的主機上
將專案進行釋出,把釋出之後的檔案拷貝到我的阿里雲伺服器上,用到的工具是FinalShell(一個工具完成連線伺服器和上傳檔案,很好用),如下:
-
打包為映象
進入釋出檔案目錄,執行
docker build
命令,將釋出檔案打包為一個映象,如下:上圖中的mydockerdemo 是映象名,可以自定義;通過
docker images
檢視映象是否生成,如下: -
根據映象啟動容器(裡面包含我們的專案)
映象生成之後,就可以通過
docker run
指令根據映象啟動容器了,即啟動我們的專案docker run -d --name mydockerdemo -p 9999:80 mydockerdemo
-d:後臺模式執行;
--name:給執行中的容器指定一個名字;
-p:指定埠對映, 主機的埠9999對映到容器的端80,因為在容器裡面我們的專案是以80 埠啟動的;
最後一個引數是上一步生成的映象名稱, 即根據此映象啟動一個容器例項。
-
測試訪問看看,只要配置了雲伺服器的安全組和防火牆放開9999埠,那麼外網就可以訪問了,如下:
可能有小夥伴說,也挺麻煩的; 其實編寫Dockerfile,打包映象等操作都是一次性的,只要生成了映象,後續其他環境直接根據映象啟動即可,不用再單獨安裝.NetCore執行時等基礎設施了,打包好的映象裡包含了完整的執行環境。
總結
這裡先初步瞭解Docker,並進行安裝和體驗,接下來的文章會把常用命令、Dockerfile、容器資料卷掛載、DockerCompose及DockerSwarm等相關知識依次說到。Docker已經成為必備技能,再不學習就Out了,關注“Code綜藝圈”,和我一起學習吧;