Docker基本管理

无敌小鲁班發表於2024-07-18

目錄
  • 1.Docker概述
    • (1)為什麼要用到容器?
    • (2)docker是什麼?
    • (3)docker容器與虛擬機器的區別?
    • (4)Linux 六大 namespace
    • (5)docker的三大核心概念
  • 2.安裝Docker
    • (1)準備環境
    • (2)安裝依賴包
    • (3)設定阿里雲映象源
    • (4)安裝 Docker-CE並設定為開機自動啟動
  • 3.Docker映象建立與操作
    • (1)映象操作
    • (2)容器操作
    • (3)docker run 的啟動過程
  • 4.docker網路模式
    • (1)bridge
    • (2)host
    • (3)container
    • (4)none
    • (5)自定義網路
  • 5.cgroup資源限制(限制容器進行對CPU 記憶體 磁碟IO 等資源的最大使用量)
    • (1)CPU限制
    • (2)記憶體限制
    • (3)磁碟IO限制

1.Docker概述

(1)為什麼要用到容器?

(1)容器可以遮蔽底層作業系統的差異性,可以讓應用程式不管在哪裡都能使用容器的環境正常執行,從而保證了開發測試環保局與生產環境的一致性。
(2)容器部署起來非常便捷和迅速,可以大大縮短應用部署的週期時間

容器引擎:docker 、containered 、 podman 、rocket。

●靈活:即使是最複雜的應用也可以集裝箱化。
●輕量級:容器利用並共享主機核心。
●可互換:可以即時部署更新和升級。
●行動式:可以在本地構建,部署到雲,並在任何地方執行。
●可擴充套件:可以增加並自動分發容器副本。
●可堆疊:可以垂直和即時堆疊服務。

(2)docker是什麼?

docker是用go語言開發並開源的容器引擎,用來執行容器裡的應用。docker也是用來管理容器和映象的工具。

(3)docker容器與虛擬機器的區別?

區別 Docker容器 虛擬機器
所有容器共享宿主機的核心 每個虛擬機器都有獨立的作業系統和核心
隔離性 透過namespace實現資源隔離,透過cgroup實現限制資源的最大使用量 完全隔離。每個虛擬機器都有獨立的硬體資源分配
啟動速度 秒級 分鐘級
計算能力損耗 容器相當於宿主機的程序,效能幾乎沒有損耗 需要透過hypervisor虛擬機器管理程式對宿主機資源虛擬訪問,會有一定的效能損耗
效能 接近原生 弱於
系統支援量(單機) 一個宿主機可以啟動成百上千個容器 最多幾十個虛擬機器


(4)Linux 六大 namespace

MNT(mount):檔案系統隔離
NET(network):網路資源隔離
PID:程序的pid隔離
IPC:程序間通訊隔離
UTS:主機名隔離
USER:使用者隔離

(5)docker的三大核心概念

映象:是建立容器的基礎,是一個只讀的模板檔案,裡面包含執行容器中的應用程式所需要的所有資料(比如應用程式執行檔案、配置檔案、動態庫檔案、依賴包、系統檔案和目錄等)
容器:是用映象執行的例項,容器可以被建立、啟動、停止、刪除,每個容器之間預設是相互隔離的
倉庫:是用來集中儲存映象的地方,有公有倉庫和私鑰倉庫之分

2.安裝Docker

(1)準備環境

systemctl disable --now firewalld
setenforce 0
vim /etc/selinux/config
     disabled

cd /etc/yum.repos.d/
ls
mv local.repo repo.bak/
ls
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
ls



(2)安裝依賴包

rpm -q device-mapper-persistent-data lvm2   #檢視
yum install -y yum-utils device-mapper-persistent-data lvm2 

注:yum-utils:提供了 yum-config-manager 工具。
device mapper: 是Linux核心中支援邏輯卷管理的通用裝置對映機制,它為實現用於儲存資源管理的塊裝置驅動提供了一個高度模組化的核心架構。
device mapper儲存驅動程式需要 device-mapper-persistent-data 和 lvm2。


(3)設定阿里雲映象源

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

(4)安裝 Docker-CE並設定為開機自動啟動

#國內源:
yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo 

阿里雲docker源:yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker




注:安裝好的Docker系統有兩個程式,Docker服務端和Docker客戶端。其中Docker服務端是一個服務程序,負責管理所有容器。 Docker客戶端則扮演著Docker服務端的遠端控制器,可以用來控制Docker的服務端程序。大部分情況下Docker服務端和客戶端執行在一臺機器上。

docker version                #檢視docker版本
docker info                   #檢視docker詳細資訊


3.Docker映象建立與操作





(1)映象操作

docker search  關鍵字             #根據倉庫或映象的關鍵字搜尋映象
docker pull 倉庫名/映象名:標籤     #下載映象,如果不指定標籤則預設使用 :latest
docker images [-q]               #檢視映象列表,-q 表示僅顯示映象ID
docker inspect 映象名或映象ID      #檢視映象的詳細資訊
docker tag 舊映象名:舊標籤  新映象名:新標籤       #新增新的映象名或標籤
docker rmi 映象名或映象ID [-f]          #刪除映象
docker save -o 映象檔案路徑  映象名或映象ID       #將映象匯出為檔案
docker load -i 映象檔案路徑          #將映象檔案匯入docker
docker load < 映象檔案路徑
docker login 倉庫地址            #登入映象倉庫
docker push 倉庫名/映象名:標籤    #上傳映象到倉庫











注:containers 目錄存放容器資訊,image 目錄存放映象資訊,overlay2 目錄下存放具體的映象底層檔案。

·根據映象的唯一標識 ID 號,獲取映象詳細資訊





·存出映象:將映象儲存成為本地檔案

·載入映象:將映象檔案匯入到映象庫中

方法一:

方法二:

·上傳映象
可以使用 docker login 命令來輸入使用者名稱、密碼和郵箱來完成註冊和登入。




(2)容器操作

docker create [-i -t] [--name 容器名] 映象名:標籤 [容器啟動命令]       #建立容器
docker start 容器名或容器ID      #啟動容器
docker ps -a [-q]              #檢視容器列表
docker inspect 容器名或容器ID    #檢視容器的詳細資訊
docker stop 容器名或容器ID [-t 等待時間]       #停止容器,傳送 SIGTERM 訊號,預設等待10s
docker kill 容器名或容器ID        #停止容器,預設傳送 SIGKILL 訊號
docker rm 容器名或容器ID [-f]                     #刪除容器
docker exec -it 容器名或容器ID  sh|bash           #登入容器
docker cp 宿主機檔案路徑  容器名或容器ID:絕對路徑     #複製宿主機檔案到容器中
docker cp 容器名或容器ID:絕對路徑  宿主機檔案路徑     #複製容器檔案到宿主機中
docker logs 容器名或容器ID                        #檢視容器中PID=1的主程序的日誌


常用選項:
-i:讓容器開啟標準輸入接受使用者輸入命令
-t:讓 Docker 分配一個偽終端 tty
-it :合起來實現和容器互動的作用,執行一個互動式會話 shell 







·建立並啟動容器


在後臺持續執行 docker run 建立的容器
需要在 docker run 命令之後新增 -d 選項讓 Docker 容器以守護形式在後臺執行。並且容器所執行的程式不能結束。

·不加 -d 選項會建立容器後直接進入容器進行互動,但是退出容器,容器也會停止





#將容器匯出成檔案
docker export 容器名或容器ID > 容器模板檔案         
docker export -o 容器模板檔案 容器名或容器ID    



#將容器模板檔案匯入成映象
docker import 容器模板檔案 -- 映象名:標籤          
cat 容器模板檔案 | docker import - 映象名:標籤    


(3)docker run 的啟動過程

1)檢查本地是否有指定映象,如果有則直接使用本地映象建立容器,如果沒有則從倉庫拉取映象再建立容器
2)在只讀的映象層上再掛載一層可讀可寫的容器層
3)從docker網橋給容器分配一個虛擬介面和IP地址
4)使用映象的預設啟動命令或docker run 指定的命令來啟動容器,直到容器中的PID=1的主程序退出為止

docker run -d [-i -t] [--name 容器名] 映象名:標籤 [容器啟動命令]     #建立並啟動容器
               -P                       #使用隨機的宿主機埠對映容器埠(從32768開始)
	       -p 宿主機埠:容器埠      #使用指定的宿主機埠對映容器埠
	       -v宿主機絕對路徑:容器絕對路徑[:ro]  #將宿主機的目錄或檔案掛載到容器的資料卷目錄
              --volumes-from 資料卷容器名      #共享資料卷容器的資料卷目錄,實現容器與容器之間的資料共享
              --link 目標容器名:連線別名        #建立容器互聯,實現在容器內透過目標容器名或連線別名與目標容器通訊

4.docker網路模式

Docker 網路實現原理
Docker使用Linux橋接,在宿主機虛擬一個Docker容器網橋(docker0),Docker啟動一個容器時會根據Docker網橋的網段分配給容器一個IP地址,稱為Container-IP,同時Docker網橋是每個容器的預設閘道器。因為在同一宿主機內的容器都接入同一個網橋,這樣容器之間就能夠透過容器的 Container-IP 直接通訊。

Docker網橋是宿主機虛擬出來的,並不是真實存在的網路裝置,外部網路是無法定址到的,這也意味著外部網路無法直接透過 Container-IP 訪問到容器。如果容器希望外部訪問能夠訪問到,可以透過對映容器埠到宿主主機(埠對映),即 docker run 建立容器時候透過 -p 或 -P 引數來啟用,訪問容器的時候就透過[宿主機IP]:[容器埠]訪問容器。



(1)bridge

docker容器的預設網路模式。使用此模式的每個容器都有獨立的網路名稱空間(network namespace),每個容器都有獨立的IP、埠範圍、路由資訊、iptables規則等網路資源。
docker run [--network=bridge] ....




(2)host

使用此模式的容器與宿主機共享網路名稱空間,即容器和宿主機使用同一個IP、埠範圍(容器與宿主機或其它使用host模式的容器不能使用相同的埠)、路由資訊、iptables規則等網路資源。
docker run --network=host ....


(3)container

使用此模式的容器與指定的已存在的容器共享網路名稱空間,即兩個容器使用同一個IP、埠範圍(容器與指定的容器不能使用相同的埠)、路由資訊、iptables規則等網路資源。
docker run --network=container:容器名或容器ID ....





(4)none

每個容器都有獨立的網路名稱空間,但是容器沒有自己的eth0網路卡、IP、埠等,只有lo網路卡。
docker run --network=none ....

(5)自定義網路

可以用來自定義建立一個網段、網橋、網路模式,還可以實現使用自定義網路指定容器IP來建立容器

docker network create --subnet=自定義網段 --opt "com.docker.network.bridge.name"="自定義網橋名"  自定義網路模式名          #建立自定義網路

docker run --network=自定義網路模式名  --ip=自定義容器IP  ....                                                             #使用自定義網路指定容器IP來建立容器

安裝Docker時,它會自動建立三個網路,bridge(建立容器預設連線到此網路)、 none 、host

5.cgroup資源限制(限制容器進行對CPU 記憶體 磁碟IO 等資源的最大使用量)

Docker 透過 Cgroup 來控制容器使用的資源配額,包括 CPU、記憶體、磁碟三大方面, 基本覆蓋了常見的資源配額和使用量控制。
Cgroup 是 ControlGroups 的縮寫,是 Linux 核心提供的一種可以限制、記錄、隔離程序組所使用的物理資源(如 CPU、記憶體、磁碟 IO 等等) 的機制,被 LXC、docker 等很多專案用於實現程序資源控制。Cgroup 本身是提供將程序進行分組化管理的功能和介面的基礎結構,I/O 或記憶體的分配控制等具體的資源管理是透過該功能來實現的。

(1)CPU限制

1)設定單個容器程序能夠使用的CPU使用率上限
針對新建的容器:
docker run --cpu-period=單個CPU的排程週期時間(1000~1000000) --cpu-quota=容器程序能夠使用的最大CPU時間(>=1000,<=排程週期時間)

針對已存在的容器:
修改 /sys/fs/cgroup/cpu/docker/容器ID/ 目錄下的 cpu.cfs_period_us(單個CPU的排程週期時間) cpu.cfs_quota_us(容器程序能夠使用的最大CPU時間) 這兩個檔案的值

2)設定多個容器的CPU佔用比份額(只在多個容器同時執行且CPU資源緊張的時候生效)
docker run --cpu-shares=容器程序最大佔用的CPU份額(值為1024的倍數)

3)設定容器繫結指定的CPU
docker run --cpuset-cpus CPUID[,CPUID2,....]


驗證



分別進入容器,進行壓力測試





針對新建的容器


設定多個容器的CPU佔用比份額



設定容器繫結指定的CPU


(2)記憶體限制

設定容器能夠使用的記憶體和swap的上限

docker run -m=記憶體值  --memory-swap=記憶體和swap的總值
docker run -m=記憶體值  --memory-swap=0或不設定,表示容器的swap為記憶體的2倍
docker run -m=記憶體值  --memory-swap=-1,表示不限制swap的值,宿主機有多少swap,容器就可使用多少




(3)磁碟IO限制

docker run --device-read-bps    磁碟裝置檔案路徑:速率        #限制容器在磁碟上每秒讀的資料量
docker run --device-write-bps   磁碟裝置檔案路徑:速率        #限制容器在磁碟上每秒寫的資料量
docker run --device-read-iops   磁碟裝置檔案路徑:次數        #限制容器在磁碟上每秒讀的次數
docker run --device-write-iops  磁碟裝置檔案路徑:次數        #限制容器在磁碟上每秒寫的次數






相關文章