天天看點

容器技術 - docker一、Docker簡介二、Docker安裝三、Docker容器管理四、Docker鏡像管理五、鏡像倉庫建構六、Docker中的網絡七、資料存儲八、資源限制

文章目錄

  • 一、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一、Docker簡介二、Docker安裝三、Docker容器管理四、Docker鏡像管理五、鏡像倉庫建構六、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網絡通訊示意圖

容器技術 - docker一、Docker簡介二、Docker安裝三、Docker容器管理四、Docker鏡像管理五、鏡像倉庫建構六、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進行通訊

  1. 配置真實網橋
[[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
           
  1. 使用工具配置設定位址
[[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會加載隻讀鏡像層并在鏡像棧頂部添加一個讀寫層
  • 如果運作中的容器修改了現有的一個已經存在的檔案,那麼該檔案将會從讀寫層下面的的隻讀層複制到讀寫層,該檔案的隻讀版本仍然存在,隻是已經被讀寫層中該檔案的副本所隐藏,次即“寫時複制”機制
容器技術 - docker一、Docker簡介二、Docker安裝三、Docker容器管理四、Docker鏡像管理五、鏡像倉庫建構六、Docker中的網絡七、資料存儲八、資源限制

7.2 資料卷的意義

  • Volume可以在運作容器時即完成建立與綁定操作。當然,前提需要擁有對應的申明
  • Volume的初衷就是資料持久化
容器技術 - docker一、Docker簡介二、Docker安裝三、Docker容器管理四、Docker鏡像管理五、鏡像倉庫建構六、Docker中的網絡七、資料存儲八、資源限制

7.3 資料卷的類型

  • Bind mount volume
  • Docker-managed volume
容器技術 - docker一、Docker簡介二、Docker安裝三、Docker容器管理四、Docker鏡像管理五、鏡像倉庫建構六、Docker中的網絡七、資料存儲八、資源限制

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進入主線,性能和穩定性優異,第一選擇
容器技術 - docker一、Docker簡介二、Docker安裝三、Docker容器管理四、Docker鏡像管理五、鏡像倉庫建構六、Docker中的網絡七、資料存儲八、資源限制
[[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 參數示意圖

容器技術 - docker一、Docker簡介二、Docker安裝三、Docker容器管理四、Docker鏡像管理五、鏡像倉庫建構六、Docker中的網絡七、資料存儲八、資源限制

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