Linux Container(LXC) 是一種內核虛擬化技術,能夠提供輕量級的虛擬化,以便隔離進程和資源html
Docker是PAAS(平臺服務,Platform-as-a-service)提供商dotCloud開源的一個基於LXC(Linux Container)的高級容器引擎,源代碼託管在Github上,基於go語言並聽從Apache2.0協議開源node
Docker設想是交付運行環境如同海運,OS如同一個貨輪。每個在OS基礎上的軟件都如同一個集裝箱,用戶能夠經過標準化手段自由組裝運行環境,同事集裝箱的內容能夠由用戶自定義,也能夠由專業人員製造。(集裝箱:容器隔離, 集裝箱內容能夠用過自動化手段進行自由組裝,集裝箱內容就是容器的內容,如Appliaction)mysql
容器虛擬化VS傳統虛擬化linux
VM:徹底虛擬化 寄居架構 不一樣應用程序內核隔離 安全性高web
Container: 簡化Guest OS 節省空間 安全性差(應用程序共享同一個內核Docker Engine)sql
鏡像倉庫docker
Docker自身組件apache
Docker Clientjson
Docker Server 接受用戶經過客戶端發送的請求,按照相應的路由規則實現路由分發ubuntu
Docker 鏡像 運行以後變成容器(docker run)/封裝好的運行環境/
空白層:應用優先級大於底層 爲應用特殊配置做處理
Docker 分層管理資源
yum
yum update
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates | sort -r
yum install docker-ce-17.12.1.ce
rpm
https://download.docker.com/linux/centos/7/x86_64/stable/Packages
script 經過官方的安裝腳本,安裝
yum update
curl -ssl https://get.docker.com/ | sh
systemctl start docker
systermctl enable docker
docker run hello-world 官方運行環境
systemctl stop firewalld // 肯定技術環境
systemctl disable firewalld // 肯定防火牆狀態
getenforce // 肯定SELinux(Security-Enhanced Linux)狀態
systemctl start iptables // 肯定iptables狀態-未啓動 yum -y install iptables-services
systemctl enable iptables
iptables -F // 清空默認規則
service iptables save // 保存默認規則
systemctl start dockersystemctl enable docker
docker version // 查看版本信息
docker run hello-world
docker ps //查看當前正在運行的容器
docker ps -a //查看全部容器的狀態
docker start/stop id/name //啓動/中止某個容器
docker attach id //進入某個容器(使用exit退出後容器也跟着中止運行)
docker exec -ti id //啓動一個僞終端以交互式的方式進入某個容器(使用exit退出後容器不中止運行
docker images //查看本地鏡像
docker rm id/name //刪除某個容器
docker rmi id/name //刪除某個鏡像
docker run --name test -ti ubuntu /bin/bash //複製ubuntu容器而且重命名爲test且運行,而後以僞終端交互式方式進入容器,運行bash
docker build -t soar/centos:7.1 . //經過當前目錄下的Dockerfile建立一個名爲soar/centos:7.1的鏡像
docker run -d -p 2222:22 --name test soar/centos:7.1 //以鏡像soar/centos:7.1建立名爲test的容器,並之後臺模式運行,並作端口映射到宿主機2222端口,P參數重啓容器宿主機端口會發生改變
阿里雲Docker官網 https://dev.aliyun.com/search.html
sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{ "registry-mirrors": [ "https://1nj0zren.mirror.aliyuncs.com", "https://docker.mirrors.ustc.edu.cn", "http://f1361db2.m.daocloud.io", "https://registry.docker-cn.com" ]}EOFsudo systemctl daemon-reloadsudo systemctl restart dockerdocker infodocker rmi node:latesttime docker pull node:latest
(mirror須要阿里雲申請 申請地址)
docker info 查看詳情
使用鏡像先後,可以使用 time
統計所花費的總時間。測速前先移除本地的鏡像!
WordPress安裝(blog 系統)
docker pull wordpressdocker pull mariadbdocker run --name db --env MYSQL_ROOT_PASSWORD=example -d mariadbdocker run --name MyWordPress --link db:mysql -p 18888:80 -d wordpress
Docker 提倡理念是「一個容器一個進程」,假設一個服務須要多個進程組成,急須要多個容器組成一個系統,相互分工和配合對外提供完整服務
好比:blog system
組件1:mariadb
組件2:WordPress的apache web
在啓動容器時,同一臺主機下若是兩個容器之間須要由數據交流,使用--link選項創建兩個容器之間的關聯,前提是創建mariadb已經開啓
docker start db
docker start MywordPress
中止:
docker stop db MywordPress
Docker Compose(容器編排工具),容許用戶在一個模塊(YAML格式)中定義一組相關聯的容器,會根據--link等參數,對啓動的優先級進行排序。
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-composeddocker versiondocker-compose version-f 指定yaml文件位置ps 現實全部容器信息restart 從新啓動容器logs 查看日誌信息config -q 驗證yaml配置文件是否正確stop 中止容器start 啓動容器up -d 啓動容器項目(區別與start 會建立容器, start僅是啓動容器)pause 暫停容器unpause 恢復暫停rm 刪除容器
Docker三個概念:倉庫(repository),鏡像(image),容器(container)
docker run --name MyWordPress -link db:mysql -p 8080 -d wordpress
Docker指令的基本用法:
docker+命令關鍵字(Command)+一系列參數
docker info // 守護進程的系統資源設置docker search // Docker 倉庫的查詢docker pull // Docker 倉庫的下載docker iamges // Docker 鏡像的查詢docker rmi // Docker 鏡像的刪除,已經運行的容器祖耀刪除容器docker ps // 容器的查詢docker run // 容器的建立啓動docker start/stop // 容器啓動中止docker rm // 只能刪除中止容器# Docker 指令除了單條使用外,還支持複製、解析變量、嵌套使用
鏡像的整體使用資源數不能經過簡單的Size相加,由於鏡像資源分層,鏡像能夠共用底層的部分資源
容器建立後的操做
docker ps --no-true // 查看docker stop/start CONTAINERID // 中止docker start/stop Name // 經過容器別名啓動/中止docker inspect Name // 查看容器全部基本信息docker logs Name // 查看容器日誌docker stats Name // 查看容器所佔用的系統資源docker exec Name // 容器內執行命令 // 容器內執行命令docker exec -it 容器名 /bin/bash // 登入容器的bash,進行交互式管理-------run的延伸---------restart=always // 容器的自動啓動-h x.xx.xx // 設置容器主機名--dns xx.xx.xx.xx //設置容器使用的DNS服務器--dns-search // DNS搜索設置--add-host hostname:IP // 注入hostname<>IP解析--rm // 服務中止時自動刪除
容器建立時須要指定鏡像,每一個鏡像都由惟一的標示ImageId,和容器的Container ID同樣,默認128位,可使用前16位縮略形式,也可使用鏡像名和版本號兩部分組合惟一標示,若是省略版本號,默認使用最新版本標籤(latesr)
鏡像分層:Docker的鏡像經過聯合文件系統(union filesystem)將各層文件系統疊加在一塊兒
bootfs:用於系統引導的文件系統,包括bootloader和kernel,容器啓動完成後會被寫在以節省內存資源
roofs:位於boofs之上,表現爲Docker容器的根系統
傳統模式中,系統啓東時,內核掛在rootfs時會首先將其掛載爲「只讀」模式,完整性自檢完成後將其掛載爲讀寫模式
Docker中,rootfs由內核掛載爲「只讀」模式,然後經過UPS技術掛載一個「可寫」層。
已有的分層只能讀不能改
上層鏡像優先級大於底層鏡像
建立鏡像
Container >Image: docker commit CID -t xx.xx.xx
工做在前臺的守護進程,至少一個。
DockerFile
DockerFile是一種被Docker程序解釋的腳本,DockerFile由一條條的指令組成,每條指令對應LInux下面的一條命令。Docker程序將這些DockerFile指令翻譯真正的Linux命令。DockerFile有本身書寫格式和支持的命令,Docker程序解決這些命令間的依賴關係,相似於MakeFile。Docker程序將讀取DockerFile,根據指令生成指定的Image
生成命令:docker build -t guyu/jdk-tomcat
Demo commit 建立Mysql鏡像
docker pull hub.c.163.com/public/centos:6.7-toolsdocker run --name mysql -d hub.c.163.com/public/centos:6.7-toolsdocker exec -it mysql /bin/bashyum install mysql service mysqld startmysqladmin -uroot password 123docker commit mysql mysql:5.1
[Docker File 教程](https://www.runoob.com/docker/docker-dockerfile.html
容器與容器之間 memspace, docker0網橋進行通信
容器訪問外部網絡 snat
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -o docker0 -j MASQUERADE
外部網絡訪問容器 dnat
docker run -d -p 80:80 apacheiptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKERiptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80
namespace
默認網橋 docker 0 add 172.0.0.1
-b --bridge="" 指定Docker使用的網橋設備,默認狀況下Docker會自動建立和使用docker0網橋設備,經過此參數可使用已經存在的設備。
--bip 指定Docker0的IP和掩碼,使用標準的CIDR形式,如10.10.10.10/24
--dns配置容器的DNS,在啓動Docker進程是添加,全部容器所有失效
--dns用於指定啓動的容器的DNS
--net用於指定容器的網絡通信方式,有如下四個值
bridge: Docker默認方式,網橋模式
none:容器沒有網絡棧
container:使用其餘容器的網絡棧,Docker容器會加入其餘的容器的netword namespace
host:標示容器使用HOst的網絡,沒有本身獨立的網絡棧,容器能夠徹底訪問host 的網絡,不安全
-p/P選項的使用格式
-p :
-p
-p
-p
-P(大):暴露所須要的全部端口
docker port ContainerName 能夠查看容器當前的映射關係
docker network ls 查看當前可用網絡類型
docker network create -d 類型 網絡空間名稱
類型分爲:
overlay network 覆蓋性網絡,不一樣主機的通信
bridge network 網橋
docker運行時指定網絡空間 --network=XXXX,
建立網橋
Docker鏡像由多個只讀層疊加而成,容器啓動時,Docker會家在只讀鏡像層並在鏡像棧頂部添加一個讀寫層
若是運行中的容器修改了現有的一個已經存在的文件,那麼該文件將從讀寫層下面的只讀層複製到讀寫層,該文件的只讀版本仍然存在,只是已經被讀寫層中該文件的副本所隱藏,次即「寫時複製」機制。
關閉並重啓容器,其數據不受影響;但刪除Docker容器,則其改變將會所有丟失
存在問題
存在與聯合文件系統中,不易於宿主機訪問
容器間數據共享不便
刪除容器其數據會丟失但
解決方案:「卷」
Volume 能夠在運行容器時即完成建立與綁定操做。固然,前提須要擁有對應的聲明
Volume 的初中就是數據持久化
Volume
BInd mount volume 綁定卷,人爲操做,可爲操做系統中的任意目錄
Docker-managed volueme 人爲設置,引導後,轉化爲Docker自主管理,存儲目錄通常爲var/lib/docker的目錄
Docker-managed Volumedocker run -it --name roc -v MOUNTDIR roc/lamp:v1.0docker inspect -f {{.Mounts}} rocBind-mount Volume docker run -it --name roc -v HOSTDIR:VOLUMEDIR roc/lamp:v1.0Union Volume docker run -it --name roc --volumes-from ContainerName roc/lamp:v1.0
學習定義自管理卷
存儲驅動(storage driver)是Docker的核心組件,它是Docker實現分紅鏡像的基礎
device mapper(DM):性能和穩定性存在問題,不推薦生產環境使用
btrfs:社區實現了btrfs driver,穩定性和性能存在問題
overlayfs:內核3.18 overlayfs進入主線,性能和穩定性優異,第一選擇
overlayer 工做原理
CGroup是Control Groups的縮寫,是Linux內核提供的一種能夠限制、記錄、隔離進程組(process groups)所使用的物理資源(如 cpu memory i/o等等)的機制。2007年進入Linux2.6.24內核,CGroups不是全新創造的,它將進程管理從cpuset中剝離出不來,做者是Google的paulMenage
默認狀況下,若是不對容器作任何限制,容器可以詹同當前系統能給容器提供的全部資源
Docker限制能夠從Memory、CPU、Block I/O三個方面
OOME:Out Of Memory Exception
一旦發生OOME,任何進程都有可能被殺死,包括docker daemon在內
爲此,Docker調整了docker daemon的OOM優先級,以免被內核關閉。
爲應用作內存壓力測試,理解正常業務需求下使用內存狀況,而後才能進入生產環境中使用。
必定要限制容器的內存使用上線
儘可能保證主機的資源充足,一旦經過監控發現資源不足,就進行擴容或者對容器進行遷移。
若是能夠(內存資源充足的狀況),儘可能不要使用swap,swap的使用會致使內存計算複雜,對調度器很是不友好。
在Docker啓動參數中,和內存限制有關的包括(參數的值通常是內存大小,也就是一個正數,後面跟着內存單位b、k、m、g,分別對應bytes、KB、MB和GB);
-m --memeory:容器能使用的最大內存大小,最小值爲4m
--memory-swap:容器可以使用的swap大小
--memory-swappiness:默認狀況喜好,主機能夠把容器使用的匿名頁(anonymous page)swap出來,你能夠設置一個0-100之間的值,表明容許swap出來的比例
--memory-reservation:設置一個內存使用的soft limit,設置值小於-m設置
--kernel-memory:容器可以使用的kernel memory大小,最小值爲4m。
--oom-kill-disable:是否運行OOM的時候殺死容器。只有設置了-m,才能夠把這個選項設置爲false,不然容器會耗盡主機內存,並且致使主機應用被殺死。
不設置swap時,默認爲ram的2倍。通常不啓用swap空間