如何制作一個(gè)官網(wǎng)sem優(yōu)化軟件選哪家
目錄
1、Docker 網(wǎng)絡(luò)
1.1 Docker 網(wǎng)絡(luò)實(shí)現(xiàn)原理
1.2 Docker 的網(wǎng)絡(luò)模式
1.3 網(wǎng)絡(luò)模式詳解
1.4 資源控制
1.5 進(jìn)行CPU壓力測(cè)試
1.6 清理docker占用的磁盤(pán)空間
1.7 生產(chǎn)擴(kuò)展
1、Docker 網(wǎng)絡(luò)
1.1 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)橋,這樣容器之間就能夠通過(guò)容器的 Container-IP 直接通信。
Docker網(wǎng)橋是宿主機(jī)虛擬出來(lái)的,并不是真實(shí)存在的網(wǎng)絡(luò)設(shè)備,外部網(wǎng)絡(luò)是無(wú)法尋址到的,這也意味著外部網(wǎng)絡(luò)無(wú)法直接通過(guò) Container-IP 訪問(wèn)到容器。如果容器希望外部訪問(wèn)能夠訪問(wèn)到,可以通過(guò)映射容器端口到宿主主機(jī)(端口映射),即 docker run 創(chuàng)建容器時(shí)候通過(guò) -p 或 -P 參數(shù)來(lái)啟用,訪問(wèn)容器的時(shí)候就通過(guò)[宿主機(jī)IP]:[容器端口]訪問(wèn)容器。
docker run -d --name test1 -P nginx?? ??? ??? ??? ??? ?#隨機(jī)映射端口(從32768開(kāi)始)
docker run -d --name test2 -p 43000:80 nginx?? ??? ?#指定映射端口
docker ps -a
CONTAINER ID ? IMAGE ? ? COMMAND ? ? ? ? ? ? ? ? ?CREATED ? ? ? ? ?STATUS ? ? ? ? ?PORTS ? ? ? ? ? ? ? ? ? NAMES
9d3c04f57a68 ? nginx ? ? "/docker-entrypoint.…" ? 4 seconds ago ? ?Up 3 seconds ? ?0.0.0.0:43000->80/tcp ? test2
b04895f870e5 ? nginx ? ? "/docker-entrypoint.…" ? 17 seconds ago ? Up 15 seconds ? 0.0.0.0:49170->80/tcp ? test1
瀏覽器訪問(wèn):http://192.168.80.10:43000?? ?、http://192.168.80.10:49170
#查看容器的輸出和日志信息
docker logs 容器的ID/名稱
1.2 Docker 的網(wǎng)絡(luò)模式
●Host:容器將不會(huì)虛擬出自己的網(wǎng)卡,配置自己的IP等,而是使用宿主機(jī)的IP和端口。
●Container:創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個(gè)指定的容器共享IP、端口范圍。
●None:該模式關(guān)閉了容器的網(wǎng)絡(luò)功能。
●Bridge:默認(rèn)為該模式,此模式會(huì)為每一個(gè)容器分配、設(shè)置IP等,并將容器連接到一個(gè)docker0虛擬網(wǎng)橋,通過(guò)docker0網(wǎng)橋以及iptables nat 表配置與宿主機(jī)通信。
●自定義網(wǎng)絡(luò) ?
kgc0 ? 172.18.0.0/24 ?172.18.0.20
安裝Docker時(shí),它會(huì)自動(dòng)創(chuàng)建三個(gè)網(wǎng)絡(luò),bridge(創(chuàng)建容器默認(rèn)連接到此網(wǎng)絡(luò))、 none 、host
docker network ls?? ? 或 ?docker network list?? ??? ??? ?#查看docker網(wǎng)絡(luò)列表
NETWORK ID ? ? NAME ? ? ?DRIVER ? ?SCOPE
2b4359d229c6 ? bridge ? ?bridge ? ?local
0fa580365d39 ? host ? ? ?host ? ? ?local
cc13aa84a223 ? none ? ? ?null ? ? ?local
#使用docker run創(chuàng)建Docker容器時(shí),可以用 --net 或 --network 選項(xiàng)指定容器的網(wǎng)絡(luò)模式
●host模式:使用 --net=host 指定。
●none模式:使用 --net=none 指定。
●container模式:使用 --net=container:NAME_or_ID 指定。
●bridge模式:使用 --net=bridge 指定,默認(rèn)設(shè)置,可省略。
1.3 網(wǎng)絡(luò)模式詳解
1.host模式
相當(dāng)于Vmware中的橋接模式,與宿主機(jī)在同一個(gè)網(wǎng)絡(luò)中,但沒(méi)有獨(dú)立IP地址。
Docker使用了Linux的Namespaces技術(shù)來(lái)進(jìn)行資源隔離,如PID Namespace隔離進(jìn)程,Mount Namespace隔離文件系統(tǒng),Network Namespace隔離網(wǎng)絡(luò)等。
一個(gè)Network Namespace提供了一份獨(dú)立的網(wǎng)絡(luò)環(huán)境,包括網(wǎng)卡、路由、iptable規(guī)則等都與其他的Network Namespace隔離。 一個(gè)Docker容器一般會(huì)分配一個(gè)獨(dú)立的Network Namespace。 但如果啟動(dòng)容器的時(shí)候使用host模式,那么這個(gè)容器將不會(huì)獲得一個(gè)獨(dú)立的Network Namespace, 而是和宿主機(jī)共用一個(gè)Network Namespace。容器將不會(huì)虛擬出自己的網(wǎng)卡、配置自己的IP等,而是使用宿主機(jī)的IP和端口。
2.container模式
在理解了host模式后,這個(gè)模式也就好理解了。這個(gè)模式指定新創(chuàng)建的容器和已經(jīng)存在的一個(gè)容器共享一個(gè)Network Namespace,而不是和宿主機(jī)共享。新創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個(gè)指定的容器共享IP、端口范圍等。同樣,兩個(gè)容器除了網(wǎng)絡(luò)方面,其他的如文件系統(tǒng)、進(jìn)程列表等還是隔離的。兩個(gè)容器的進(jìn)程可以通過(guò)lo網(wǎng)卡設(shè)備通信。
docker run -itd --name test1 centos:7 /bin/bash?? ??? ??? ?#--name 選項(xiàng)可以給容器創(chuàng)建一個(gè)自定義名稱
docker ps -a
CONTAINER ID ? IMAGE ? ? ?COMMAND ? ? ? CREATED ? ? ?STATUS ? ? ? PORTS ? ? NAMES
3ed82355f811 ? centos:7 ? "/bin/bash" ? 5 days ago ? Up 6 hours ? ? ? ? ? ? test1
docker inspect -f '{{.State.Pid}}' 3ed82355f811?? ??? ??? ?#查看容器進(jìn)程號(hào)
25945
ls -l /proc/25495/ns?? ??? ??? ??? ??? ?#查看容器的進(jìn)程、網(wǎng)絡(luò)、文件系統(tǒng)等命名空間編號(hào)
lrwxrwxrwx 1 root root 0 1月 ? 7 11:29 ipc -> ipc:[4026532572]
lrwxrwxrwx 1 root root 0 1月 ? 7 11:29 mnt -> mnt:[4026532569]
lrwxrwxrwx 1 root root 0 1月 ? 7 11:27 net -> net:[4026532575]
lrwxrwxrwx 1 root root 0 1月 ? 7 11:29 pid -> pid:[4026532573]
lrwxrwxrwx 1 root root 0 1月 ? 7 12:22 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 1月 ? 7 11:29 uts -> uts:[4026532570]
docker run -itd --name test2 --net=container:3ed82355f811 centos:7 /bin/bash
docker ps -a
CONTAINER ID ? IMAGE ? ? ?COMMAND ? ? ? CREATED ? ? ? ? ?STATUS ? ? ? ? ?PORTS ? ? NAMES
ff96bc43dd27 ? centos:7 ? "/bin/bash" ? 48 seconds ago ? Up 46 seconds ? ? ? ? ? ? test2
3ed82355f811 ? centos:7 ? "/bin/bash" ? 58 minutes ago ? Up 58 minutes ? ? ? ? ? ? test1
docker inspect -f '{{.State.Pid}}' ff96bc43dd27
27123
ls -l /proc/27123/ns?? ??? ??? ?#查看可以發(fā)現(xiàn)兩個(gè)容器的 net namespace 編號(hào)相同
lrwxrwxrwx 1 root root 0 1月 ? 7 12:27 ipc -> ipc:[4026532692]
lrwxrwxrwx 1 root root 0 1月 ? 7 12:27 mnt -> mnt:[4026532690]
lrwxrwxrwx 1 root root 0 1月 ? 7 12:27 net -> net:[4026532575]
lrwxrwxrwx 1 root root 0 1月 ? 7 12:27 pid -> pid:[4026532693]
lrwxrwxrwx 1 root root 0 1月 ? 7 12:27 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 1月 ? 7 12:27 uts -> uts:[4026532691]
3.none模式
使用none模式,Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進(jìn)行任何網(wǎng)絡(luò)配置。 也就是說(shuō),這個(gè)Docker容器沒(méi)有網(wǎng)卡、IP、路由等信息。這種網(wǎng)絡(luò)模式下容器只有l(wèi)o回環(huán)網(wǎng)絡(luò),沒(méi)有其他網(wǎng)卡。這種類型的網(wǎng)絡(luò)沒(méi)有辦法聯(lián)網(wǎng),封閉的網(wǎng)絡(luò)能很好的保證容器的安全性。
4.bridge模式
bridge模式是docker的默認(rèn)網(wǎng)絡(luò)模式,不用--net參數(shù),就是bridge模式。
相當(dāng)于Vmware中的 nat 模式,容器使用獨(dú)立network Namespace,并連接到docker0虛擬網(wǎng)卡。通過(guò)docker0網(wǎng)橋以及iptables nat表配置與宿主機(jī)通信,此模式會(huì)為每一個(gè)容器分配Network Namespace、設(shè)置IP等,并將一個(gè)主機(jī)上的 Docker 容器連接到一個(gè)虛擬網(wǎng)橋上。?? ?
(1)當(dāng)Docker進(jìn)程啟動(dòng)時(shí),會(huì)在主機(jī)上創(chuàng)建一個(gè)名為docker0的虛擬網(wǎng)橋,此主機(jī)上啟動(dòng)的Docker容器會(huì)連接到這個(gè)虛擬網(wǎng)橋上。虛擬網(wǎng)橋的工作方式和物理交換機(jī)類似,這樣主機(jī)上的所有容器就通過(guò)交換機(jī)連在了一個(gè)二層網(wǎng)絡(luò)中。
(2)從docker0子網(wǎng)中分配一個(gè)IP給容器使用,并設(shè)置docker0的IP地址為容器的默認(rèn)網(wǎng)關(guān)。在主機(jī)上創(chuàng)建一對(duì)虛擬網(wǎng)卡veth pair設(shè)備。veth設(shè)備總是成對(duì)出現(xiàn)的,它們組成了一個(gè)數(shù)據(jù)的通道,數(shù)據(jù)從一個(gè)設(shè)備進(jìn)入,就會(huì)從另一個(gè)設(shè)備出來(lái)。因此,veth設(shè)備常用來(lái)連接兩個(gè)網(wǎng)絡(luò)設(shè)備。
(3)Docker將 veth pair 設(shè)備的一端放在新創(chuàng)建的容器中,并命名為 eth0(容器的網(wǎng)卡),另一端放在主機(jī)中, 以 * 這樣類似的名字命名,并將這個(gè)網(wǎng)絡(luò)設(shè)備加入到 docker0 網(wǎng)橋中。可以通過(guò) brctl show 命令查看。veth
(4)使用 docker run -p 時(shí),docker實(shí)際是在iptables做了DNAT規(guī)則,實(shí)現(xiàn)端口轉(zhuǎn)發(fā)功能。可以使用iptables -t nat -vnL 查看。
5.自定義網(wǎng)絡(luò)
#直接使用bridge模式,是無(wú)法支持指定IP運(yùn)行docker的,例如執(zhí)行以下命令就會(huì)報(bào)錯(cuò)
docker run -itd --name test3 --network bridge --ip 172.17.0.10 centos:7 /bin/bash
//創(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
----------------------------------------------------------------------------------------------------------
#docker1 為執(zhí)行 ifconfig -a 命令時(shí),顯示的網(wǎng)卡名,如果不使用 --opt 參數(shù)指定此名稱,那你在使用 ifconfig -a 命令查看網(wǎng)絡(luò)信息時(shí),看到的是類似 br-110eb56a0b22 這樣的名字,這顯然不怎么好記。
#mynetwork 為執(zhí)行 docker network list 命令時(shí),顯示的bridge網(wǎng)絡(luò)模式名稱。
----------------------------------------------------------------------------------------------------------
docker run -itd --name test4 --net mynetwork --ip 172.18.0.10 centos:7 /bin/bash
1.4 資源控制
1.CPU 資源控制
cgroups,是一個(gè)非常強(qiáng)大的linux內(nèi)核工具,他不僅可以限制被 namespace 隔離起來(lái)的資源, 還可以為資源設(shè)置權(quán)重、計(jì)算使用量、操控進(jìn)程啟停等等。 所以 cgroups(Control groups)實(shí)現(xiàn)了對(duì)資源的配額和度量。
cgroups有四大功能:
●資源限制:可以對(duì)任務(wù)使用的資源總額進(jìn)行限制
●優(yōu)先級(jí)分配:通過(guò)分配的cpu時(shí)間片數(shù)量以及磁盤(pán)IO帶寬大小,實(shí)際上相當(dāng)于控制了任務(wù)運(yùn)行優(yōu)先級(jí)
●資源統(tǒng)計(jì):可以統(tǒng)計(jì)系統(tǒng)的資源使用量,如cpu時(shí)長(zhǎng),內(nèi)存用量等
●任務(wù)控制:cgroup可以對(duì)任務(wù)執(zhí)行掛起、恢復(fù)等操作
100000 ? 1 ? 50000 ?0.5
(1)設(shè)置CPU使用率上限
Linux通過(guò)CFS(Completely Fair Scheduler,完全公平調(diào)度器)來(lái)調(diào)度各個(gè)進(jìn)程對(duì)CPU的使用。CFS默認(rèn)的調(diào)度周期是100ms。
我們可以設(shè)置每個(gè)容器進(jìn)程的調(diào)度周期,以及在這個(gè)周期內(nèi)各個(gè)容器最多能使用多少 CPU 時(shí)間。
使用 --cpu-period 即可設(shè)置調(diào)度周期,使用 --cpu-quota 即可設(shè)置在每個(gè)周期內(nèi)容器能使用的CPU時(shí)間。兩者可以配合使用。
CFS 周期的有效范圍是 1ms~1s,對(duì)應(yīng)的 --cpu-period 的數(shù)值范圍是 1000~1000000。 周期100毫秒?
而容器的 CPU 配額必須不小于 1ms,即 --cpu-quota 的值必須 >= 1000。
docker run -itd --name test5 centos:7 /bin/bash
docker ps -a
CONTAINER ID ? IMAGE ? ? ?COMMAND ? ? ? CREATED ? ? ?STATUS ? ? ? PORTS ? ? NAMES
3ed82355f811 ? centos:7 ? "/bin/bash" ? 5 days ago ? Up 6 hours ? ? ? ? ? ? test5
cd /sys/fs/cgroup/cpu/docker/3ed82355f81151c4568aaa6e7bc60ba6984201c119125360924bf7dfd6eaa42b/
cat cpu.cfs_quota_us?
-1
cat cpu.cfs_period_us?
100000
---------------------------------------------------------------------------------------------------------
#cpu.cfs_period_us:cpu分配的周期(微秒,所以文件名中用 us 表示),默認(rèn)為100000。
#cpu.cfs_quota_us:表示該cgroups限制占用的時(shí)間(微秒),默認(rèn)為-1,表示不限制。 如果設(shè)為50000,表示占用50000/100000=50%的CPU。
---------------------------------------------------------------------------------------------------------
1.5 進(jìn)行CPU壓力測(cè)試
docker exec -it 3ed82355f811 /bin/bash
vi /cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
chmod +x /cpu.sh
./cpu.sh
top?? ??? ??? ??? ??? ?#可以看到這個(gè)腳本占了很多的cpu資源
#設(shè)置50%的比例分配CPU使用時(shí)間上限
docker run -itd --name test6 --cpu-quota 50000 centos:7 /bin/bash?? ?#可以重新創(chuàng)建一個(gè)容器并設(shè)置限額
或者
cd /sys/fs/cgroup/cpu/docker/3ed82355f81151c4568aaa6e7bc60ba6984201c119125360924bf7dfd6eaa42b/
echo 50000 > cpu.cfs_quota_us
docker exec -it 3ed82355f811 /bin/bash
./cpu.sh
top?? ??? ??? ??? ??? ?#可以看到cpu占用率接近50%,cgroups對(duì)cpu的控制起了效果
(2)設(shè)置CPU資源占用比(設(shè)置多個(gè)容器時(shí)才有效)
Docker 通過(guò) --cpu-shares 指定 CPU 份額,默認(rèn)值為1024,值為1024的倍數(shù)。
#創(chuàng)建兩個(gè)容器為 c1 和 c2,若只有這兩個(gè)容器,設(shè)置容器的權(quán)重,使得c1和c2的CPU資源占比為1/3和2/3。
docker run -itd --name c1 --cpu-shares 512 centos:7?? ?
docker run -itd --name c2 --cpu-shares 1024 centos:7
#分別進(jìn)入容器,進(jìn)行壓力測(cè)試
yum install -y epel-release
yum install -y stress
stress -c 4?? ??? ??? ??? ?#產(chǎn)生四個(gè)進(jìn)程,每個(gè)進(jìn)程都反復(fù)不停的計(jì)算隨機(jī)數(shù)的平方根
#查看容器運(yùn)行狀態(tài)(動(dòng)態(tài)更新)
docker stats
CONTAINER ID ? NAME ? ? ? ? ? ? CPU % ? ? MEM USAGE / LIMIT ? ? MEM % ? ? NET I/O ? ? ? ? ?BLOCK I/O ? ? ? ? PIDS
c3ee18e65852 ? c2 ? ? ? ? ? ? ? 66.50% ? ?5.5MiB / 976.3MiB ? ? 0.56% ? ? 20.4MB / 265kB ? 115MB / 14.2MB ? ?4
bb02d3b345d8 ? c1 ? ? ? ? ? ? ? 32.68% ? ?2.625MiB / 976.3MiB ? 0.27% ? ? 20.4MB / 325kB ? 191MB / 12.7MB ? ?4
(3)設(shè)置容器綁定指定的CPU
#先分配虛擬機(jī)4個(gè)CPU核數(shù)
docker run -itd --name test7 --cpuset-cpus 1,3 centos:7 /bin/bash
#進(jìn)入容器,進(jìn)行壓力測(cè)試
yum install -y epel-release
yum install stress -y
stress -c 4
#退出容器,執(zhí)行 top 命令再按 1 查看CPU使用情況。
2.對(duì)內(nèi)存使用的限制
//-m(--memory=) 選項(xiàng)用于限制容器可以使用的最大內(nèi)存
docker run -itd --name test8 -m 512m centos:7 /bin/bash
docker stats
//限制可用的 swap 大小, --memory-swap
強(qiáng)調(diào)一下,--memory-swap 是必須要與 --memory 一起使用的。
正常情況下,--memory-swap 的值包含容器可用內(nèi)存和可用 swap。
所以 -m 300m --memory-swap=1g 的含義為:容器可以使用 300M 的物理內(nèi)存,并且可以使用 700M(1G - 300)的 swap。
如果 --memory-swap 設(shè)置為 0 或者 不設(shè)置,則容器可以使用的 swap 大小為 -m 值的兩倍。
如果 --memory-swap 的值和 -m 值相同,則容器不能使用 swap。
如果 --memory-swap 值為 -1,它表示容器程序使用的內(nèi)存受限,而可以使用的 swap 空間使用不受限制(宿主機(jī)有多少 swap 容器就可以使用多少)。
3.對(duì)磁盤(pán)IO配額控制(blkio)的限制
--device-read-bps:限制某個(gè)設(shè)備上的讀速度bps(數(shù)據(jù)量),單位可以是kb、mb(M)或者gb。
例:docker run -itd --name test9 --device-read-bps /dev/sda:1M ?centos:7 /bin/bash
--device-write-bps : 限制某個(gè)設(shè)備上的寫(xiě)速度bps(數(shù)據(jù)量),單位可以是kb、mb(M)或者gb。
例:docker run -itd --name test10 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
--device-read-iops :限制讀某個(gè)設(shè)備的iops(次數(shù))
?
--device-write-iops :限制寫(xiě)入某個(gè)設(shè)備的iops(次數(shù))
#創(chuàng)建容器,并限制寫(xiě)速度
docker run -it --name test10 --device-write-bps /dev/sda:1MB centos:7 /bin/bash
#通過(guò)dd來(lái)驗(yàn)證寫(xiě)速度
dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct?? ??? ??? ??? ?#添加oflag參數(shù)以規(guī)避掉文件系統(tǒng)cache
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 10.0025 s, 1.0 MB/s
1.6 清理docker占用的磁盤(pán)空間
docker system prune -a?? ??? ??? ?#可以用于清理磁盤(pán),刪除關(guān)閉的容器、無(wú)用的數(shù)據(jù)卷和網(wǎng)絡(luò)
1.7 生產(chǎn)擴(kuò)展
故障:由于docker容器故障導(dǎo)致大量日志集滿,會(huì)造成磁盤(pán)空間滿
解決方案
1、清楚日志
#!/bin/bash
logs=$ (find /var/lib/docker/containers/ -name *-json.log*)
for log in $logs
do
cat /dev/null > $log
done
2、當(dāng)日志占滿之后如何處理
###設(shè)置docker日志文件數(shù)量及每個(gè)日志大小
?vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://f613ce8f.m.daocloud.io"],
"log-driver": "json-file", ? #我的一日志格式
"log-opts": { "max-size" : "500m", "max-file" : "3"} ? 日志的參數(shù)最大500M ? 我最大容器中有三個(gè)日志文件 每個(gè)日志文件大小是500M
}
修改完需要重新加載 ?systemctl daemon-reload
?