Docker 基礎 - Docker 遇見前端(二)

来源:https://www.cnblogs.com/kelsen/archive/2018/09/10/9608578.html
-Advertisement-
Play Games

Docker 相關的基礎知識點非常多,比如基本概念,鏡像管理,數據捲(容器)管理,常用命令,周邊生態等等。在這裡梳理出個大概框架,方便後續學習使用。《Docker 遇見前端》系列文章,旨在分享學習如何通過 docker 構建一個相對完備的前端自動化開發環境。 ...


一、Docker 系統架構

守護進程
負責容器的創建、運行和監控,還負責鏡像的構建和存儲。docker demon 命令可啟動 Docker 守護進程。

Docker 客戶端
通過http與 docker 守護進程通信。與docker守護進程通信的 API 有非常清晰的定義和文檔,開發者也可以利用 API 直接和守護進程通信,而不通過 docker 客戶端。

Docker 鏡像倉庫
預設的寄存服務為 Docker Hub, 負責鏡像的存儲和發佈。根據實際需要,我們也可以構建和運營自己的docker服務。

底層技術

cgroups
負責管理容器使用的資源,如記憶體和CPU;

namespaces
負責容器之間的隔離;確保系統的其他部分與容器的文件系統、主機名、用戶、網路和進程都是分開的。

UFS (union file system)
負責存儲容器的鏡像層。

周邊技術

swarm
docker 集群解決方案

compose
負責構建和運行多個docker容器所組成的應用程式的工具。主要用於開發和測試環境。

machine
非Linux系統(Windows、MacOS)上的GUI,用於運行和管理docker容器;

docker trusted registry
管理和存儲docker鏡像。

網路連接
overlay

服務發現
consul、skyDNS

服務編排及集群管理
kubernetes,swarm等等

專門用於托管容器的操作系統
雖然docker在大部分的Linux發行版本上 都運行的很好,但還是出現了一些新的發行版項目,他們只考慮需要運行容器的環境,希望做出體積小二容易管理的發行版,尤其是針對數據中心或集群的使用場景。

二、鏡像是如何生成的

創建鏡像的主要方法是通過 Dockerfiledocker build

構建環境的上下文

命令 docker build需要 Dockerfilebuild context。 build context 是一組本地文件和目錄,他可以被 Dockerfile 的 ADDCOPY 指令引用,通常以目錄路徑的形式指定。

如果提供的URL以http開頭,它會被假定位直接指向 dockerfile ,這樣做沒什麼用,因為該 Dockerfile沒有與任何上下文關聯。

也可以將git倉庫作為構建環境上下文。這種情況下,docker客戶端會將Git倉庫colone到本地,然後傳遞給守護進程作為構建環境上下文。

還可以通過stdin輸入構建環境的上下文,方法是在需要輸入上下文的地方使用 -參數。該輸入可以是一個歸檔文件,支持 tar.gz / xz / bzip2 格式。

從構建環境的上下文中排除不必要的文件,可以使用.dockerignore文件,該文件類似 .gitignore

鏡像

Dockerfile 中的每個指令執行後都會生成一個鏡像層,這個鏡像層可以用來啟動容器。一個新的鏡像層的建立,使用上一個鏡像層啟動容器,然後執行dockerfile中的指令,再把它保存為一個新鏡像。

當dockerfile 執行成功後,中間的那些容器會被刪掉,除非提供 --rm=false 參數。

由於每個指令的最終結果都只是個靜態的鏡像,本質上是一個文件系統以及一些元數據,因此即使指令中的持久進程,最終都會被停掉。比如你在一條指令中開啟一個資料庫服務的進程,但到了下一條指令,或啟動容器的時候,它就已經不存在了。

如果你需要在啟動容器的時候同事運行一個進程或服務,他必須從ENTRYPOINTCMD 指令中啟動。

Docker 為了加快鏡像構建的速度,會將每一個鏡像層緩存下來。 Docker的緩存特性能大大提高工作效率。

基礎鏡像

基於鏡像分層的特點,當我們需要一個環境時,無需重頭開始去構建一個鏡像。最理想的做法是完全不用創建鏡像,直接使用某個現有的鏡像,然後把配置文件和數據掛在上去即可。對於常用軟體,比如資料庫、web伺服器,這是非常可行的。一般情況下使用官方鏡像比自己創建一個鏡像好得多,因為其他人已經找到使得該軟體以最佳方式運行在容器中的方法。

如果你需要使用一個基礎鏡像以運行應用程式,那麼應該先檢查一下,應用程式所使用的編程語言或框架是否已提供了官方的鏡像。如果只是需要一個小而完整的Linux 發行版本,可以選擇 alpine,他的大小僅僅5MB多一點,但仍提供了一個包管理器,可以輕鬆安裝大量應用和工具。

Dockerfile

Exec 與 Shell 的對比

一些指令(RUNCMDENTRYPOINT)能夠接受 shell 和 exec 這兩種格式。exec 格式需要用到一個JSON數組,如:["executable","param1","param2"],其中第一個元素是可執行文件,其他元素是他執行時所使用的參數。shell格式使用的是自由形式的字元串,字元串會傳給 /bin/sh -c 執行。exec格式適用於需要規避 shell 對字元串做出錯誤解析的情況,或者當徑向力沒有包含 /bin/sh 時。

常用指令

這些指令在 docker 網站上都可以找到非常詳細的說明文檔,隨著docker的持續發展,文檔也會有調整,下列指令描述如果與官方文檔不一致,請以官網文檔為準。

ADD
從構建環境上下文或遠程URL將文件複製至鏡像。如果是從一個本地路徑添加一個壓縮文件,他會被自動解壓。

CMD
當容器啟動執行時執行特定的指令。如果還定義了 ENTRYPOINT , 該指令將被解釋為 ENTRYPOINT 的參數(這時候請確保使用的是 exec 格式)。CMD指令也會被 docker run 命令中鏡像名稱後面的參數覆蓋。加入定義了多個CMD,只有最後一個會生效。

COPY
從構建環境上下文複製文件至鏡像。它有兩種形式,COPY src dest 或 COPY ["SRC","DEST"],如果路徑中有空格的話,必須使用第二種格式。

ENTRYPOINT
設置一個在容器啟動時運行的可執行文件(以及預設參數)。任何CMD指令或docker run 命令中鏡像名稱之後的參數,將作為參數傳遞給這個可執行文件。 ENTRYPOINT 指令通常用於提供“啟動”腳本,目的是在解析參數之前,對變數和服務進行初始化。

ENV
設置鏡像內的環境變數。這些變數可以被隨後的指令應用。

EXPOSE
向 Docker 表示該容器將會有一個進程監聽所指定的埠。提供這個信息的目的是用於連接容器或在執行 docker run 命令式通過 -p 參數把埠發佈出來; EXPOSE 本身不會對網路有實質性的改變。

FROM
設置 Dockerfile 使用的基礎鏡像;隨後的指令將基於該鏡像之上。 FROM 必須為 Dockerfile 的第一條指令。

MAINTAINER
設置鏡像維護者的姓名和聯繫方式

ONBUILD
指定當鏡像被用作另一個鏡像的基礎鏡像時將會執行的指令。

RUN
在容器內執行指定的指令,並把結果保存下來。

USER
設置任何後續的RUN、CMD或ENTRYPOINT指令執行時所用的用戶(用戶名或UID)。

VOLUME 
指定為數據捲的文件或目錄。如果該文件或目錄已經在鏡像中存在,那麼當容器啟動時,他就會被覆制到這個捲。如果提供了多個參數,那麼就將被解釋成多個數據捲。

WORKDIR
對任何後續的 RUN、CMD、ENTRYPOINT、ADD、COPY指令設置的工作目錄。這個指令可多次使用。

三、外部可訪問 && 埠轉發

假設你在容器中運行一個 Nginx web伺服器,你如何使外界可以訪問他呢?通過 -p-P 選項來發佈埠。比如:

$docker run -d -p 8000:80 nginx

容器啟動後,我們可以通過 localhost:8000 訪問到容器內的 web 服務。其中 -p 8000:80 參數告訴 docker 將主機的 8000 埠轉發到容器的 80 埠。或者可以使用 -P 參數來告訴 Docker 自動選擇一個主機上未使用的埠。

四、數據捲 && 數據容器

數據捲,是一個目錄,但並不屬於UFS的一部分,它只是在主機上被綁定掛在到容器的一個普通目錄。有三種方式可以掛載數據捲:

執行 Docker 時,通過 -v 選項來指定數據捲

docker run -it --name test -v /data debian /bin/bash

通過 Dockerfile 的 VOLUME 命令

FROM debian
VOLUME /data

指定數據捲要綁定的主機目錄

docker run -v /home/data:/data debian ls /data

這個例子把主機的 /home/data 目錄綁定到容器的 /data 目錄,容器能夠使用主機 /home/data 目錄下的文件。

在執行 docker run 命令時,我們通過傳入 --volumes-from container 參數可以實現容器間的數據共用。一個常用的做法是,創建數據容器,這種容器的唯一目的就是與其他容器分享數據。

五、Docker 常用命令

  1. docker build 從dockerfile構建鏡像。
  2. docker images 列出所有本地鏡像。
  3. docker run 這是一個相對複雜的命令,支持非常多參數。
  4. docker attach 查看容器內主進程,並與之交互
  5. docker create 創建容器但不啟動運行
  6. docker exec 在同期中運行一個命令
  7. docker rm 刪除一個或多個容器

其實經常用到的命令還有很多,可以在 http://docs.docker.com 查閱完整的釋義,也可以在命令行通過 --help參數查看具體使用說明。

寫在後面

本文地址:https://www.cnblogs.com/kelsen/p/9608578.html

關於本文如果您有任何建議或疑問請在下麵留言交流,也可通過 Web前端高級工程師 群進行線上溝通。avatar


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

-Advertisement-
Play Games
更多相關文章
  • 跨語言調用Hangfire定時作業服務 背景 Hangfire允許您以非常簡單但可靠的方式執行後臺定時任務的工作。內置對任務的可視化操作。非常方便。 但令人遺憾的是普遍都是業務代碼和hagnfire服務本身聚合在一個程式中運行,極大的限制了hangfire的擴展和跨語言調用。 所以萌生了開發一個支持 ...
  • 1. .NET和C#有什麼區別 答:.NET一般指 .NET FrameWork框架,它是一種平臺,一種技術。 C#是一種編程語言,可以基於.NET平臺的應用。 2.一列數的規則如下: 1、1、2、3、5、8、13、21、34...... 求第30位數是多少,用遞歸演算法實現。答:public cla ...
  • 類的定義 類是描述具有相同特征與行為的事物的抽象,類內部包含類的特征和類的行為 類支持繼承 類的定義是關鍵字class為標誌 類的格式 訪問標識符 class 類名 { 類主體 } 訪問標識符:指定了類及其成員的訪問規則。如果不指定則使用預設的標識符 類的預設標識符為internal,而類成員的預設 ...
  • 概述 在上面一篇 Windows Community Toolkit 4.0 - DataGrid - Part02 中,我們針對 DataGrid 控制項的 Utilities 部分做了詳細分享。而在本篇,我們會對控制項中最重要的 DataGrid 文件夾中的類做詳細的分享。 下麵是 Windows ...
  • 參數 var list = new List<int>(); // 集合var totalCount = 17; // 總數量var pageSize = 5; // 每頁查詢數量 第一種: var pageTotal = totalCount % pageSize == 0 ? totalCoun ...
  • 之前的博客 將時間作為GUID的方法 中,我使用了鎖。我在實際的使用中,錯將鎖的釋放放在了if語句中,這純粹是我的失誤,導致了很嚴重的錯誤。因此我在想是否有無鎖的將時間作為GUID的方式,答案是使用Interlocked中的 CompareExchange方法,該方法是原子操作。說是無鎖操作,其實就 ...
  • 方法是什麼 方法是C#中將一堆代碼進行進行重用的機制 他是在類中實現一種特定功能的代碼塊,將重覆性功能提取出來定義一個新的方法 這樣可以提高代碼的復用性,使編寫程式更加快捷迅速 方法格式 訪問修飾符 返回類型 方法名稱(參數列表) { 方法體; } 方法是在類或結構中聲明的,聲明時需要訪問修飾符、返 ...
  • 記得前面老周寫過在.net core 中使用 Composition 的爛文。上回老周給大伙伴們介紹的是一個“重量級”版本—— System.ComponentModel.Composition。應該說,這個“重量級”版本是.NET 框架中的“標配”。 很多東西都會有雙面性,MEF 也一樣,對於擴展 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...