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