耦合
是指兩個或兩個以上的體系或者兩種運動形式間通過相互作用而批次影響以至聯合起來的現象。
Nginx與apache 在同一台服務器運行都占用80端口,起沖突這是我們修改其中一個端口為8080
半解耦
同一個操作系統中兩者共存各有各的特征 就是在同一個操作系統開啟相同的程序
解耦
在當前服務器安裝一個虛擬機在安裝服務(類似於在自己電腦上安裝的虛擬機)然后再把所需要的應用程序在裝一邊!
解耦解釋圖 半解耦解釋圖
Hard硬件 system操作系統 在硬件上安裝完操作系統以后,
Hypervisor虛擬化(相當於虛擬機) 小格子並不直接產生操作系統
Guestos(相當於vmware裝的操作系統) 而是把lib/bin文件直接軟連接
在硬件上裝一個操作系統 然后再放入app
然后安裝虛擬機在裝一個操作系統
在安裝應用程序
Docker基礎原理
Docker是一種容器,容器不是docker。
Docker是一種文件夾,欺騙應用程序:文件夾就是操作系統,然后把跟物理機重復或者沖突的內容以軟連接的方式問道文件夾里去,然后再放進去應用程序!所以容器變得很小,因為它大部分的東西跟物理機共享!
docker是半解耦狀態下的技術,在電腦當中可以讓操作系統中的程序放在容器當中分裂出來兩個且這兩個程序不沖突!
docker缺點: 權限太大 資源搶占問題
如果讓兩個程序同時運行不能重復的東西:端口,pid(也就是進程號),還有/proxy
/proc:
偽文件系統,某一個程序往內存當中調取了哪些內容(比如啟動httpd服務,
用netstat查看端口號下面有編號在proxy下 ls編號 下面的東西就是往內存調取的內容,
關閉服務就不會有這個東西)
也就是說一個程序往內存中調取了那些內容生成的文件就在proxy下。
Proc中有一個特殊的文件ns(在進程號里面)用ll查看 閃爍的代表六個“名稱空間“,如果兩個程序后面的數字相同,代表在一個匿名空間,就有可能發生沖突。
Namespace“名稱空間“(把這六項隔離,隔離以后
UTS:主機及域名
IPC:信號量,消息列隊及共享內存
Pid:進程編號
Network:網絡設備,網絡協議棧,端口等
Mount:掛載點,文件系統(四種掛載方式:私有掛載,主從掛載,shell型掛載,不可綁定掛載)
User:用戶和組
實驗:寫一個fox讓電腦當中能啟動兩個進程(編寫腳本做一個子進程,就是相當於用腳本寫一個容器,目的能啟動兩個一樣的程序然后做隔離)
vi fork_example.c (別忘了進去A然后再粘貼)
#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <sched.h>
#include <signal.h>
#include <unistd.h>
#define STACK_SIZE (1024 * 1024)
static char child_stack[STACK_SIZE];
char* const child_args[] = {
"/bin/bash",
NULL
};
int child_main(void* args) {
printf ("在子進程中!\n");
execv(child_args[0], child_args);
return 1;
}
int main() {
printf ("程序開始: \n");
int child_pid = clone(child_main, child_stack + STACK_SIZE, SIGCHLD, NULL);
waitpid(child_pid, NULL, 0);
printf ("已退出\n");
return 0;
}
ls查看是for存在這個文件
gcc -Wall fork_examp.c -o uts.o //就是把一串代碼編譯成應用程序
./uts.o 執行文件發現進入子進程
Ps 查看一下進程發現父進程有shell(bash)子進程也有
Exit 退出子進程
做UTS隔離
vi fork_example.c
./ust.o 你會發現主機名叫changebname,有兩個主機名一個是locathost 一個是changename
Exit
IPC隔離(消息列隊,程序之間通信要走消息列隊)
vi fork_example.c
Ipcs -q 查詢當前計算機列隊
Ipcmk -Q 創建列隊
創建幾個列隊然后查看
gcc -Wall fork_examp.c -o ipc.o
./ipc.o 進入子程序
Ipcs -q 查看發現沒有列隊
Exit 退出在ipcs -q 查詢發現有列隊 主進程與子進程隔離了 自己是自己的列隊
PID隔離
vi fork_example.c
Ehco $$ 腳本運行當前進程號
./pid.o
Ehco$$
但是退出子程序以后查看proxy發現子程序里是1(bin/shell),而主程序里也有1(systemd)會發生混亂!
原因:程序要運行首先要把硬盤里的一部分東西拿出來放到內存里,讓電腦隨時隨地調取,然后就會產生pid編號,pid編號和內存里的東西是對應的,放到一個文件夾里,文件夾放到了proxy目錄下,然后在主程序與子程序之間做了一個隔離,發現這個子程序進程的id是1777(不同)但是進去以后再查看變成1,但是主程序已經有一個1(systemd)但是子程序的1變成了bin/shell(這樣就會發生混亂,因為proxy目錄不相同),因為子程序(容器)沒有開機啟動順序沒有開啟第一個進程,容器不需要開機。
Mount的掛載方式(用命令):
四種掛載方式:
1、主從掛載(master影響slave,slave不影響master)
2、共享掛載(相互影響)
3、私密掛載(private 互不影響)
4、不可綁定的掛載 (unbindable)
第五種隔離網絡隔離
ip netns add test_ns ——創建一個網絡命名空間 test_ns
ip netns exec test_ns ip link list ——查看test_ns協議棧是否開啟
ip netns exec test_ns ip link set dev lo up ——開啟dev 下的lo 接口
ip netns exec test_ns ip link list ——查看test_ns協議棧是否開啟
ip netns exec test_ns ping 127.0.0.1 ——ping本地回環地址
ip link add veth0 type veth peer name veth1 ——需要與外部相連是需要創建兩個veth 創建veth0連接到對端的veth1
ip link set veth1 netns test_ns ——將veth1添加到網絡命名空間 test_ns 里
ip netns exec test_ns ifconfig veth1 10.1.1.1/24 up ——給網絡命名空間里的veth1配置一個ip並啟用
ifconfig veth0 10.1.1.2/24 up ——將本地的veth0配置一個ip並啟用
ping 10.1.1.1
Cgroup(並不是完整限制,而是優先級)
硬件資源限制(cpu用量,mem內存用量,disk硬盤用量)
Cgroup特征:
1\cgroup以偽文件系統進行管理
2\cgroup顆粒度線程級別
3\所有的資源管理都叫subsystem
4\子進程和父進程同屬同一個cgroup
5\實現方式內核附加hooks
作用:
1、 資源限制
2、 優先級分配
3、 資源統計
4、 進程控制——掛起/恢復
術語:
Task:任務。表示系統的一個進程
Cgroup:控制組。按照某個資源控制標准划分組。包含一個或多個子系統。
Subsystem:資源調度器。具體的限制措施
Hierarchy: 層級樹。放置多個cgroup
基本規則:
1、 同一個hierarchy可以附加一個或者多個subsystem
2、 一個已經附加在某個hierarchy上的subsystem不能附加到某個其他含有別的subsystem的hierarchy。
3、 一個task不能屬於同一個hierarchy的不同cgroup,但能屬於另外一個hierarchy的cgroup
4、 剛fork出的子進程在初始狀態與其父進程處於同一個cgroup
Cgroup查看命令
Yum -y install libcgroup //cgroup的工具集
Lssubsys:查看計算機有哪些子系統
Lscgroup:查看當前系統有多少個cgroup
Lssubsys -m memory :查看子進程在哪里
Lussbsys查看出來的子系統解析
Cpuset:限制對cpu的使用
cpu,cpuacct:聲稱對cpu資源的使用情況報告
memory:內存的使用量限制
devices:對設備的訪問(就是掛起的意思)
freezer:恢復/掛起
net_cls,net_prio:目前為止沒有被使用
blkio:設備的輸入輸出限制,比如硬盤,USB等
perf_event:性能測試
hugetlb:目前為止沒有被使用
pids:限制cgroup及其所有子孫cgroup里面能創建的總的task數量
linux核心技術
容器規范:OCI組織規定了兩個標准
Runtime spec //runtime:容器運行的地方
Lxc 早 docker12——lxd管理工具
Runc docker 13 獨享——docker engine 管理工具
Rkt coreOS——rkt cli 容器管理工具
Images format spec //鏡像的標准格式
Docker images——制作鏡像
Dockerfile——分層鏡像
公共:hub.docker.com/daoclud.io或者hub.docker.com/quay.io
私有:本地倉庫
三個容器操作系統:
Core.os
Atomic
Ubuntu core
編排引擎: 用來管理調度,集群,服務發現
Docker swarm
Kubernetes
Mesos
容器的網絡:
容器間通信:host bridge
跨主機的容器間通訊: macvlan overlay flannel weave calic
服務發現:
Etcd
Consul
zookeeper
監控:
Sysdig
cadvisor/heapster //圖形監控
weave scope //實時圖形監控
docker架構:
docker client //客戶端
docker daemon //服務端
image //鏡像
registry //倉庫
container //容器
docker run -d -p 80:80 httpd -d 后台運行 -p 本地端口映射到容器
base鏡像:
1、 不依賴於其他的鏡像,從scratch創建
2、 其他鏡像可以以這個為擴展基礎
制作鏡像步驟:
1、 從base鏡像運行一個容器
2、 執行一條命令對容器做修改
3、 執行打包操作。生成一個新的層
4、 Docker基於剛剛提交的鏡像運行一個新容器
5、 重復2-3,直到dockerfile全部執行完成
Dockerfile的語法:
- FROM制定base鏡像
- MAINTAINER作者。 后面接任意字符串
- Copy從本地復制文件到鏡像內
COPY src dest
COPY[“src”,”dest”]
- ADD與COPY一樣,但是如果src是壓縮包,會被自動解壓縮
- ENV 設置環境變量
ENV MY_VERSION 1.3
RUN yum install httpd-$My_VERSION
- EXPOSE 指定容器中的進程監聽某個端口號
- VOLUME 聲明儲存(后面詳細講)
- WORKDIR 指定工作目錄 (所有的命令都變為該目錄下執行)
- RUN容器中運行某條shell命令
- CMD 啟動容器后執行的命令,但是可被替換
- ENTRYPOINT 啟動后運行的命令。