Docker學習筆記

Docker

概念

a

容器是什麼

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

a

  • VM:徹底虛擬化 寄居架構 不一樣應用程序內核隔離 安全性高web

  • Container: 簡化Guest OS 節省空間 安全性差(應用程序共享同一個內核Docker Engine)sql

鏡像倉庫docker

Docker自身組件apache

  • Docker Clientjson

  • Docker Server 接受用戶經過客戶端發送的請求,按照相應的路由規則實現路由分發ubuntu

  • Docker 鏡像 運行以後變成容器(docker run)/封裝好的運行環境/

空白層:應用優先級大於底層 爲應用特殊配置做處理

Docker 分層管理資源

Docker安裝配置體驗

Docker安裝

  1. 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

  2. rpm

    https://download.docker.com/linux/centos/7/x86_64/stable/Packages

  3. 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 統計所花費的總時間。測速前先移除本地的鏡像!

Docker 應用體驗

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 Compose

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基礎概念和命令

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 // 服務中止時自動刪除

鏡像、倉庫管理

Dokcer鏡像特色

容器建立時須要指定鏡像,每一個鏡像都由惟一的標示ImageId,和容器的Container ID同樣,默認128位,可使用前16位縮略形式,也可使用鏡像名和版本號兩部分組合惟一標示,若是省略版本號,默認使用最新版本標籤(latesr)

鏡像分層:Docker的鏡像經過聯合文件系統(union filesystem)將各層文件系統疊加在一塊兒

  • bootfs:用於系統引導的文件系統,包括bootloader和kernel,容器啓動完成後會被寫在以節省內存資源

  • roofs:位於boofs之上,表現爲Docker容器的根系統

    • 傳統模式中,系統啓東時,內核掛在rootfs時會首先將其掛載爲「只讀」模式,完整性自檢完成後將其掛載爲讀寫模式

    • Docker中,rootfs由內核掛載爲「只讀」模式,然後經過UPS技術掛載一個「可寫」層。

  • 已有的分層只能讀不能改

  • 上層鏡像優先級大於底層鏡像

DockerFile

建立鏡像

  1. Container >Image: docker commit CID -t xx.xx.xx

    工做在前臺的守護進程,至少一個。

  2. 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

Docker 倉庫構建(實踐一下便可)

官方倉庫構建

Harbor 構建

Docker網絡通信

網絡通信

a

容器與容器之間 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

a

Docker 網絡模式修改

默認網橋 docker 0 add 172.0.0.1

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容器會加入其餘的容器的netword namespace

  • host:標示容器使用HOst的網絡,沒有本身獨立的網絡棧,容器能夠徹底訪問host 的網絡,不安全

-p/P選項的使用格式

  • -p : 將指定的容器端口映射到主機全部地址的一個動態端口

  • -p : 映射到指定的主機端口

  • -p :: 映射到指定的主機的IP的動態端口

  • -p : : ,映射到指定的主機IP的主機端口

  • -P(大):暴露所須要的全部端口

docker port ContainerName 能夠查看容器當前的映射關係

常見隔離方式

docker network ls 查看當前可用網絡類型

docker network create -d 類型 網絡空間名稱

類型分爲:

  • overlay network 覆蓋性網絡,不一樣主機的通信

  • bridge network 網橋

docker運行時指定網絡空間 --network=XXXX,

建立網橋

數據存儲

數據卷特性

  • Docker鏡像由多個只讀層疊加而成,容器啓動時,Docker會家在只讀鏡像層並在鏡像棧頂部添加一個讀寫層

  • 若是運行中的容器修改了現有的一個已經存在的文件,那麼該文件將從讀寫層下面的只讀層複製到讀寫層,該文件的只讀版本仍然存在,只是已經被讀寫層中該文件的副本所隱藏,次即「寫時複製」機制。

a

  • 關閉並重啓容器,其數據不受影響;但刪除Docker容器,則其改變將會所有丟失

  • 存在問題

    • 存在與聯合文件系統中,不易於宿主機訪問

    • 容器間數據共享不便

    • 刪除容器其數據會丟失但

  • 解決方案:「卷」

    • 「卷「是容器上的一個或多個「目錄」,此類目錄可繞過聯合文件系統,與宿主機上的某目錄「綁定」。

a

  • Volume 能夠在運行容器時即完成建立與綁定操做。固然,前提須要擁有對應的聲明

  • Volume 的初中就是數據持久化

a

Volume

  • BInd mount volume 綁定卷,人爲操做,可爲操做系統中的任意目錄

  • Docker-managed volueme 人爲設置,引導後,轉化爲Docker自主管理,存儲目錄通常爲var/lib/docker的目錄

a

容器中的數據卷(使用)

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 工做原理

a

內存資源限制

  • 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,不然容器會耗盡主機內存,並且致使主機應用被殺死。

a

不設置swap時,默認爲ram的2倍。通常不啓用swap空間

相關文章
相關標籤/搜索