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

2022-02-04 07:00:06
本篇文章給大家帶來了關於docker核心技術之容器操作,以及Dockerfile詳解等等相關問題,希望對大家有幫助。

一. Docker

1. 簡介

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

2. Docker優勢

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

3. Docker與虛擬機器器對比

二. Docker安裝

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

三. 容器操作

  • 啟動:

docker run:

-it 互動

-d 後臺執行

-p 埠對映

-v 磁碟掛載

  • 啟動已終止容器

docker start

  • 停止容器

docker stop

  • 檢視容器程序

docker ps

  • 檢視容器細節

docker inspect

  • 拷貝檔案到容器內

docker cp file1 <containerid>:/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 <image>

FROM <image>:<tag>

FROM <image>@<digest>

範例:

FROM ubuntu

MAINTAINER: 維護資訊

格式:

MAINTAINER <name>

範例

MAINTAINER ribbon

RUN:構建映象時執行的命令

格式:

shell執行:RUN <command>

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

範例:

RUN apk update

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

RUN apt-get update && apt-get install這兩條命令永遠用&&連線,否則apt-get update構建層被快取,會導致新package無法安裝

ADD: 將本地檔案新增到容器中,tar等型別會自動解壓,可以存取網路資源,類似於wget

格式:

ADD <src> ... <dest>

範例:

ADD bin/amd64/httpserver /httpserver

COPY: 功能類似於ADD,但是不會解壓縮檔案,不能存取網路資源

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

格式:

COPY<src> ... <dest>

範例:

COPYbin/amd64/httpserver /httpserver

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

格式:

CMD ["executable","param1","param2"] (執行可執行檔案,優先)
CMD ["param1","param2"] (設定了ENTRYPOINT,則直接呼叫ENTRYPOINT新增引數)
CMD command param1 param2 (執行shell內部命令)

範例:

CMD ["ethtool", "--help"]

CMD echo "1111"

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

格式:

ENTRYPOINT ["executable", "param1", "param2"] (可執行檔案, 優先)
ENTRYPOINT command param1 param2 (shell內部命令)

範例:

ENTRYPOINT /httpserver

CMD [-c]

LABAL: 用於為映象新增源資料

格式:

LABEL <key>=<value> <key>=<value> <key>=<value> ...

範例:

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

ENV: 設定環境變數

格式:

ENV <key> <value>

範例:

ENV MY_SERVICE_PORT=80 UDP_PORT=90

EXPOSE: 指定外界互動的埠

格式:

EXPOSE <port> [<port>...]

範例:

EXPOSE 80

EXPOSE 80/tcp

EXPOSE 80 90

VOLUME: 用於指定持久化目錄

格式:

VOLUME [<path>]

範例:

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

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

格式:
  USER user
  USER user:group
  USER uid
  USER uid:gid
  USER user:gid
  USER uid:group

範例:
  USER www

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

格式:
ARG <name>[=<default value>]
範例:
ARG build_user=ribbon

五. Linux NameSpace詳解

  • NamesSpace詳解:

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

  • NameSpace的常用操作

  • 檢視當前系統的namespace:

lsns -t <type>

  • 檢視某程序的namespace:

ls -la /proc/<pid>/ns/

  • 檢視某namespace執行命令

nsenter -t <pid> -n

六. Linux Cgroups詳解

  • Cgroups詳解

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

  • 模擬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目錄刪除不掉。

八. 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核心技術(總結分享)的詳細內容,更多請關注TW511.COM其它相關文章!