Docker容器學習

来源:https://www.cnblogs.com/yuxl01/archive/2022/05/24/16293799.html
-Advertisement-
Play Games

1.Docker基本介紹 Docker就是虛擬化的一種輕量級替代技術,基於Go語言的開源應用容器引擎。Docker的容器技術不依賴任何語言、框架或系統,可以將應用程式變成一種標準化的、可移植的、自管理的組件,並脫離伺服器硬體在任何主流系統中開發、調試和運行。 光看這個介紹還不足以知道Docker是什 ...


1.Docker基本介紹

Docker就是虛擬化的一種輕量級替代技術,基於Go語言的開源應用容器引擎。Docker的容器技術不依賴任何語言、框架系統,可以將應用程式變成一種標準化的、可移植的、自管理的組件,並脫離伺服器硬體在任何主流系統中開發、調試和運行。

光看這個介紹還不足以知道Docker是什麼,能做什麼,多半一頭霧水,我第一眼看到這些介紹時也是一樣的感受,其實我們可以這樣理解,相信很多人應該都用過虛擬機,虛擬機就是一個獨立的完整電腦, 我們暫且先將Docker理解為縮小或者閹割版的虛擬機,它具有啟動速度快資源利用率高性能開銷小這些特點。

這樣做是為了在我們的思維認知中先建立一個簡單概念,因為使用已知的事物去類比學習未知的東西理解起來更快一些,當然Docker!=虛擬機,因為虛擬機是在os Hypervisor之上做的擴展,而Docker相當於是直接在os層面上的擴展,共用內核,只是在某些抽象層面相同而已,例如它們都是可以作為容器。可以承載應用程式,至於對它們具體的認識和細節,在下麵會做介紹

2.虛擬機 Docker對比

上邊這張圖如果有過瞭解的應該知道,左邊是虛擬機的架構,右邊是Docker的架構,我們來簡單分析下圖中看到的的內容

1.我們可以看到無論是Docker還是虛擬機都有一個相同點,它們最上層承載的是我們的應用程式。

2.它們的底層是OS內核,應用程式和依賴對每一個虛擬機是獨立的,而Docker那邊應用程式和依賴是同一個Docekr Engine

3.虛擬機架構層數多一些,應用程式>虛擬機>Hypervisor>os,Docker架構層少一些,應用程式>Docker Engine>os

1.一個小故事

老闆讓你在虛擬機上安裝RabbitMQ和Redis,你的做法就是需要下載安裝包,然後安裝,這時2個應用所有依賴都在虛擬機上,類似一個大盒子放了2樣東西

有一天虛擬機突然出問題了,你搞了一晚上檢查發現同時安裝RabbitMQ和Redis的機器會有衝突,導致不能正常運行,為了隔離環境依賴和衝突,你跟老闆說需要把他們分開安裝,然後你老老實實的再安裝了一臺虛擬機,分別裝RabbitMQ和Redis。問題解決了,老闆之誇你幹得好。

一段時間後老闆又跟你說公司規模擴大,別的開發小組也要獨立的RabbitMQ和一個Redis伺服器,我們現在一個RabbitMQ和一個Redis肯定不行,讓你多裝幾台,老闆又買了10台虛擬機,並且給你一周時間搞定這個事情,為了快速複製應用環境,你選擇將已經安裝了的2個虛擬機操作系統做了鏡像,直接給其他虛擬機安裝選擇這個鏡像,避免了每一臺虛擬機都親自去安裝軟體配置環境,不到2天你搞完了,為摸魚留下了5天寶貴時間

後面你用摸魚的時間學習了Docker,知道了它們的優點,你選擇嘗試在Docker安裝RabbitMQ和Redis,發現只需要在DockerHub上拉取他們各自的鏡像,然後根據鏡像創建容器運行就好了,想多搞幾個,就根據鏡像直接多運行幾個實例就好了,非常簡單快捷,之前需要2天時間搭建的,一上午就搞完了,不禁感嘆這才是為了摸魚留下了充足且寶貴的時間

2.虛擬機和Docker

我們思考上面使用虛擬機存在的問題,它有自己獨立的桌面,操作系統,然後可以在操作系統中,安裝軟體運行應用。每一個虛擬機都如此,10台虛擬機,就有10個獨立的桌面,以及10個獨立的操作系統,為了隔離環境裝一個軟體,就搞一個虛擬機,為了快速複製遷移就鏡像一整個系統,這是不是太浪費了一點,並且每台機器的資源根本就沒有完全利用。

Docker就不同了,他不需要安裝操作系統、桌面這些,只需要安裝Docker就好了,要想運行應用,只需要一個鏡像,Docker就可以創建一個容器,然後通過容器去承載應用,而且每一個容器中運行的實例都是獨立的,他們之間沒有關係,也不會影響。類似一個大盒子中放了2個完全獨立的小盒子,一個盒子裝RabbitMQ,一個盒子裝Redis,他們的依賴在各自的容器中獨立,不會衝突,那些環境衝突之類的事情,再也不用操心了,並且大大的節省了資源和成本。

說了這麼多,總結一下其實Docker就是一種可以讓應用依賴獨立起來,高效而且能快速複製的解決方案,Docker中的容器更像是為應用提供了一個隔離運行環境,而Docker引擎就是為了承載容器的,各個容器共用Docker引擎 我們看圖中

Docker 是一個Client/Server模式應用 ,就是圖中在水裡的鯨魚,這個傳能裝很多集裝箱,反推虛擬機就是很多條船,上面只裝一個集裝箱。
Docke容器就是船上的集裝箱,集裝箱中裝的是應用程式運行環境,不同容器只裝一個程式,還有一個個集裝箱可以快速移植和複製
Docker鏡像就是類似集裝箱的模型,可以根據模型快速製造一個集裝箱,換句話說容器就是鏡像的實例,用面向對象解釋(鏡像=類)(容器= new 鏡像)

3.物理機、虛擬機、Docker對比

我們依然還是使用圖片來闡述他們之間的關係,在網上看到一幅圖很多人用,可以說這時目前很生動形象的比喻了,所以我也借用了

1.物理機就是圖1中的別墅,獨立地基上,獨立的花園獨立的房子獨立的洗手間,一臺物理機可以虛擬化出很多的虛擬機

2.虛擬機對應圖2中的每一套商品房,共用一個地基花園獨立的房子獨立的洗手間

3.Docker對應圖3中的隔斷間每一間住著一個租戶,租房的應該明白,共用一個地基花園房子洗手間 ,空間越來越小,資源和成本利用最大化,符合發展趨勢

4.部署Docker和應用

Linux安裝Docker並且部署程式等操作,單獨有個筆記,按照操作來,比較簡單。可以看看這裡,主要介紹了

1.Docker 部署掛載Net Core程式
2.Dockerfile 部署Net Core程式
3.Docker 部署Nginx
4.Docker 部署Redis

如果你沒有使用過Docker,但是想學習它,並且能做一個簡單的Demo應用,那建議一定要按照其中的步驟來完整操作一遍,如果有遇到什麼問題,可以留言一起討論

5.Docker管理
1.基本介紹

隨著Docker發展及其容器技術的優點,使得它在現代互聯網中得到大量的應用,相信小伙伴們除了聽到它的名字之外,肯定對K8S的 這個名詞也不陌生吧,在我不瞭解的時候,聽到這個就覺得很牛,後面瞭解了之後,知道了K8S全稱 Kubernetes,是Google開發的一款基於容器的集群管理平臺,說白了就是Docker的管理工具而已。

除了K8S之外,Docker還有很多其他的管理工具,例如Docker MachineDocker Swarm以及Docker Compose只是它們和K8S應對的場景有略微的不同,但是都是對Docker進行管理的工具,Docker Machine現在基本已經淘汰了Docker Swarm和K8S的角色定位都是Docker 的集群管理工具,作用差不多,但是現在以及被K8S所替代了,對於K8S後面會專門的進行學習。

目前就簡單的學習一下Docker Compose,Compose 是用於定義運行多容器 Docker 應用程式的工具,類似像一個容器的管家,想象一下當你的Docker中有成百上千的容器需要啟動,如果一個一個的啟動那得多費時間。有了Docker-Compose只需要編寫一個文件,在這個文件裡面聲明好要啟動容器配置一些參數執行一下這個文件Docker就會按照聲明的配置所有的容器啟動起來,

有點像Windows系統的bat批處理文件,例如我要開啟3個 視窗,我就在一個批處理中寫3個start命令,一次執行就好了。但是Docker-Compose只能管理當前主機上的Docker,不能去啟動其他主機上的Docker容器,只是單實例的操作。

2.安裝Docker Compose

通過 Compose,可以使用 YML 文件來配置應用程式需要的所有服務。然後,使用一個命令,就可以從 YML 文件配置中創建並啟動所有服務。

1.下載 Docker Compose 然後授權,並且使用docker-compose 命令來查看幫助信息

curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

2.Docker Compose常用命令

docker-compose
docker-compose version
docker-compose up

3.配置docker-compose.yml對應文件

version: '3.3'
services:
  service1:
    build:
      context: /apppath/app
    image: apinet5
    ports:
      - 8081:80/tcp
  service2:
    image: apinet5
    ports:
      - 8082:80/tcp
    command: ["dotnet", "/app/FileSharding.dll"]
  nginx:
    image: nginx:latest
    ports:
      - 8086:80/tcp
    volumes:
      - /apppath/nginx/nginx.conf:/etc/nginx/nginx.conf
  redis:
    image: redis
    ports:
      - 8085:6380/tcp
    volumes:
      - /apppath/redis/redis.conf:/usr/local/etc/redis/redis.conf
      - /apppath/redis/data:/data:rw
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
version: 版本,指定yml依從的 compose 哪個版本制定的
services: 相當於一個集合,包裹下麵所有的內容
build: 指定為構建鏡像的上下文路徑,在上面代表從/apppath/app/FileSharding下麵構建鏡像,名稱為netapi5
image: 鏡像名稱
ports: 設置埠和Docker映射
command: 執行的命令
volumes: 使用目錄掛載

4.幹掉在運行的所有容器,然後執行compose命令運行容器

#刪除所有已有容器
docker stop $(docker ps -q) & docker rm $(docker ps -aq)
#在docker-compose.yml所在目錄下執行命令創建容器運行
docker-compose -up -d

小結

到目前為止,我們對Docker也有了簡單的認識,歸根結底的細分Docker就是一個運維工具,也不是一個非常高深的技術,而且在一般正規公司都是專門的運維來操作,個人認為作為開發只要會使用就好了


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我們有時候看到一篇好的文章,想去保存下來,傳統方式一般是收藏書簽、複製粘貼到文檔或者直接複製鏈接保存,但這樣一次兩次還好,數量多了,比較麻煩不說,還可能不好找~ 這個時候,Python的作用就來了,直接抓下來導出為PDF,直接把整個網站的內容都導下來都行~ 話不多說,我們直接上代碼! import ...
  • 一個工作了3年的Java程式員,遇到一個Spring Boot的問題。 他對這個問題有一些瞭解,但是回答得不是很好,希望參考我的高手回答。 這個問題是:“如何理解Spring Boot中的Starter”。 對於這個問題,看看普通人和高手的回答。 普通人: 嗯。。。。。。。。。。。。。 高手: St ...
  • 背景: 網上有很多跨域配置,但都存在各種各樣問題;經過改良和測試後,最終形成一個穩定配置版本,我的Spring Boot版本是2.5.1 問題: 前後端分離後,進行聯調,發現瀏覽器出報跨域問題 解決方案: 在config配置文件中添加下麵代碼類。這裡很重要的一點是,在有其他攔截器的時候,通過bean ...
  • 日期:2022年5月25日 註:本博客僅供參考 概念與思路 貪心演算法是指在對某一問題求解時,總是作出當前情況下的最優選擇。因此,貪心演算法考慮的不是整個問題的最優解,演算法得到的是在某一局部環境下的最優解。 貪心演算法的一般思路為: 把要求解的問題分為若幹個子問題; 對每個子問題求解,得到子問題的局部最優 ...
  • 我們一般啟用sql server資料庫要麼選擇安裝SQL Server實例和管理工具(SSMS),要麼用vs自帶的資料庫。如今net跨平臺成為趨勢,今天給大家介紹另一種我最近在玩的方式,即使用docker創建並啟用sql資料庫。 本章介紹了在window10專業版下如何利用docker創建mssql ...
  • 最近通過WPF開發項目,為了對WPF知識點進行總結,所以利用業餘時間,開發一個學生信息管理系統【Student Information Management System】。上一篇文章進行了框架搭建和模塊劃分,本文在前一篇基礎之上,繼續深入開發學生信息管理系統的資料庫和WebApi介面搭建相關內容,... ...
  • 1.前言 相信說起MongoDB很多人都知道是NoSql,非關係型之類的,但是需要註意 1.和傳統關係型資料庫Sqlserver、Mysql、Oracle相比,MongoDB身為非關係型資料庫,在數據存儲結構和數據查詢以及數據海量存儲上,擁有絕對的優勢,並且可以說它與關係型資料庫是互為優缺點,互補的 ...
  • 一 枚舉器和可枚舉類型 當我們為數組使用foreach語句時,這個語句為我們依次取出了數組中的每一個元素。 var arrInt = new int[] { 11, 12, 13, 14 }; foreach (var item in arrInt) { Console.WriteLine(item ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...