wordpress 瀏覽量排序b2b網(wǎng)站推廣優(yōu)化
Docker 網(wǎng)絡(luò)實(shí)現(xiàn)原理
Docker使用Linux橋接,在宿主機(jī)虛擬一個(gè)Docker容器網(wǎng)橋(docker0),Docker啟動(dòng)一個(gè)容器時(shí)會(huì)根據(jù)Docker網(wǎng)橋的網(wǎng)段分配給容器一個(gè)IP地址,稱為Container-IP,同時(shí)Docker網(wǎng)橋是每個(gè)容器的默認(rèn)網(wǎng)關(guān)。因?yàn)樵谕凰拗鳈C(jī)內(nèi)的容器都接入同一個(gè)網(wǎng)橋,這樣容器之間就能夠通過容器的 Container-IP 直接通信。
docker 網(wǎng)絡(luò)模式
host
使用host模式容器使用宿主機(jī)的網(wǎng)絡(luò)直接公開服務(wù),這意味著如果你在容器運(yùn)行一個(gè)web服務(wù),那么它直接綁定主機(jī)的網(wǎng)絡(luò)接口上,而不是通過docker進(jìn)行任何網(wǎng)絡(luò)轉(zhuǎn)發(fā)
總結(jié):與宿主機(jī)共享網(wǎng)絡(luò)命名空間/網(wǎng)絡(luò)協(xié)議棧。
container
使用這種模式允許容器共享另一個(gè)容器的網(wǎng)絡(luò)命名空間,這意味著兩個(gè)容器可以有相同的網(wǎng)絡(luò)接口和IP地址,如果他們共享是同一個(gè)網(wǎng)絡(luò)命名空間的話。
總結(jié):多個(gè)容器之間共享一個(gè)networknamespace。
node
這是最簡(jiǎn)單的網(wǎng)絡(luò)模式,此網(wǎng)絡(luò)模式表示容器擁有自己的網(wǎng)絡(luò)命名空間,但不會(huì)進(jìn)行任何網(wǎng)絡(luò)配置,這實(shí)際上給用戶完全自主權(quán)來自配置及容器的網(wǎng)絡(luò)。
總結(jié):自閉空間。
birdge
這是docker默認(rèn)網(wǎng)絡(luò)模式,每個(gè)新創(chuàng)建的容器都將從該網(wǎng)絡(luò)中分配一個(gè)IP地址,此網(wǎng)絡(luò)模式允許所有docker容器(宿主機(jī))之間相互通信。
總結(jié):通過veth對(duì)連接容器與docker0網(wǎng)橋,網(wǎng)橋分配給容器IP,同時(shí)docker0作為“局域網(wǎng)”內(nèi)容器網(wǎng)關(guān),最后和宿主機(jī)網(wǎng)卡通信。
外加:自定義
docker允許用戶創(chuàng)建自己定義的網(wǎng)絡(luò),用戶可以定義網(wǎng)絡(luò)范圍,子網(wǎng),路由等參數(shù),這種類型的網(wǎng)絡(luò)使得我們的用戶可以更好的對(duì)容器網(wǎng)絡(luò)進(jìn)行控制和隔離。
docker容器狀態(tài)
docker 主要有7個(gè)狀態(tài)1、created 已創(chuàng)建,還未運(yùn)行的容器
2、running 正在運(yùn)行中的容器
3、restartin 容器正在啟動(dòng)中
4、removing 容器正在遷移中
5、paused 停止?fàn)顟B(tài)的容器
6、exited 已暫停狀態(tài)的容器
7、dead 死亡 主要是操作系統(tǒng)出現(xiàn)異?;驍嚯婈P(guān)機(jī)等有可能引發(fā)的狀態(tài)
命令
隨機(jī)映射端口 docker run -d --name test1 -P nginx
指定映射端口 docker run -d --name test2 -p 43000:80 nginx
查看docker網(wǎng)絡(luò)列表 docker network ls
查看容器進(jìn)程號(hào) docker inspect -f '{{.State.Pid}}' 容器id
查看容器的進(jìn)程、網(wǎng)絡(luò)、文件系統(tǒng)等命名空間編號(hào)
ls -l /proc/進(jìn)程/ns根據(jù)容器id創(chuàng)建相同網(wǎng)絡(luò)的容器
docker run -itd --name test2 --net=container:容器id centos:7 創(chuàng)建自定義網(wǎng)絡(luò),先自定義網(wǎng)絡(luò),再使用指定IP運(yùn)行docker
docker network create --subnet=172.18.0.0/16 --opt
"com.docker.network.bridge.name"="docker1" mynetwork
docker run -itd --name test4 --net mynetwork --ip 172.18.0.10 centos:7
資源控制
CPU 資源控制
cgroups,是一個(gè)非常強(qiáng)大的linux內(nèi)核工具,他不僅可以限制被 namespace 隔離起來的資源, 還可以為資源設(shè)置權(quán)重、計(jì)算使用量、操控進(jìn)程啟停等等。 所以 cgroups(Control groups)實(shí)現(xiàn)了對(duì)資源的配額和度量。
cgroups有四大功能:
1、資源限制:可以對(duì)任務(wù)使用的資源總額進(jìn)行限制。
2、優(yōu)先級(jí)分配:通過分配的cpu時(shí)間片數(shù)量以及磁盤IO帶寬大小,實(shí)際上相當(dāng)于控制了任務(wù)運(yùn)行優(yōu)先級(jí)。
3、資源統(tǒng)計(jì):可以統(tǒng)計(jì)系統(tǒng)的資源使用量,如cpu時(shí)長,內(nèi)存用量等。
4、任務(wù)控制:cgroup可以對(duì)任務(wù)執(zhí)行掛起、恢復(fù)等操作。
設(shè)置CPU使用率上限
查看當(dāng)前cpu使用率
cd /sys/fs/cgroup/cpu/docker/容器id/
cat cpu.cfs_quota_us 表示該cgroups限制占用的時(shí)間
cat cpu.cfs_period_us cpu分配的周期
設(shè)置50%的比例分配CPU使用時(shí)間上限
可以重新創(chuàng)建一個(gè)容器并設(shè)置限額
docker run -itd --name test6 --cpu-quota 50000 centos:7 /bin/bash
或者
echo 50000 > cpu.cfs_quota_us
cgroup資源限制
cgroup 控制的是內(nèi)核資源--》 間接控制中cpu 的資源--》控制這 中的進(jìn)程資源--》 docker容器的資源--》 docker容器內(nèi)應(yīng)用的資源
控制的主題包括cpu 、內(nèi)存、I/O。
主要介紹的CPO資源的控制,而CPU資源控制的方式主要有:
1、cpu-shares 權(quán)重指的的是多個(gè)容器同一個(gè)cpu下,被分配到CPu資源的機(jī)會(huì)占比。
2、cpu-period周期指的是 CPU在給與當(dāng)前管理,控制的容器分配資源時(shí),CPU的分配周期 ,默認(rèn)周期1S,此項(xiàng)配置可以運(yùn)行時(shí)直接指定。
3、quest-cpus 指定容器,僅能使用指定CPU,比如 0、1、2、3, 假設(shè)使用0和2可以用這種方式指定cpu核心。
Docker 的數(shù)據(jù)管理
管理 Docker 容器中數(shù)據(jù)主要有兩種方式:數(shù)據(jù)卷(Data Volumes)和數(shù)據(jù)卷容器(DataVolumes Containers)。
1.數(shù)據(jù)卷
數(shù)據(jù)卷是一個(gè)供容器使用的特殊目錄,位于容器中。可將宿主機(jī)的目錄掛載到數(shù)據(jù)卷上,對(duì)數(shù)據(jù)卷的修改操作立刻可見,并且更新數(shù)據(jù)不會(huì)影響鏡像,從而實(shí)現(xiàn)數(shù)據(jù)在宿主機(jī)與容器之間的遷移。數(shù)據(jù)卷的使用類似于 Linux 下對(duì)目錄進(jìn)行的 mount 操作。
2.數(shù)據(jù)卷容器
如果需要在容器之間共享一些數(shù)據(jù),最簡(jiǎn)單的方法就是使用數(shù)據(jù)卷容器。數(shù)據(jù)卷容器是一個(gè)普通的容器,專門提供數(shù)據(jù)卷給其他容器掛載使用。
創(chuàng)建一個(gè)容器作為數(shù)據(jù)卷容器
docker run --name web2 -v /data1 -v /data2 -it centos:7 /bin/bash
echo "this is web2" > /data1/abc.txt
echo "THIS IS WEB2" > /data2/ABC.txt使用 --volumes-from 來掛載 web2 容器中的數(shù)據(jù)卷到新的容器
docker run -it --volumes-from web2 --name web3 centos:7 /bin/bash
cat /data1/abc.txt
cat /data2/ABC.txt
端口映射
在啟動(dòng)容器的時(shí)候,如果不指定對(duì)應(yīng)的端口,在容器外是無法通過網(wǎng)絡(luò)來訪問容器內(nèi)的服務(wù)。端口映射機(jī)制將容器內(nèi)的服務(wù)提供給外部網(wǎng)絡(luò)訪問,實(shí)質(zhì)上就是將宿主機(jī)的端口映射到容器中,使得外部網(wǎng)絡(luò)訪問宿主機(jī)的端口便可訪問容器內(nèi)的服務(wù)。
隨機(jī)映射端口(從32768開始)
docker run -d --name test2 -p 43000:80 nginx 指定映射端口
容器互聯(lián)
容器互聯(lián)是通過容器的名稱在容器間建立一條專門的網(wǎng)絡(luò)通信隧道。簡(jiǎn)單點(diǎn)說,就是會(huì)在源容器和接收容器之間建立一條隧道,接收容器可以看到源容器指定的信息。
創(chuàng)建并運(yùn)行源容器取名web1
docker run -itd -P --name web1 centos:7 /bin/bash 創(chuàng)建并運(yùn)行接收容器取名web2,使用--link選項(xiàng)指定連接容器以實(shí)現(xiàn)容器互聯(lián)
docker run -itd -P --name web2 --link web1:web1 centos:7 /bin/bash --link 容器名:連接的別名進(jìn)web2 容器, ping web1
docker exec -it web2 bash
ping web1