Docker原理

2023-03-23 06:03:12

docker是什麼:Docker 是完整的一套容器管理系統,所以想要搞懂 Docker 的概念,我們必須先從容器開始說起。

什麼是容器?

- [x] 容器是用來裝東西的,Linux 裡面的容器是用來裝應用的;

- [x] 容器就是將軟體打包成標準化單元,以用於開發、交付和部署;

- [x] 容器技術已經成為應用程式封裝和交付的核心技術;

容器原理:容器技術的核心,由以下幾個核心技術組成:

- [x] Cgroups (Control Groups) — 資源管理

- [x] SELinux — 安全 (是針對於檔案系統,檔案的管理措施)

- [x] NameSpace — 名稱空間

名稱空間:

#是指可以對系統資源空間進行分割隔離的技術,例如:建立一個虛擬機器器,在虛擬機器器裡的所有操作,都不會對真實機造成影響。

#名稱空間分為六大類,可以從各個方面來對系統資源空間進行隔離;

Linux 的 NameSpace

- [x] UTS、NETWORK、MOUNT、USER、PID、IPC

UTS:

#主機名名稱空間,作用:分割主機名,即在容器內修改主機名,不會對宿主機的系統造成影響,實現主機名的隔離;

沒有隔離前,修改主機名為zhangsan,重新開啟一個終端,主機名也被修改為zhangsan


[root@localhost ~]# hostname zhangsan   #臨時設定主機名

[root@localhost ~]# bash         #立刻生效

[root@zhangsan ~]#

使用unshare命令模擬主機名的名稱空間,修改主機名為namespace,重新開啟一個終端,主機名沒有發生變化,還是zhangsan


[root@zhangsan ~]# unshare -u /bin/bash

[root@zhangsan ~]# hostname namespace   #臨時設定主機名

[root@zhangsan ~]# bash           #立刻生效

[root@namespace ~]#

NETWORK:網路名稱空間,作用:分割網路,即容器內的網路設定和宿主機相互之間不受干擾的;

例如:

​ #在真實機器上的網路卡名為eth0,IP地址為192.168.1.10/24;

​ #而在容器內的網路卡名可以為ens33,ip地址為10.10.10.10/24;

MOUNT:

#掛載名稱空間,作用:隔離檔案系統,在容器內掛載的光碟或nfs共用目錄,宿主機是無法看到裡面的內容的;

例如:

​ #在linux系統上,建立一個虛擬機器器,在真機的/var/lib/ftp中掛載了一個光碟檔案,但是在虛擬機器器的/var/lib/ftp中是沒有光碟內容的,這就是MOUNT隔離;

USER:

#使用者名稱空間,作用:隔離使用者,即容器內建立的使用者不能用於登入宿主機,真機機裡建立的使用者也不能作用於容器;

PID:

#程序名稱空間,作用:為了防止容器和宿主機中的程序衝突;

例如:

​ #在真實機中,有一個服務: nfs,PID為2250;

​ #在容器內,也有一個服務: chrony,PID為2250;

​ #真實機中使用者,殺死(kill) PID號為2250的程序時,並不會對容器內的程序2250產生影響;

​ #而容器內的使用者,殺死(kill) PID號為2250的程序時,也並不會對真實機內的程序2250產生影響;

IPC:

#訊號向量名稱空間,作用:通常和PID一起使用;

#使用者殺死一個程序時,實際上是向程序傳送一個訊號(IPC),程序接收到這個訊號後會執行對應的操作;

docker 的優缺點

優點

- [x] 相比於傳統的虛擬化技術,容器更加簡潔高效

- [x] 傳統虛擬機器器需要給每個 VM 安裝作業系統

- [x] 容器使用的共用公共庫和程式

缺點

- [x] 容器的隔離性沒有虛擬機器器強

- [x] 共用Linux核心,安全性有先天缺陷

docker 與傳統虛擬化的對比

虛擬化:

#例如:虛擬機器器的使用,每一個虛擬機器器都要安裝獨立的作業系統;

容器:

#不需要安裝獨立的作業系統,只有一個Docker程序,和宿主機共用作業系統;

#容器沒有作業系統,啟動容器就跟開啟一個程序一樣,簡單高效;

容器的高效性:

#啟動虛擬機器器中的應用程式,需要先啟動虛擬機器器的作業系統,然後再啟動應用程式;

#啟動容器內的應用程式,直接啟動應用程式即可;

解除安裝防火牆和selinux(以kube-node1為例,kube-node2類似操作)

[root@localhost ~]# yum  -y remove  firewalld-*

[root@localhost ~]# vim /etc/selinux/config

SELINUX=disabled

設定IP地址和主機名(以kube-node1為例,kube-node2類似操作)

[root@localhost ~]# echo kube-node1 > /etc/hostname 

使用nmcli命令設定IP地址,閘道器,dns(以kube-node1為例,kube-node2類似操作)

[root@kube-node1 ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 192.168.11.148/24 ipv4.gateway 192.168.11.254 ipv4.dns 114.114.114.114 connection.autoconnect yes

[root@kube-node1 ~]# nmcli connection up eth0

[root@kube-node1 ~]# reboot