1、命名空間 (Namespaces) html
2、控制組 (Control Groups) linux
3、聯合文件系統 (Union File System) web
4、Linux 虛擬網絡支持:本地和容器內建立虛擬接口docker
實現了容器間資源的隔離,每一個容器擁有本身獨立的命名空間 , 運行其中的應用就像是運行在獨立的操做系統中同樣 , 咱們均可以看到文件系統,網卡等資源保證了容器之間互不影響,namesaces管理進程號 , 每一個進程命名空間有一套本身的進程號管理方法 , 進apache
程命名空間是一個父子關係的結構 , 子空間中的進程對於父空間是可見的。centos
控制組 (Control groups)--CGroups 是 Linux 內核的一個特性 ,主要用來對共享資源進行隔離、限制、審計等 。cgroups 容許對於進程或進程組公平( 不公平 ) 的分配 CPU 時間、內存分配和 I/O 帶寬。瀏覽器
容器經過 cgroups 來獲得所可以管理資源的分配和使用。所以容器所得到資源僅爲全部系統資源的一個部分安全
1、資源限制 : 內存子系統爲進程組設置內存使用上限,內存達到上限後再申請內存,就會發出 Out of Memorybash
2、 優先級 : 經過優先級讓一些組獲得更多 CPU 等資源網絡
3、 資源審計 : 用來統計系統上實際把多少資源用到適合的目的上 , 可使用 cpuacct 子系統記錄某個進程組使用的 CPU 時間
4、 隔離 : 爲組隔離名字空間 , 這樣一個組不會看到其餘組的進程 .網絡鏈接和文件系統
5、 控制 : 掛起 . 恢復和啓動等操做
docker 中使用AUFS(another Union File System 或 v2 版本之後的Advanced multi-layered Unification File System) 控制爲每個成員目錄設定只讀 / 讀寫 / 寫出權限 , 同時 AUFS 有一個相似分層的概念 , 對只讀權限的分支能夠邏輯上進行增量的修改.
1、Data Volume (數據卷)
2、Data Volume Dontainers --- 數據卷容器
Data Volume 本質上是 Docker Host 文件系統中的目錄或文件,使用相似與 Linux 下對目錄或者文件進行 mount 操做。數據卷能夠在容器之間共享和重用,對數據卷的更改會立馬生效,對數據卷的更新不會影響鏡像,卷會一直存在,直到沒有容器使用。
1、Data Volume 是目錄或文件,而非沒有格式化的磁盤(塊設備)。
2、容器能夠讀寫 volume 中的數據。
3、volume 數據能夠被永久的保存,即便使用它的容器已經銷燬。
1、在宿主機根目錄下建立一個目錄(數據卷)
2、啓動一個容器並將數據卷掛載到容器的目錄下
3、驗證 ( 持久化的須要映射目錄)
#
數據卷容器就是一個普通的容器,只不過是專門用它提供數據卷供其餘容器掛載使用
1、建立一個名爲 dbdata 的數據卷,並在其中建立一個數據卷掛載到 /dbdata
docker run -dti -v /dbdata --name dbser centos:latest
2、再啓動兩個容器,並使用數據卷容器
docker run -dti --volumes-from dbser --name db1 centos:latest
#
3、驗證
#
容器 db1 和 db2 同時掛載了同一個數據捲到本地相同 /dbdata目錄。三個容器任何一個目錄下的寫入,均可以時時同步到另外兩個
docker 網絡從覆蓋範圍可分爲單個 host 上的容器網絡和跨多個 host 的網絡,docker 目前提供了映射容器端口到宿主主機和容器互聯機制來爲容器提供網絡服務,在啓動容器的時候,若是不指定參數,在容器外部是沒有辦法經過網絡來訪問容器內部的網絡應用和服務的
docker network ls (查看docker 網絡)
none 網絡就是什麼都沒有的網絡。掛在這個網絡下的容器除了 lo,沒有其餘 任何網卡。容器建立時,能夠經過 --network=none 指定使用 none 網絡
封閉的網絡意味着隔離,一些對安全性要求高而且不須要聯網的應用可使用 none 網絡。
鏈接到 host 網絡的容器,共享 docker host 的網絡棧,容器的網絡配置與host 徹底同樣。能夠經過 --network=host 指定使用 host 網絡
直接使用 Docker host 的網絡最大的好處就是性能,若是容器對網絡傳輸效率有較高要求,就能夠選擇 host 網絡。固然不便之處就是犧牲一些靈活性,好比要考慮端口衝突問題,Docker host上已經使用的端口就不能再用了。
Docker host 的另外一個用途是讓容器能夠直接配置 host 網路。好比某些跨host 的網絡解決方案,其自己也是以容器方式運行的,這些方案須要對網絡進行配置,好比管理 iptables
docker 安裝時會建立一個 命名爲 docker0 的 linux bridge。若是不指定--network,建立的容器默認都會掛到 docker0 上
#
eth0@if29 與 veth04c5851 是一對 veth pair
#
veth pair 是一種成對出現的特殊網絡設備,能夠把它們想象成由一根虛擬網線鏈接起來的一對網卡,網卡的一頭(eth0@if29)在容器中,另外一頭( veth04c5851)掛在網橋 docker0 上,其效果就是將 eth0@if29也掛在了docker0 上。
# 查看網絡配置信息 ( 設置容器ip 網段、網關)
docker network inspect bridge
#
注:容器建立時,docker 會自動從 172.17.0.0/16 中分配一個 IP,這裏 16 位的掩碼保證有足夠多的 IP 能夠供容器。
經過 bridge 驅動建立相似前面默認的 bridge 網絡
1、利用bridge驅動建立名爲my-net2網橋(docker會自動分配網段)
docker network create --driver bridge my-net2
# 查看網絡配置信息
# 查看網橋
2、利用bridge驅動建立名爲my-net3網橋(user-defined (自定義)網段及網關)
docker network create --driver bridge --subnet 172.33.1.0/24 --gateway 172.33.1.1 my-net3
# 查看網絡配置信息
# 查看網橋
3、啓動容器使用新建的my-net3網絡
docker run -it --network=my-net3 busybox:latest
4、啓動容器使用my-net3網絡並指定ip(只有使用 --subnet 建立的網絡才能指定靜態 IP,若是是docker自動分配的網段不能夠指定ip)
docker run -it --network=my-net3 --ip 172.33.1.100 busybox:latest
5、讓已啓動不一樣vlan的busybox容器,能夠鏈接到my-net2(其實在busybox中新建了my-net2的網卡)(添加網卡。訪問不一樣的網段)
# #docker network connect my-net3 08493ae30117 ( 鏈接)
6、使用--name指定啓動容器名字,可使用docker自帶DNS通訊,但只能工做在user-defined 網絡,默認的 bridge 網絡是沒法使用 DNS 的。
#docker run -it --network=my-net3 --name=bbox1 busybox:latest
#docker run -it --network=my-net3 --name=bbox2 busybox:latest
7、容器之間的網絡互聯
&1、建立一個 db 容器
docker run -dti --name db centos:latest
&2、建立一個 web 容器,並使其鏈接到 容器db
docker run -dti --name web --link db:dblink centos:latest /bin/bash
--link db:dblink 實際是鏈接對端的名字和這個連接的名字,也就是和 db 容器創建一個叫作 dblink 的連接
# 測試
注:此連接通訊是單向的
8、容器端口映射
在啓動容器的時候,若是不指定參數,在容器外部是沒有辦法經過網絡來訪問容器內部的網絡應用和服務的,當容器須要通訊時,咱們可使用 -P (大) &&-p (小)來指定端口映射
(1) -P : Docker 會隨機映射一個 49000 ~ 49900 的端口到容器內部開放的網絡端口
(2) -p :則能夠指定要映射的端口,而且在一個指定的端口上只能夠綁定一個容器。
IP : HostPort : ContainerPort
IP : : ContainerPort
IP : HostPort :
docker port CONTAINER ID/NAMES
&2、映射全部接口地址,此時綁定本地全部接口上的 5200 到容器的 5200 接口,訪問任何一個本地接口的 5000 ,都會直接訪問到容器內部
docker run -dti -p 5200:5200 centos:latest /bin/bash
&3、屢次使用能夠實現多個接口的映射
docker run -dti -p 5400:5400 -p 5300:5300 centos:latest /bin/bash
&4、映射到指定地址的指定接口
此時會綁定本地 192.168.226.147 接口上的 5100 到容器的 5100 接口
docker run -dti -p 192.168.226.147:5100:5100 centos:latest /bin/bash
&5、映射到指定地址的任意接口
此時會綁定本地 192.168.226.147 接口上的任意一個接口到容器的 5500 接口
docker run -dti -p 192.168.226.147::5500 centos:latest /bin/bash
1、將容器80端口映射到主機8090端口
docker run -itd -p 192.168.226.147:8090:80 --name http-test httpd:latest
2、查看剛運行docker容器
docker ps
3、進入 容器
4、容器內部編輯網頁文件 index.html
5、到宿主機上打開瀏覽器輸入 IP:PORT 訪問驗證
6、宿主機上傳靜態網站測試文件
7、解壓
8、把解壓的目錄上傳至容器下的網站根目錄
docker cp jd 67b3daf15a40:/usr/local/apache2/htdocs
9、進入容器,刪除原來的index.html 文件
10、展開目錄
11、web 訪問