摘要:最近在學(xué)習(xí),并用重新部署了項(xiàng)目,使用后確實(shí)大幅度地降低了部署難度。如果,內(nèi)存,硬盤不夠,只能加物理設(shè)備,但這個(gè)是有上限的。虛擬化時(shí)代為了解決物理設(shè)備的諸多問題,出現(xiàn)了虛擬機(jī)。全手動部署編寫文件。一鍵啟動,確保已安裝。
最近在學(xué)習(xí) Docker,并用 Docker 重新部署了cdfang-spider項(xiàng)目,使用 docker 后確實(shí)大幅度地降低了部署難度。如果你也想用 Docker 來部署自己的項(xiàng)目,那就讓我們一起往下看。
本文通過以下 3 個(gè)方面來聊聊 Docker:
Docker 發(fā)展史。
Docker 基礎(chǔ)。
Docker 項(xiàng)目實(shí)戰(zhàn)。
Docker 發(fā)展史 上古時(shí)代在很久以前,發(fā)布一個(gè) App 應(yīng)用,應(yīng)該是這樣的。首先購買一臺物理服務(wù)器,然后手動安裝對應(yīng)的操作系統(tǒng),搭建 App 應(yīng)用運(yùn)行環(huán)境,部署 App 應(yīng)用,最后才能被其他人訪問。這樣做看似沒毛病,但可能會造成幾個(gè)問題:
部署非常慢。
購買物理服務(wù)器到收貨需要時(shí)間。
手動安裝操作系統(tǒng)需要時(shí)間。
安裝 App 應(yīng)用以及對應(yīng)的環(huán)境需要時(shí)間。
成本非常高。
物理服務(wù)器很貴。
資源浪費(fèi)。
如果項(xiàng)目很小,不能充分利用這臺服務(wù)器的資源。
難于遷移和擴(kuò)展。
如果 CPU,內(nèi)存,硬盤不夠,只能加物理設(shè)備,但這個(gè)是有上限的。
可能會被限定硬件廠商。
虛擬化時(shí)代為了解決物理設(shè)備的諸多問題,出現(xiàn)了虛擬機(jī)。虛擬機(jī)出現(xiàn)之后大大地降低了部署難度,要想部署一個(gè)應(yīng)用程序,新建一個(gè)虛擬機(jī)就可以了,還可以根據(jù)應(yīng)用程序的大小,分配合適的系統(tǒng)資源。
虛擬技術(shù)有以下幾個(gè)特點(diǎn):
一個(gè)物理機(jī)的資源分配到了不同的虛擬機(jī)里。
很容易擴(kuò)展,加物理機(jī) / 虛擬機(jī)。
很容易云化,阿里云,AWS 等。
虛擬化技術(shù)實(shí)現(xiàn)了物理層的隔離,但卻還有以下問題:
每一個(gè)虛擬機(jī)都是一個(gè)完整的操作系統(tǒng),每次新建都得手動安裝一遍。
虛擬機(jī)中的項(xiàng)目環(huán)境每次也需要重新安裝。
虛擬機(jī)本身消耗的系統(tǒng)資源也比較多。
容器化時(shí)代為了更方便的部署項(xiàng)目,出現(xiàn)了容器化技術(shù),主要有以下幾個(gè)特點(diǎn):
實(shí)現(xiàn)應(yīng)用程序及其環(huán)境打包。
實(shí)現(xiàn)應(yīng)用之間相互隔離、共享同一個(gè)操作系統(tǒng)內(nèi)核。
容器本身比較輕,相比虛擬機(jī),占用的系統(tǒng)資源更少。
Docker 是容器化技術(shù)的一種,也是最流行的一個(gè)。Docker 提供了一種隔離機(jī)制,它將不同應(yīng)用程序的依賴項(xiàng)和庫打包在一起,運(yùn)行在不同的容器中,從而實(shí)現(xiàn)應(yīng)用層的隔離。
容器化技術(shù)大都是基于 Linux 內(nèi)核提供的兩個(gè)機(jī)制:Cgroups(實(shí)現(xiàn)資源按需分配)和 Namespace(實(shí)現(xiàn)任務(wù)隔離)。虛擬化 vs 容器化
虛擬化和容器化都是目前主流的的部署技術(shù),兩者之間的差別如下:
虛擬機(jī)技術(shù)已經(jīng)發(fā)展了很多年,配套技術(shù)和標(biāo)準(zhǔn)都已經(jīng)標(biāo)準(zhǔn)化了,而容器最近幾年才興起,配套技術(shù)和標(biāo)準(zhǔn)還在完善中。
虛擬機(jī)由于有 GuestOS(虛擬機(jī)操作系統(tǒng)) 存在,可以和宿主機(jī)運(yùn)行不同 OS,而容器只能支持和宿主機(jī)內(nèi)核相同的操作系統(tǒng),隔離性相對較差。
容器比虛擬機(jī)明顯更輕量級,對宿主機(jī)操作系統(tǒng)而言,容器就跟一個(gè)進(jìn)程差不多。因此容器有著更快的啟動速度、更方便的集群管理等優(yōu)點(diǎn)。同時(shí)由于沒有 GuestOS 存在,在容器中運(yùn)行應(yīng)用和直接在宿主機(jī)上幾乎沒有性能損失,性能上優(yōu)于虛擬機(jī)。
Docker 基礎(chǔ)Docker 的核心是在 Docker Engine 層實(shí)現(xiàn)應(yīng)用層的隔離。
Docker 分層 |
---|
Application(應(yīng)用層) |
Container(容器層) |
Docker Engine (隔離層) |
Host OS 操作系統(tǒng) |
infrastructure(基礎(chǔ)設(shè)施) |
Docker 分為 Client 和 Server 兩個(gè)部分,我們在 Client 中執(zhí)行 Docker 命令,最后創(chuàng)建的 Container 和 Image 則會在 Server 中運(yùn)行。Dcoker 架構(gòu)如下圖所示:
ImageImage 主要用來打包應(yīng)用程序以及它的依賴環(huán)境,為 Container 提供必要的環(huán)境以及安裝好的應(yīng)用程序。Image 本身并不能執(zhí)行,只能通過 Container 去運(yùn)行。
Image 主要有以下幾點(diǎn)特征:
文件和 meta data 的集合(root filesystem)。
分層的,并且每一層都可以添加改變刪除文件,成為一個(gè)新的 Image。
不同 Image 可以共享相同的底層。
Image 本身是只讀的。
Image 可以通過 Dockerfile 去構(gòu)建,也可以通過 DockerHub 上去拉取。
ContainerContainer 是運(yùn)行 Image 的實(shí)例,通過 docker run image即可啟動并運(yùn)行一個(gè) Container。
Container 主要有以下幾點(diǎn)特征:
通過 Image 創(chuàng)建。
在 Image 之上建立一個(gè) Container 層(可讀寫)。
類比面向?qū)ο螅侯?Image) 和實(shí)例(Container)。
Image 負(fù)責(zé) App 的存儲和分發(fā),Container 負(fù)責(zé)運(yùn)行 App。
Networks使用 Dcoker 部署項(xiàng)目常常會生成很多個(gè)容器,這些容器默認(rèn)只能通過 ip 地址進(jìn)行訪問,但新建一個(gè)容器所產(chǎn)生的 ip 地址是不可控的,這就給容器之間通信帶來了一定的麻煩。Docker 中使用 Network 來管理容器之間的通信,只要兩個(gè) Conteiner 處于同一個(gè) Network 之中,就可以通過容器名去互相通信。
Docker 中內(nèi)置 5 中類型的 Network :
bridge(相同 bridge 中的 container 可以相互訪問)。
host(將 container 與宿主機(jī)的網(wǎng)絡(luò)相連通,雖然很直接,但是卻破獲了 container 的隔離性)。
none 禁用所有網(wǎng)絡(luò)。
overlay 集群使用。
macvlan。
除了這 5 中 Network 之外,用戶也可以自定義編寫 Network Plugin。
Docker ComposeDocker Compose 是一個(gè)工具,這個(gè)工具可以通過一個(gè) yml 文件定義多容器的 Docker 應(yīng)用。通過一條命令就可以根據(jù) yml 文件的定義去創(chuàng)建或者管理多個(gè)容器。接下來分別使用命令行和 Docker Compose 的方式來對比一下創(chuàng)建容器的方式。
不使用 Docker Compose 創(chuàng)建容器docker pull yhlben/cdfang-spider docker pull mongo docker network create webapp-network docker run -d --network webapp-network -v ~/data/db:/data/db mongo docker run -p 8082:8082 --network webapp-network -d yhlben/cdfang-spider
可見,手動創(chuàng)建容器,需要在命令行中手動執(zhí)行很多命令,這些命令一旦敲錯了,就得重來,不便于容器的管理。
使用 Docker Compose 創(chuàng)建容器1、新建 docker-compose.yml 文件。
version: "3.7" services: database: image: mongo restart: always volumes: - ~/data/db:/data/db networks: - webapp-network web: image: yhlben/cdfang-spider depends_on: - database ports: - 8082:8082 networks: - webapp-network networks: webapp-network: driver: bridge
2、運(yùn)行 docker-compose
docker-compose up -d
可見,使用 Docker Compose 創(chuàng)建容器只需要提前編寫好 yml 文件,然后執(zhí)行一條命令就行了,比起手動敲命令,更加方便。
除此之外,Docker Compose 還可以使用 docker-compose -scale 擴(kuò)展多個(gè)相容的容器,用來實(shí)現(xiàn)負(fù)載均衡,可以擴(kuò)容,也可以減容。例如:實(shí)現(xiàn)無縫部署項(xiàng)目,先擴(kuò)容一個(gè)新的 Container,當(dāng) Container 啟動完畢后,加入到集群中,然后更新老容器,更新完后再加入集群中。
Docker Compose 配置Docker Compose 的配置文件一般定義在 docker-compose.yml 文件中,主要的配置項(xiàng)如下:
services
一個(gè) service 代表一個(gè) container,這個(gè) container 可以從 dockerHub 中的鏡像來創(chuàng)建,也可以使用本地 dockerfile build 出來的鏡像來創(chuàng)建。
service 的啟動類似 docker run,可以給 service 指定 network 和 volume 的引用。
networks
定義 networks ,相當(dāng)于執(zhí)行 docker network create xxxx。
volumes
定義 volume ,相當(dāng)于執(zhí)行 docker volume create xxx。
更多配置項(xiàng)可以參考官方文檔 compose-file
Docker 項(xiàng)目實(shí)戰(zhàn)接下來以 cdfang-spider 項(xiàng)目為例,使用 Docker 部署項(xiàng)目。
全手動部署1、編寫 Dockerfile 文件。
# 加載基礎(chǔ)鏡像 FROM node # 注釋 LABEL maintainer = "yhlben" # 創(chuàng)建工作目錄 RUN rm -rf /app RUN mkdir /app WORKDIR /app # 安裝項(xiàng)目依賴 COPY . /app RUN npm install RUN npm run build RUN mv ./dist/* ./ # 對外暴露端口 EXPOSE 8082 # 啟動 Image 時(shí)執(zhí)行命令 CMD BUILD_ENV=docker node app.js
2、通過 Dockerfile 文件構(gòu)建 Image。
docker build -t yhlben/cdfang-spider .
3、拉取 mongo 官方 Image。
docker pull mongo
4、創(chuàng)建 network,讓兩個(gè)容器可以相互通信。
docker network create webapp-network
5、運(yùn)行容器
docker run -d --network webapp-network -v ~/data/db:/data/db mongo docker run -p 8082:8082 --network webapp-network -d yhlben/cdfang-spider
6、通過訪問 localhost:8082 訪問項(xiàng)目。
自動化部署1、編寫 Dockerfile 文件。
# 加載基礎(chǔ)鏡像 FROM node # 注釋 LABEL maintainer = "yhlben" # 創(chuàng)建工作目錄 RUN rm -rf /app RUN mkdir /app WORKDIR /app # 安裝項(xiàng)目依賴 COPY . /app RUN npm install RUN npm run build RUN mv ./dist/* ./ # 對外暴露端口 EXPOSE 8082 # 啟動 Image 時(shí)執(zhí)行命令 CMD BUILD_ENV=docker node app.js
2、在 dockerHub 上授權(quán) github 項(xiàng)目,這樣當(dāng) github 項(xiàng)目有更新時(shí),會自動執(zhí)行 Dockerfile 進(jìn)行構(gòu)建,并將構(gòu)建結(jié)果保存到 dockerHub 倉庫中。
3、編寫 docker-compose.yml 文件。
version: "3.7" services: database: image: mongo restart: always volumes: - ~/data/db:/data/db networks: - webapp-network web: image: yhlben/cdfang-spider depends_on: - database ports: - 8082:8082 networks: - webapp-network networks: webapp-network: driver: bridge
4、一鍵啟動,確保已安裝 docker-compose。
docker-compose up -d
5、通過訪問 localhost:8082 訪問項(xiàng)目。
總結(jié)通過 Docker 部署完項(xiàng)目后,感受很不錯,主要分以下幾點(diǎn):
使用 Docker Compose 一鍵啟動項(xiàng)目。
再也不用在服務(wù)器上安裝各種雜七雜八的環(huán)境,全部封裝到 Image 里,啟動一個(gè) Container 跑起來就行了,不用的時(shí)候直接刪除 Container 就行了,服務(wù)器上不會受到任何污染。
對于耗時(shí)的 Image 構(gòu)建過程,直接交給 dockerHub 去自動構(gòu)建。
最后,附上項(xiàng)目源碼地址:cdfang-spider
本項(xiàng)目使用單機(jī)部署,即所有的容器都在同一臺服務(wù)器上。除此之外,docker 還支持分布式容器部署,可以使用 docker swarm 或者 kubernetes 來管理,目前還在學(xué)習(xí)中,爭取早日整理好分享給大家,感謝大家支持!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/104811.html
摘要:最近在學(xué)習(xí),并用重新部署了項(xiàng)目,使用后確實(shí)大幅度地降低了部署難度。如果,內(nèi)存,硬盤不夠,只能加物理設(shè)備,但這個(gè)是有上限的。虛擬化時(shí)代為了解決物理設(shè)備的諸多問題,出現(xiàn)了虛擬機(jī)。全手動部署編寫文件。一鍵啟動,確保已安裝。 最近在學(xué)習(xí) Docker,并用 Docker 重新部署了cdfang-spider項(xiàng)目,使用 docker 后確實(shí)大幅度地降低了部署難度。如果你也想用 Docker 來部...
摘要:原因是這樣的想要部署一個(gè)平臺,就在朋友的推薦下選擇了這個(gè)現(xiàn)成的項(xiàng)目該項(xiàng)目分為服務(wù)端客戶端以及數(shù)據(jù)庫在嘗試直接部署的時(shí)候發(fā)現(xiàn)需要裝一大堆的環(huán)境,啊,特別的麻煩,之前簡單的使用過,就在想能不能用免環(huán)境直接部署呢于是就有了這次的嘗試多容器通信該 原因是這樣的 想要部署一個(gè)mocker平臺,就在朋友的推薦下選擇了api-mocker這個(gè)現(xiàn)成的項(xiàng)目 該項(xiàng)目分為服務(wù)端node、客戶端vue、以及...
摘要:原因是這樣的想要部署一個(gè)平臺,就在朋友的推薦下選擇了這個(gè)現(xiàn)成的項(xiàng)目該項(xiàng)目分為服務(wù)端客戶端以及數(shù)據(jù)庫在嘗試直接部署的時(shí)候發(fā)現(xiàn)需要裝一大堆的環(huán)境,啊,特別的麻煩,之前簡單的使用過,就在想能不能用免環(huán)境直接部署呢于是就有了這次的嘗試多容器通信該 原因是這樣的 想要部署一個(gè)mocker平臺,就在朋友的推薦下選擇了api-mocker這個(gè)現(xiàn)成的項(xiàng)目 該項(xiàng)目分為服務(wù)端node、客戶端vue、以及...
摘要:原因是這樣的想要部署一個(gè)平臺,就在朋友的推薦下選擇了這個(gè)現(xiàn)成的項(xiàng)目該項(xiàng)目分為服務(wù)端客戶端以及數(shù)據(jù)庫在嘗試直接部署的時(shí)候發(fā)現(xiàn)需要裝一大堆的環(huán)境,啊,特別的麻煩,之前簡單的使用過,就在想能不能用免環(huán)境直接部署呢于是就有了這次的嘗試多容器通信該 原因是這樣的 想要部署一個(gè)mocker平臺,就在朋友的推薦下選擇了api-mocker這個(gè)現(xiàn)成的項(xiàng)目 該項(xiàng)目分為服務(wù)端node、客戶端vue、以及...
閱讀 1094·2023-04-26 02:02
閱讀 2438·2021-09-26 10:11
閱讀 3585·2019-08-30 13:10
閱讀 3780·2019-08-29 17:12
閱讀 750·2019-08-29 14:20
閱讀 2216·2019-08-28 18:19
閱讀 2262·2019-08-26 13:52
閱讀 983·2019-08-26 13:43