成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用 Docker 部署 NodeJS + MongoDB 項(xiàng)目

IamDLY / 1764人閱讀

摘要:最近在學(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)如下圖所示:

Image

Image 主要用來打包應(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 上去拉取。

Container

Container 是運(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 Compose

Docker 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

相關(guān)文章

  • 使用 Docker 部署 NodeJS + MongoDB 項(xiàng)目

    摘要:最近在學(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 來部...

    warmcheng 評論0 收藏0
  • 記錄一次被docker多容器通信虐的死去活來的部署之路(node + mongoDB + nginx

    摘要:原因是這樣的想要部署一個(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、以及...

    TNFE 評論0 收藏0
  • 記錄一次被docker多容器通信虐的死去活來的部署之路(node + mongoDB + nginx

    摘要:原因是這樣的想要部署一個(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、以及...

    amc 評論0 收藏0
  • 記錄一次被docker多容器通信虐的死去活來的部署之路(node + mongoDB + nginx

    摘要:原因是這樣的想要部署一個(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、以及...

    Rango 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<