文章目錄
- 一、Docker簡介
-
- 1.1 Docker誕生
- 1.2 Docker相關解釋
- 1.3 Docker與傳統虛拟化對比
- 1.4 Docker的構成
- 二、Docker安裝
-
- 2.1 Docker的安裝方式
- 2.2 Docker鏡像加速配置
- 2.3 Docker化應用體驗
- 三、Docker容器管理
-
- 3.1 Docker基礎概念
- 3.2 Docker基礎指令
- 3.3 單一容器管理指令
- 3.4 Run延伸
- 3.5 Docker-Compose
- 四、Docker鏡像管理
-
- 4.1 鏡像的特性
- 4.2 容器轉換為鏡像
- 4.3 Dockerfile
- 4.4 鏡像的導出以及導入
- 五、鏡像倉庫建構
-
- 5.1 官方倉庫建構方式
- 5.2 Harbor建構
- 六、Docker中的網絡
-
- 6.1 Linux 核心中的 NameSpace
- 6.2 Docker網絡通訊示意圖
- 6.3 Docker中的防火牆規則
- 6.4 Docker網絡的修改
- 6.5 端口的暴露方式
- 6.6 網絡隔離
- 七、資料存儲
-
- 7.1 資料卷特性
- 7.2 資料卷的意義
- 7.3 資料卷的類型
- 7.4 容器中使用資料卷的方法
- 7.5 存儲驅動
- 八、資源限制
-
- 8.1 記憶體資源限制
- 8.2 記憶體限制設定方式
- 8.3 參數示意圖
- 8.4 CPU資源限制
- 8.5 限制性實驗
一、Docker簡介
所需軟體
連結:https://pan.baidu.com/s/1DrVFq6ObBqz-AN-sggUlFw
提取碼:79rr
複制這段内容後打開百度網盤手機App,操作更友善哦
1.1 Docker誕生
Docker是dotcloud公司開源的一款産品dotcloud是2010年新成立的一家公司,主要基于PAAS(PlatfromasaService)平台為開發者提供服務。2013年10月dotcloud公司改名為Docker股份有限公司
1.2 Docker相關解釋
- LinuxContainer是一種核心虛拟化技術,可以提供輕量級的虛拟化,以便隔離程序和資源
- Docker是PAAS提供商dotCloud開源的一個基于LXC的進階容器引擎,源代碼托管在Github上,基于go語言并遵從Apache2.0協定開源
- Docker設想是傳遞運作環境如同海運,OS如同一個貨輪,每一個在OS基礎上的軟體都如同一個集裝箱,使用者可以通過标準化手段自由組裝運作環境,同時集裝箱的内容可以由使用者自定義,也可以由專業人員制造
1.3 Docker與傳統虛拟化對比
比較 Docker 和傳統虛拟化方式的不同之處:
- 傳統虛拟機技術是虛拟出一套硬體後,在其上運作一個完整作業系統,在該系統上再運作所需應用程序。
- 而容器内的應用程序直接運作于宿主的核心,容器内沒有自己的核心,而且也沒有進行硬體虛拟。是以容器要比傳統虛拟機更為輕便。
- 每個容器之間互相隔離,每個容器有自己的檔案系統 ,容器之間程序不會互相影響,能區分計算資源。
1.4 Docker的構成
- Docker倉庫:https://hub.docker.com
- Docker自身元件
- DockerClient:Docker的用戶端
- DockerServer:Dockerdaemon的主要組成部分,接受使用者通過DockerClient發出的請求,并按照相應的路由規則實作路由分發
- Docker鏡像:Docker鏡像運作之後變成容器(dockerrun)
二、Docker安裝
2.1 Docker的安裝方式
Script Install
[[email protected] ~]$ yum update
[[email protected] ~]$ curl -sSL https://get.docker.com/ | sh
[[email protected] ~]$ systemctl start docker
[[email protected] ~]$ systemctl enable docker
[[email protected] ~]$ docker run hello-world
YUM Install
[[email protected] ~]$ yum update
[[email protected] ~]$ cat > /etc/yum.repos.d/docker.repo << EOF
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
[[email protected] ~]$ yum install docker
RPM Install
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
軟體包https://wws.lanzous.com/b0201bgkb
密碼:b1hf
#環境設定
[[email protected] ~]$ yum -y install iptables-services
[[email protected] ~]$ systemctl start iptables && systemctl enable iptables
[[email protected] ~]$ iptables -F && service iptables save
[[email protected] ~]$ mkdir docker && mv docker* docker/ && cd docker
#安裝docker
[[email protected] ~]$ yum -y install *
#啟動docker
[[email protected] ~]$ systemctl start docker && systemctl enable docker
#測試指令
[[email protected] ~]$ docker run hello-world
2.2 Docker鏡像加速配置
阿裡雲Docker官網:https://dev.aliyun.com/search.html
[[email protected] ~]$ cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service
[[email protected] ~]$ chmod 777 /etc/systemd/system/docker.service
[[email protected] ~]$ vim /etc/systemd/system/docker.service
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd --registry-mirror=https://kfp63jaj.mirror.aliyuncs.com
[[email protected] ~]$ systemctl daemon-reload
[[email protected] ~]$ systemctl restart docker
[[email protected] ~]$ ps -ef | grep docker
2.3 Docker化應用體驗
環境分析
WordPress運作環境需要如下軟體的支援:
- PHP5.6或更新軟體
- MySQL5.6或更新版本
- Apache和mod_rewrite子產品
#下載下傳鏡像
[[email protected] ~]$ docker pull mariadb
[[email protected] ~]$ docker pull wordpress
[[email protected] ~]$ docker run --name db --env MYSQL_ROOT_PASSWORD=example -d mariadb
#docker run 把鏡像轉換成一個容器
#--name db 給這個鏡像起一個名字db
#--env MYSQL_ROOT_PASSWORD=example 指定環境變量
#-d 背景運作容器,并傳回容器ID
#mariadb 鏡像名字
#docker run是利用鏡像生成容器,并啟動容器,而docker start是啟動一個之前生成過的容器
[[email protected] ~]$ docker run --name MyWordPress --link db:mysql -p 8080:80 -d wordpress
#--link 銜接關系
#-p 端口映射,主機(宿主)端口:容器端口
三、Docker容器管理
3.1 Docker基礎概念
Docker的三個重要概念:
-
鏡像(image)
鏡像,簡單的來說,就是面向對象中的類,相當于一個模闆。Docker 鏡像(Image)就是一個隻讀的模闆。鏡像可以用來建立 Docker 容器,一個鏡像可以建立很多容器。Docker鏡像都是隻讀的,當容器啟動時,一個新的可寫層被加載到鏡像的頂部。
-
容器(container)
Docker 利用容器(Container)獨立運作的一個或一組應用。容器是用鏡像建立的運作執行個體。可以把容器看做是一個簡易版的 Linux 環境(包括root使用者權限、程序空間、使用者空間和網絡空間等)和運作在其中的應用程式。
-
倉庫(repository)
倉庫(Repository)是集中存放鏡像檔案的場所。
Docker指令的基本用法:
docker + 指令關鍵字(COMMAND) + 一系列的參數
3.2 Docker基礎指令
指令 | 含義 |
---|---|
docker info | 守護程序的系統資源設定 |
docker search Docker | 倉庫的查詢 |
docker pull Docker | 倉庫的下載下傳 |
docker images | Docker鏡像的查詢 |
docker rmi 鏡像id | Docker鏡像的删除 |
docker ps | 容器的查詢 |
docker run | 容器的建立啟動 |
docker rm | 容器的删除 |
docker start/stop | 容器啟動停止 |
Docker指令除了單條使用外,還支援指派、解析變量、嵌套使用
3.3 單一容器管理指令
每個容器被建立後,都會配置設定一個CONTAINERID作為容器的唯一标示,後續對容器的啟動、停止、修改、删除等所有操作,都是通過CONTAINERID來完成,偏向于資料庫概念中的主鍵
指令 | 含義 |
---|---|
docker ps --no-trunc | 檢視 |
docker stop/start CONTAINERID | 停止 |
docker start/stop MywordPress | 通過容器别名啟動/停止 |
docker inspect MywordPress | 檢視容器所有基本資訊 |
docker logs MywordPress | 檢視容器日志 |
docker stats MywordPress | 檢視容器所占用的系統資源 |
docker exec 容器名 容器内執行的指令 | 容器執行指令 |
docker exec -it 容器名 /bin/bash | 登入容器的bash |
3.4 Run延伸
參數 | 含義 |
---|---|
–restart=always | 容器的自動啟動 |
-h x.xx.xx | 設定容器主機名 |
- dns xx.xx.xx.xx | 設定容器使用的DNS伺服器 |
–dns-search | DNS搜尋設定 |
–add-host hostname:IP | 注入hostname<>IP解析 |
–rm | 服務停止時自動删除 |
3.5 Docker-Compose
Compose 是用于定義和運作多容器 Docker 應用程式的工具。通過 Compose,您可以使用 YML 檔案來配置應用程式需要的所有服務。然後,使用一個指令,就可以從 YML 檔案配置中建立并啟動所有服務。
安裝Docker-compose
[[email protected] ~]$ curl -Lhttps://github.com/docker/compose/releases/download/1.14.0/docker-compose - `uname-s`-`uname -m` >/usr/local/bin/docker-compose
[[email protected] ~]$ docker version
Docker-compose用法
參數 | 含義 |
---|---|
-f | 指定使用的yaml檔案位置 |
ps | 顯示所有容器資訊 |
restart | 重新啟動容器 |
logs | 檢視日志資訊 |
config -q | 驗證yaml配置檔案是否正确 |
stop | 停止容器 |
start | 啟動容器 |
up -d | 啟動容器項目 |
pause | 暫停容器 |
unpause | 恢複暫停 |
rm | 删除容器 |
示例
[[email protected] ~]$ vim wordpress.yaml
version: '2' #版本
services: #定義一種服務
db: #第一個容器的名字
image: mysql:5.7
restart: always
environment: #環境變量
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress: #第二個容器的名字
depends_on:
- db
image: wordpress:latest
restart: always
ports:
- "8000:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
[[email protected] ~]$ mv wordpress.yaml docker-compose.yaml
[[email protected] ~]$ docker-compose up -d #啟動
[[email protected] ~]$ docker ps -a #啟動成功
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cceb5a8ed799 wordpress:latest "docker-entrypoint..." 9 minutes ago Up 9 minutes 0.0.0.0:8000->80/tcp root_wordpress_1_a2264aaee26c
d3f99d415eac mysql:5.7 "docker-entrypoint..." 9 minutes ago Up 9 minutes 3306/tcp, 33060/tcp root_db_1_87a386700a32
02428d68a259 wordpress "docker-entrypoint..." 3 weeks ago Exited (0) 3 weeks ago MyWordPress
ae0f8de9e8fd mariadb "docker-entrypoint..." 3 weeks ago Exited (0) 3 weeks ago db
8ac302f04535 hello-world "/hello" 3 weeks ago Exited (0) 3 weeks ago kickass_noyce
[[email protected] ~]$ docker-compose logs #啟動成功
四、Docker鏡像管理
4.1 鏡像的特性
容器建立時需要指定鏡像,每個鏡像都由唯一的标示ImageID,和容器的ContainerID一樣,默
認128位,可以使用前16為縮略形式,也可以使用鏡像名與版本号兩部分組合唯一标示,如果省
略版本号,預設使用最新版本标簽(latesr)
鏡像的分層: Docker的鏡像通過聯合檔案系統(union filesystem)将各層檔案系統疊加在一起
bootfs:用于系統引導的檔案系統,包括bootloader和kernel,容器啟動完成後會被解除安裝以節省
記憶體資源
roofs:位于bootfs之上,表現為Docker容器的跟檔案系統
傳統模式中,系統啟動時,核心挂載rootfs時會首先将其挂載為“隻讀”模式,完整性自檢
完成後将其挂載為讀寫模式
Docker中,rootfs由核心挂載為“隻讀”模式,而後通過UFS技術挂載一個“可寫”層
4.2 容器轉換為鏡像
[[email protected] ~]$ docker commit CID xx.xx.xx
#指定倉庫拉取鏡像
[[email protected] ~]$ docker pull hub.c.163.com/public/centos:6.7-tools
#啟動mysql容器
[[email protected] ~]$ docker run --name mysql -d hub.c.163.com/public/centos:6.7-tools
#進入容器
[[email protected] ~]$ docker exec -it mysql /bin/bash
#在容器内安裝mysql
[[email protected] /]$ yum -y install mysql mysql-server
[[email protected] ~]$ docker commit mysql mysql:5.1
4.3 Dockerfile
Dockfile是一種被Docker程式解釋的腳本,Dockerfile由一條一條的指令組成,每條指令對應Linux下面的一條指令。Docker程式将這些Dockerfile指令翻譯真正的Linux指令。Dockerfile有自己書寫格式和支援的指令,Docker程式解決這些指令間的依賴關系,類似于Makefile。Docker程式将讀取Dockerfile,根據指令生成定制的image
轉換指令
Dockerfile文法
1、FROM(指定基礎image):
建構指令,必須指定且需要在Dockerfile其他指令的前面。後續的指令都依賴于該指令指定的image。
FROM指令指定的基礎image可以是官方遠端倉庫中的,也可以位于本地倉庫
FROM centos:7.2 #有且隻有一個
FROM centos
2、MAINTAINER(用來指定鏡像建立者資訊):
建構指令,用于将image的制作者相關的資訊寫入到image中。當我們對該image執行docker inspect指令時,輸出中有相應的字段記錄該資訊。
3、RUN(安裝軟體用):
建構指令,RUN可以運作任何被基礎image支援的指令。如基礎image選擇了Centos,那麼軟體管理部分隻能使用Centos的包管理指令,需要執行shell指令,前面加run
#常用
RUN cd /tmp && curl-L http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz'|tar-xz
RUN ["/bin/bash","-c","echo hello"]
4、CMD(設定container容器 啟動時執行的操作):
設定指令,用于container啟動時指定的操作。該操作可以是執行自定義腳本,也可以是執行系統指令。該指令隻能在檔案中存在一次,如果有多個,則隻執行最後一條
5、ENTRYPOINT(設定container啟動時執行的操作):
設定指令,指定容器啟動時執行的指令,可以多次設定,但是隻有最後一個有效。
ENTRYPOINT ls -l
該指令的使用分為兩種情況,一種是獨自使用,另一種和CMD指令配合使用。當獨自使用時,如果你還使用了CMD指令且CMD是一個完整的可執行的指令,那麼CMD指令和ENTRYPOINT會互相覆寫隻有最後一個CMD或者ENTRYPOINT有效
#CMD指令将不會被執行,隻有ENTRYPOINT指令被執行
CMD echo "Hello World!"
ENTRYPOINT ls -l
另一種用法和CMD指令配合使用來指定ENTRYPOINT的預設參數,這時CMD指令不是一個完整的可執行指令,僅僅是參數部分;ENTRYPOINT指令隻能使用JSON方式指定執行指令,而不能指定參數
FROM ubuntu
CMD ["-l"]
ENTRYPOINT ["/usr/bin/ls"]
6、USER(設定container容器的使用者):
設定指令,設定啟動容器的使用者,預設是root使用者
7、EXPOSE(指定容器需要映射到主控端器的端口):
設定指令,該指令會将容器中的端口映射成主控端器中的某個端口。當你需要通路容器的時候,可以不是用容器的IP位址而是使用主控端器的IP位址和映射後的端口。要完成整個操作需要兩個步驟,首先在Dockerfile使用EXPOSE設定需要映射的容器端口,然後在運作容器的時候指定-p選項加上EXPOSE設定的端口,這樣EXPOSE設定的端口号會被随機映射成主控端器中的一個端口号。也可以指定需要映射到主控端器的那個端口,這時要確定主控端器上的端口号沒有被使用。EXPOSE指令可以一次設定多個端口号,相應的運作容器的時候,可以配套的多次使用 -p 選項。
#映射一個端口
EXPOSE 22
#相應的運作容器使用的指令
docker run -p port1 image
#映射多個端口
EXPOSE port1 port2 port3
#相應的運作容器使用的指令
docker run -p port1 -p port2 -p port3 image
#還可以指定需要映射到主控端器上的某個端口号
docker run -p host_port1:port1-p host_port2:port2 -p host_port3:port3 image
8、ENV(用于設定環境變量):建構指令,在image中設定一個環境變量
設定了後,後續的RUN指令都可以使用,container啟動後,可以通過dockerinspect檢視這個環
境變量,也可以通過在docker run --env key=value時設定或修改環境變量。假如你安裝了JAVA程式,需要設定JAVA HOME,那麼可以在Dockerfile中這樣寫:
ENVJAVA_HOME /path/to/java/dirent
9、ADD(從src複制檔案到container的dest路徑)
add 解壓
ADD <src> <dest>
<src>是相對被建構的源目錄的相對路徑,可以是檔案或目錄的路徑,也可以是一個遠端的檔案url;
<dest>是container中的絕對路徑
10、COPY(從src複制檔案到container的dest路徑)
copy不解壓
COPY <src> <dest>
11、VOLUME(指定挂載點):
設定指令,使容器中的一個目錄具有持久化存儲資料的功能,該目錄可以被容器本身使用,也可以共享給其他容器使用。我們知道容器使用的是AUFS,這種檔案系統不能持久化資料,當容器關閉後,所有的更改都會丢失。當容器中的應用有持久化資料的需求時可以在Dockerfile中使用該指令
FROM base
VOLUME ["/tmp/data"]
12、WORKDIR(切換目錄):設定指令,可以多次切換(相當于cd指令),對RUN,CMD,ENTRYPOINT生效
WORKDIR /p1 WORKDIR p2 RUN vim a.txt
13、ONBUILD(在子鏡像中執行):
ONBUILD指定的指令在建構鏡像時并不執行,而是在它的子鏡像中執行
ONBUILD ADD./app/src
ONBUILD RUN /usr/local/bin/python-build--dir /app/src
所需軟體,前面百度網盤已提供
建立一個tomcat的dockfile
[[email protected] ~]$ cat Dockerfile
FROM hub.c.163.com/public/centos:6.7 #基礎鏡像
MAINTAINER [email protected].cn #坐着資訊
ADD ./apache-tomcat-7.0.42.tar.gz /root #複制檔案到容器内
ADD ./jdk-7u25-linux-x64.tar.gz /root
ENV JAVA_HOME /root/jdk1.7.0_25 #設定環境變量
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 8080 #開放端口
ENTRYPOINT /root/apache-tomcat-7.0.42/bin/startup.sh && tailf /root/apache-tomcat-7.0.42/logs/catalina.out #執行指令
#dockerfile轉換成鏡像
[[email protected] ~]$ docker build -t tomcat:v1.0 .
#鏡像轉換成容器
[[email protected] ~]$ docker run --name tomcat -p 80:8080 tomcat:v1.0
指令不能超過128行
4.4 鏡像的導出以及導入
導出:docker save -o xx.xx.xxxx.xx.xx.tar
導入:docker load -i xx.xx.xx.tar
五、鏡像倉庫建構
5.1 官方倉庫建構方式
倉庫伺服器配置:
[[email protected] ~]$ docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always registry
[[email protected] ~]$ vim /etc/docker/daemon.json
{
"insecure-registries":["10.10.10.11:5000"]
}
客戶機設定:
[[email protected] ~]$ vim/etc/sysconfig/docker
--insecure-registry 10.10.10.11:5000 增加
curl -XGET http://10.10.10.11:5000/v2/_catalog 檢視已有鏡像
5.2 Harbor建構
https://www.yuque.com/office/yuque/0/2020/pdf/393192/1603727507994-60aba29a-b8fc-4b89-ab0c-323cc94e7dd0.pdf?from=https%3A%2F%2Fwww.yuque.com%2Fmo_ming%2Fgl7b70%2Fyixtbh
六、Docker中的網絡
6.1 Linux 核心中的 NameSpace
namespace | 系統調用參數 | 隔離内容 | 核心版本 |
---|---|---|---|
UTS | CLONE_NEWUTS | 主機名和域名 | 2.6.19 |
IPC | CLONE_NEWIPC | 信号量、消息隊列和共享記憶體 | 2.6.19 |
PID | CLONE_NEWPID | 程序編号 | 2.6.24 |
NetWork | CLONE_NEWNET | 網絡裝置、網絡棧、端口等 | 2 .6.29 |
Mount | CLONE_NEWNS | 挂載點(檔案系統) | 2.4.19 |
User | CLONE_NEWUSER | 使用者和使用者組 | 3.8 |
6.2 Docker網絡通訊示意圖
容器與容器之間通過namespace進行隔離,隔離為兩端,一端放在容器内部,充當eth0網卡,另一端放在主控端上進行連通,不同容器之前通過docker0網橋進行通信
6.3 Docker中的防火牆規則
容器通路外部網絡(防火牆nat轉換)
#防火牆的nat轉換
[[email protected] ~]$ iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -o docker0 -j MASQUERADE
外部網絡通路容器(dnat轉換)
[[email protected] ~]$ docker run -d -p 80:80 apache
iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL-j DOCKER
iptables -t nat -A DOCKER !-i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80
6.4 Docker網絡的修改
Docker程序網絡修改
- b,--bridge=””指定Docker使用的網橋裝置,預設情況下Docker會自動建立和使用docker0網橋裝置,通過此參數可以使用已經存在的裝置
- --bip指定Docker0的IP和掩碼,使用标準的CIDR形式,如10.10.10.10/24
- dns配置容器的DNS,在啟動Docker程序是添加,所有容器全部生效
Docker容器網絡修改
- -- dns用于指定啟動的容器的DNS
- --net用于指定容器的網絡通訊方式,有以下四個值
- bridge:Docker預設方式,網橋模式
- none:容器沒有網絡棧
- container:使用其它容器的網絡棧,Docker容器會加入其它容器的network namespace
- host:表示容器使用Host的網絡,沒有自己獨立的網絡棧。容器可以完全通路Host的網絡,不安全
6.5 端口的暴露方式
- p/P選項的使用格式
-p : <ContainerPort>:将制定的容器端口映射至主機所有位址的一個動态端口
-p <HostPort>:<ContainerPort>:映射至指定的主機端口
-p <IP>::<ContainerPort>:映射至指定的主機的IP的動态端口
-p <IP>:<HostPort>:<ContainerPort>:映射至指定的主機IP的主機端口
-P(大):暴露所需要的所有端口
[[email protected] ~]$ docker port ContainerName #可以檢視容器目前的映射關系
6.6 網絡隔離
基礎指令說明
#檢視目前可用的網絡類型
[[email protected] ~]$ docker network ls
#類型網絡空間名稱
[[email protected] ~]$ docker network create -d 類型 網絡空間名稱
#類型分為:
overlay
bridge
使用網絡名字空間進行隔離代碼記錄
[[email protected] ~]$ docker network create -d bridge --subnet "172.26.0.0/16" --gateway "172.26.0.1" my-bridge-network
[[email protected] ~]$ docker run -d --network=my-bridge-network --name test1 hub.c.163.com/public/centos:6.7-tools
[[email protected] ~]$ docker run -d --name test2 hub.c.163.com/public/centos:6.7-tools
使容器配置上獨立IP進行通訊
- 配置真實網橋
[[email protected] ~]$ cd /etc/sysconfig/network-scripts
[[email protected] ~]$ vi ifcfg-eth0
DEVICE=eth0
HWADDR=00:0C:29:06:A2:35
TYPE=Ethernet
UUID=34b706cc-aa46-4be3-91fc-d1f48c301f23
ONBOOT=yes
BRIDGE=br0
NM_CONTROLLED=yes
BOOTPROTO=static
[[email protected] ~]$ vi ifcfg-eth0
#改成這樣
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.216.131
NETMASK=255.255.255.0
GATEWAY=192.168.216.2
DNS=8.8.8.8
- 使用工具配置設定位址
[[email protected] ~]$ yum install -y git
[[email protected] ~]$ git clone https://github.com/jpetazzo/pipework
[[email protected] ~]$ cp pipework/pipework/usr/local/bin/
[[email protected] ~]$ docker run -itd --net=none --name=ff centos-6-x86 bash
[[email protected] ~]$ pipework br0 fl 192.168.216.135/24
七、資料存儲
7.1 資料卷特性
- Docker鏡像由多個隻讀層疊加而成,啟動容器時,Docker會加載隻讀鏡像層并在鏡像棧頂部添加一個讀寫層
- 如果運作中的容器修改了現有的一個已經存在的檔案,那麼該檔案将會從讀寫層下面的的隻讀層複制到讀寫層,該檔案的隻讀版本仍然存在,隻是已經被讀寫層中該檔案的副本所隐藏,次即“寫時複制”機制
7.2 資料卷的意義
- Volume可以在運作容器時即完成建立與綁定操作。當然,前提需要擁有對應的申明
- Volume的初衷就是資料持久化
7.3 資料卷的類型
- Bind mount volume
- Docker-managed volume
7.4 容器中使用資料卷的方法
Docker-managed Volume
[[email protected] ~]$ docker run -it --name roc -v MOUNTDIR roc/lamp:v1.0
[[email protected] ~]$ docker inspect -f {{.Mounts}} roc
Bind-mount Volume
[[email protected] ~]$ docker run -it --name roc -v HOSTDIR:VOLUMEDIR roc/lamp:v1.0
Union Volume
[[email protected] ~]$ docker run -it --name roc --volumes-from ContainerName roc/lamp:v1.0
7.5 存儲驅動
Docker存儲驅動(storage driver)是Docker的核心元件,它是Docker實作分成鏡像的基礎
- device mapper(DM):性能和穩定性存在問題,不推薦生産環境使用
- btrfs:社群實作了btrfs driver,穩定性和性能存在問題
- overlayfs:核心3.18overlayfs進入主線,性能和穩定性優異,第一選擇
[[email protected] ~]$ mount -t overlay overlay-olowerdir=./low,upperdir=./upper,workdir=./work./merged
修改為overlayfs存儲驅動
[[email protected] ~]$ echo "overlay" > /etc/modules-load.d/overlay.conf
[[email protected] ~]$ cat /proc/modules|grep overlay
[[email protected] ~]$ reboot
[[email protected] ~]$ vim /etc/systemd/system/docker.service
storage-driver=overlay\
八、資源限制
8.1 記憶體資源限制
相關說明
- CGroup是Control Groups的縮寫,是Linux核心提供的一種可以限制、記錄、隔離程序組(process groups)所使用的物力資源(如cpu memory i/o等等)的機制。2007年進入Linux2.6.24核心,CGroups不是全新創造的,它将程序管理從cpuset中剝離出來,作者是Google的Paul Menage
- 預設情況下,如果不對容器做任何限制,容器能夠占用目前系統能給容器提供的所有資源
- Docker限制可以從Memory、CPU、BlockI/O三個方面
- OOME:Out Of Memory Exception
- 一旦發生OOME,任何程序都有可能被殺死,包括docker daemon在内
- 為此,Docker調整了docker daemon的OOM優先級,以免被核心關閉
重點提示
- 為應用做記憶體壓力測試,了解正常業務需求下使用的記憶體情況,然後才能進入生産環境使用
- 一定要限制容器的記憶體使用上限
- 盡量保證主機的資源充足,一旦通過監控發現資源不足,就進行擴容或者對容器進行遷移
- 如果可以(記憶體資源充足的情況),盡量不要使用swap,swap的使用會導緻記憶體計算複雜,對排程器非常不友好
8.2 記憶體限制設定方式
在docker啟動參數中,和記憶體限制有關的包括(參數的值一般是記憶體大小,也就是一個正數,後面跟着記憶體機關b、k、m、g,分别對應bytes、KB、MB、和GB):
-m --memory:容器能使用的最大記憶體大小,最小值為4m
--memory-swap:容器能夠使用的swap大小
--memory-swappiness:預設情況下,主機可以把容器使用的匿名頁(anonymouspage)swap出來,你可以設定一個0-100之間的值,代表允許swap出來的比例
--memory-reservation:設定一個記憶體使用的softlimit,設定值小于–m設定
--kernel-memory:容器能夠使用的kernelmemory大小,最小值為4m。
--oom-kill-disable:是否運作OOM的時候殺死容器。隻有設定了-m,才可以把這個選項設定為false,否則容器會耗盡主機記憶體,而且導緻主機應用被殺死
8.3 參數示意圖
8.4 CPU資源限制
Docker提供的CPU資源限制選項可以在多核系統上限制容器能利用哪些vCPU。而對容器最多能使用的CPU時間有兩種限制方式:
- 一是有多個CPU密集型的容器競争CPU時,設定各個容器能使用的CPU時間相對比例
- 二是以絕對的方式設定容器在每個排程周期内最多能使用的CPU時間
CPU限制方式
[[email protected] ~]$ docker run -it --cpu-period=50000 --cpu-quota=25000 ubuntu:16.04 /bin/bash
[[email protected] ~]$ docker run -it --cpu-period=10000 --cpu-quota=20000 ubuntu:16.04 /bin/bash
--cpuset-cpus="" 允許使用的CPU集,值可以為0-3,0,1
-c,--cpu-shares=0 CPU共享權值(相對權重),預設值1024
--cpuset-mems="" 允許在上執行的記憶體節點(MEMs)
--cpu-period=0 即可設定排程周期,CFS周期的有效範圍是1ms~1s,對應的--cpu-period的數值範圍是1000~1000000
--cpu-quota=0 設定在每個周期内容器能使用的CPU時間,容器的CPU配額必須不小于1ms,即--cpu-quota的值必須>=1000,機關微秒
--cpus 能夠限制容器可以使用的主機CPU個數,并且還可以指定如1.5之類的小數
8.5 限制性實驗
[[email protected] ~]$ docker run --name stress -it --rm -m 256m lorel/docker-stress-ng:latest stress-vm2
[[email protected] ~]$ docker run --name stress -it --rm --cpus 2 lorel/docker-stress-ng:latest stress --cpu 8
[[email protected] ~]$ docker run --name stress -it --rm --cpuset-cpus 0 lorel/docker-stress-ng:latest stress --cpu 8