首頁  >  文章  >  運維  >  最有系統的掌握Docker核心技術(總結分享)

最有系統的掌握Docker核心技術(總結分享)

WBOY
WBOY轉載
2022-02-04 07:00:312326瀏覽

這篇文章為大家帶來了關於docker核心技術之容器操作,以及Dockerfile詳解等等相關問題,希望對大家有幫助。

最有系統的掌握Docker核心技術(總結分享)

一. Docker

1. 簡介

  • 基於Linux核心的Cgroup, Namespace, 以及Union FS等技術,將進程進行封裝隔離,屬於作業系統層面的虛擬技術,由於隔離的進程獨立於宿主和其它的隔離進程,因此稱為容器
  • 最初實作是基於LXC,從0.7以後開始移除LXC,改用自行開發的Libcontainer, 從1.11開始, 則進一步演進為使用runC和Containerd
  • Docker在容器的基礎上,進行了進一步的封裝,從檔案系統、網路互連到進程隔離等等,極大的簡化了容器的創建和維護,使得Docker技術比虛擬機技術更為輕巧、快捷

#2. Docker優勢

  • 更有效率地利用系統資源
  • 更快速的啟動時間
  • 一致的運行環境
  • 持續交付和部署
  • 更輕鬆的遷移
  • 更輕鬆地維護與擴充

3. Docker與虛擬機器比較

2. Docker安裝

參考文章安裝: Install Docker Engine on Ubuntu | Docker Documentation

##三.容器操作

  • #docker run:
                -it 互動

                -d 後台運作 # #pamp          -v 磁碟掛載

  • #啟動已終止容器

docker start

  • 停止容器

docker stop

  • 檢視容器程序

docker ps

  • 查看容器細節

  • docker inspect 

  • # 拷貝檔案到容器內

#docker cp file1 :/file_to_path

  • ##docker退出容器,而不關閉容器: ctrl q p

docker退出容器,而關閉容器: exit

    查詢docker所有映像
docker images

#Docker映像倉庫

# ########Docker hub: https://hub.docker.com######建立私人映像倉庫: docker run -d -p 5000:5000 registry###### 四. Dockerfile詳解######Dockerfile一般分為四個部分:基礎映像資訊、維護資訊、映像操作指令、容器啟動時操作指令############常用指令##### ##########FROM:指定基礎鏡像,必須為第一個指令#########格式:######        FROM ###### FROM :####

        FROM @

範例:

        FROM ubuntu

MAINTINT #格式:

        MAINTAINER

範例

        MAINTAINER ribbon

RUN:在建構中執行的指令建構指令時執行的命令

##格式:        shell執行:RUN

        exec執行:RUN ["executable", "param1", "param2"]

##範例:

        RUN apk update

        RUN ["/etc/execfile", "arg1", "arg2"]

##  d -get install這兩個指令永遠用&&連接,否則apt-get update建置層被緩存,會導致新package無法安裝

ADD: 將本機檔案新增到容器中, tar等類型

會自動解壓縮,可以存取網路資源,類似wget

格式:

        ADD ...

範例:

        ADD bin/amd64/httpserver /httpserver

COPY: 功能類似ADD,但不會解壓縮文件,無法存取網路資源

#在Dockerfile中使用multi-stage: Dockerfile 中的multi-stage(多階段建置) - sparkdev - 部落格花園

格式:

        COPY ... <##        COPY ... <##        COPY ... <## >d;d ;

範例:

        COPYbin/amd64/httpserver /httpserver

CMD: 建置容器後調用,也就是在容器啟動時才進行呼叫

#格式:

        CMD ["executable","param1","param2"] (執行可執行文件,優先)

        CMD ["param1","param2"] (設定了ENTRYPOINT,則直接呼叫ENTRYPOINT新增參數)         CMD command param1 param2 (執行shell內部指令)

範例:

        CMD ["Hhelm"--


        CMD echo "1111"

#ENTRTPOINT: 設定容器,使其可執行化

格式:

        ENTRYPOINT ["executable", "param1", "param2"] (可執行檔, 優先)

   shell   #範例:##卷##格式:

        LABEL = = =<value> ...


'

##        LABEL multi.label1="value1" multi.label2="value2" other="value3"

##ENV: 設定環境變數

格式:

        ENV

範例:

        ENV MY_SERVICE_PORT=80 UDP_N0的連接埠

格式:        EXPOSE [...]

範例:

    POSE

##        EXPOSE 80/tcp

卷##        VOLUME []

#範例:

        VOLUME ["/data", "/usr1/jenkins"]

##USER:指定執行#USER:容器時的使用者名稱或UID,後續的RUN 也會使用指定使用者。

格式:

  USER user

  USER user:group

  USER uid

#   USER uid:gid

 與問題 US##   USER uid:gid

 ER groupUS##ER user:#US>

## 範例:

  USER www

ARG: 用於指定傳遞給建置執行時間的變數

格式:

    ARG < name>[=]

範例:

    ARG build_user=ribbon

五. Linux NameSpace詳解

  •  NamesSpace詳解:

Linux NameSpace_Frank_Abagnale的部落格-CSDN部落格 這篇文章比較詳細的介紹,可以參考這篇

  • NameSpace的常用操作

  • 檢視目前系統的namespace:

lsns -t

  • #看某個行程的namespace:

ls -la /proc//ns/

  • # 查看某namespace執行指令

nsenter -t -n 

#六. Linux Cgroups詳解

  • Cgroups詳解

##容器核心:cgroups - 簡書 可以參考這篇文章來進行了解

    #模擬Cgroups控制CPU資源

#模擬Cgroups控制CPU資源

通過模擬來更好的熟悉Cgroups控制資源的效果, 先建立cpudemo資料夾

# 執行top可以看到busyloop佔用兩個CPU資源

 將進程加入cgroup進程組態群組

 設定cpuquota

 可以看到成功將佔用200% CPU資源的降低成1%

#########模擬Cgroups超過限定memory資源被OOM kill############/ sys/fs/cgroup/memory目錄下建立memorydemo資料夾################ 執行消耗記憶體程序, 使用watch查詢記憶體使用量############ ############# 將進程配置進cgroups設定群組########## 設定最大記憶體大小############## 等待程序被OOM kill, dmesg可以看到殺死訊息############################備註:刪除自主建立的cgroup資料夾, 需要使用cgroup-tools###################七. Union FS############Docker前面所使用的技術都是源自於linux的技術並沒有創新,而Docker的創新正是檔案系統。 #########

1.  概念: 

  • 將不同目錄掛載在同一個虛擬檔案系統下的檔案系統
  • 支援為每個成員目錄設定readonly、readwrite和without -able權限
  • 檔案系統分層,對readonly權限的目錄可以進行邏輯上的修改,這裡的修改屬於增量的,不影響readonly部分
  • 通常Union FS的用途:多個disk掛載到同一個目錄下, 另一個是將readonly部分和writeable的目錄結合在一起

2. 圖解Union FS

       Docker映像的設計中,引入了層(layer)的概念,也就是說,使用者製作鏡像的每一步操作,都會產生一個層,也就是一個增量rootfs(一個目錄),這樣應用A和應用B所在的容器共同引用相同的ubuntu作業系統層、Golang環境層(作為唯讀層),而各自有各自應用程式層,和可寫層。啟動容器的時候透過UnionFS把相關的層掛載到一個目錄,當作容器的根檔案系統。

3.容器儲存驅動程式

4. 模擬Union FS更好理解效果

       由於docker目前版本上使用的是overlayFS的儲存驅動,所以我們就以overlay掛載方式來進行實驗,overlayfs透過三個目錄:lower目錄、upper目錄、以及work目錄實現,其中lower目錄可以是多個,work目錄為工作基礎目錄,掛載後內容會被清空,且在使用過程中其內容用戶不可見,最後聯合掛載完成給使用者呈現的統一視圖稱為為merged目錄。

執行以下命令:

mkdir upper lower merged work
echo "lower" > lower/in_lower.txt
echo "from lower" > lower/in_both.txt
echo "from upper" > upper/in_both.txt
echo "upper" > upper/in_upper.txt
path=$(pwd)
mount -t overlay overlay -o lowerdir=${path}/lower,upperdir=${path}/upper,workdir=${path}/work ${path}/merged

#       可以看到使用overlay儲存驅動程式檔案掛載實現的效果。實驗完成後恢復環境需要先umount merged目錄後, 再將四個目錄進行刪除操作,先刪除其他的可能會出現rm: cannot remove 'merged/': Device or resource busy,導致merged目錄刪除不掉。

c. Docker網路

1. 安裝工具

Centos系統:

        $ yum install bridge-utils

Ubuntu系統:

        $ apt-get  install bridge-utils

2. Docker網路模式

  •  #docker內建的查詢網路模式

  • docker run選擇運作的網路模式 

##        1) host模式:使用--net=host 指定。 host公用一套net

        2)none模式:使用--net=none指定。網路設定需要由自己進行設定

#        3)bridge模式:使用 --net=bridge 指定,預設設定。

docker網路邏輯圖 橋接器與NAT

        4)container模式:使用 --net=container:NAME_or_ID 指定。使用其他容器的網路設定

# 網路模式圖大概如下圖

3. 模擬Docker起網橋的操作

  • 建立--net=none nginx 

  •  建立network namespace

  •  建立網頁namespace連結

  • ## 檢查目前已建立的橋接裝置

  •  創建veth對

  • # 進行A網路配置

  • 進行B網路設定 

產生eth0網路裝置在nginx docker中

給eth0設定ip 閘道 

  •  nginx可以存取

  • 設定nat, 讓windows透過ip也可以存取

  • 使用完刪除指定nat規則

#推薦學習:《docker影片教學

以上是最有系統的掌握Docker核心技術(總結分享)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除