最近,Docker技術真是一片火熱,它的出現也彌補了虛擬機資源消耗太高的問題,直接讓虛擬化技術有了質的飛躍。那麼本文咱們來聊一聊Docker,和你們一塊兒認識Docker,簡單入門Docker.linux
1. 階段一:無虛擬化技術git
衆所周知,在虛擬化技術出現以前,咱們依靠擴展物理機的方式來擴展咱們的應用,這個階段很痛苦,也有不少的缺點,好比:docker
Capex費用昂貴shell
Go to Product速度極其慢centos
系統可移植行極低數組
資源利用率極低緩存
2. 階段二:基於Hypervisor的虛擬化技術tomcat
這個階段,出現的虛擬化技術讓不少人開心不已,隨着時間的流逝,市面上也出現很多相關的實際應用的技術,如:VMware、KVM、AWS、Microsoft的Hyper-V等。安全
基於Hypervisor的虛擬化技術的優勢:bash
資源利用率高
易於擴展、伸縮
Go to Product快速
成本下降
基於Hypervisor的虛擬化技術的缺點:
OS內核資源被重複消耗資源
應用移植性較低
3. 階段三:基於容器的虛擬化技術
因爲Hypervisor的虛擬化技術不是很完美,對內核的資源重複消耗,那隨着技術的發展就出現了基於容器的虛擬化技術,最熱的就是Docker Container了。它底層使用CGroup和Namespace來實現多個容器之間共享內核資源。並且它還能保證運行時相互隔離,互不影響。
基於容器虛擬化技術的優勢:
資源利用率更高
很是高效
更易於擴展、伸縮
Go to Product更快速
一致性
可封裝性
應用隔離性
運行時隔離,最典型的應用就是使得咱們能夠很方便和簡單的實如今同一臺機器上運行基於不一樣版本Java開發的應用。以下圖:
基於Hypervisor的虛擬化技術 VS 基於容器的虛擬化技術
容器提供OS層的虛擬化(OS Virtualization)
容器能夠避免Machine Virtualiztion啓動的開銷
容器主要給應用提供虛擬化的運行環境
容器只提供給應用所需的可執行文件和依賴庫
虛擬機主要給操做系統提供運行環境
Docker daemon
處理Docker API 請求
管理Docker對象:如鏡像、容器、網絡等。
Docker client
Docker client使用Docker API 跟 Docker daemon進行通訊交互
能夠跟多個不一樣的Docker Daemon進行通訊
Docker Registries
存儲Docker鏡像
公有和私有Docker Registry
Docker對象
鏡像
容器
鏡像
鏡像是用來建立容器的只讀模板
鏡像是經過Docker build命令建立的
鏡像由鏡像層構成
鏡像存儲於Docker Registry
容器
容器是鏡像的運行實例
容器是應用運行環境的封裝,具備輕量級、移植性高等特色
容器由鏡像建立,內部封裝全部運行應用所需依賴及可執行文件
Registries和Repositories
Registry是存儲Docker鏡像的地方(可類比爲Maven倉庫)
可自建私有Registry和使用公用Registry,如:Docker Hub
在Registry中,鏡像存儲在Repository
Docker Repository是具備相同名字,不一樣標籤的Docker鏡像的集合(可類比爲Maven倉庫中的某個依賴所在的文件夾,能夠有不一樣版本)
Docker Hub
公有:Docker Registry
私有:Docker Registry
官方Docker鏡像
文檔清晰、完整
安全,更新及時
安全性更高
環境準備
Centos 7
Docker社區版安裝步驟
刪除已安裝全部老版本docker相關(docker或者docker-engine)
yum remove -y docker docker-common docker-selinux docker-engine
安裝devicemapper驅動和yum工具
yum install -y yum-utils device-mapper-persistent-data lvm2
配置repo
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安裝docker社區版
yum install -y docker-ce
啓動docker
systemctl start docker
注:若是在沒有啓動docker的狀況下運行[docker info]命令,則會出現:Cannot connect to the Docker daemon. Is the docker daemon running on this host? 錯誤。
Centos官方版安裝步驟
yum install -y docker
驗證安裝
docker version
docker info
docker version 查看docker版本信息
docker info 查看docker基本信息
docker images 查看全部本地鏡像
docker ps [-a] 查看全部正在運行的容器
-a查看全部的容器
docker search repository:tag 在遠程倉庫搜索指定鏡像
docker pull repository:tag 從遠程倉庫下載指定鏡像
docker run [-t -i -d --name containerName -p port] repository:tag cmd命令 基於一個鏡像運行一個容器
-t 綁定終端
-i 交互模式
-d 後臺運行
--name 指定容器的名稱
-p 指定容器暴露的端口,如:8080:8080
-P 和-p互斥,當使用 -P 標記時,Docker 會隨機映射一個 49000~49900
的端口到內部容器開放的網絡端口
docker start containerId 啓動一個已經中止的容器
docker stop containerId 停掉一個正在運行的容器
docker rm [-f] containerId/containerName 刪除指定容器
-f 強制刪除,不論容器是否正在運行
docker rmi imageId/imageName 刪除指定鏡像
docker commit [-a author] containerId repository:tag
-a author 指定做者
docker logs [-f] containerId 查看容器日誌
docker history imageId/repository:tag 查看鏡像的各層信息
docker inspect containerId/containerName 查看容器更底層的信息
docker save -o fileName imageId/repository:tag 將指定的鏡像打包保存
docker import fileName repository:tag 使用指定文件建立鏡像
docker exec [-t -i] containerId/containerName CMD 利用指定容器執行指定的cmd命令
docker build -t repository:tag . [--no-cache=true] 使用當前目錄下的Dockerfile文件構建鏡像
「.」 表明使用當前目錄下Dockerfile
--no-cache=true 不使用緩存,默認是緩存
docker login 登錄到遠程倉庫
docker push repository[:tag] 提交鏡像到遠程倉庫
前臺運行 VS 後臺運行
前臺運行Docker容器
默認方式
docker run 運行容器中的應用並將console和應用進程中的標準輸入、輸出及錯誤關聯起來
容器啓動後不能在console中執行其餘命令
後臺運行Docker容器
須要指定 -d 選項
docker run 將容器在後臺啓動,一般容器中的主程序退出後容器隨之退出
容器啓動後能夠在console中繼續執行其餘命令
最典型的案例是:當咱們運行tomcat鏡像的時候,咱們須要爲該容器指定向外暴露的端口以及查看容器運行時tomcat的日誌信息。
端口暴露
運行時指定 -p或者-P選項,-p容許咱們指定端口信息,-P是docker默認隨機映射一個 49000~49900
的端口到內部容器開放的網絡端口
查看日誌
docker logs containerId 查看容器輸出的日誌信息
也能夠後臺運行容器,而後使用docker exec -ti containerId bash 命令進到logs目錄下查看catlina.log日誌信息
Docker鏡像是容器的基礎
Docker鏡像是由有序文件系統層以及容器運行時所需參數組成
Docker鏡像是無狀態的
Docker鏡像是不可更改的
運行中的容器,全部的變化被寫入可寫層
一旦容器被刪除,可寫入層隨之刪除,但base鏡像依舊存在
多個容器共享相同的base鏡像層
經過docker commit命令來基於容器建立Docker鏡像
經過docker build 命令配合Dockerfile文件建立Docker鏡像
下面是一個簡單的Dockerfile文件
FROM centos:7 LABEL maintainer "hafiz.zhang(hafiz.zhang@example.com)" RUN yum update -y RUN yum install -y git
Dockerfile是一個包含用戶建立Docker鏡像的全部命令的文本文件
Dockerfile中的命令指定在建立Docker鏡像時作什麼操做
Docker讀取Dockerfile中的命令來建立Docker鏡像
Dockerfile中的每一個命令都將被Docker使用來建立一個新的Docker鏡像層
Docker build 上下文
Docker客戶端以當前目錄爲build上下文
默認讀取當前目錄的Dockerfile進行build
Docker客戶端開始build後會將build上下文目錄的文件打包成tar包並上傳給Docker Daemon守護進程
RUN指令
RUN指令在容器的可寫入層執行命令,並commit容器爲新的鏡像
上一步RUN命令生成的鏡像會被接下來的RUN指令使用,每次RUN指令生成一個新的鏡像
Dockerfile中最好使用鏈式輸入命令以減小建立鏡像層的數量
CMD指令
CMD指令指定容器啓動時執行什麼命令
若是在Dockerfile中不指定CMD指令,Docker將使用基礎鏡像提供的默認命令
CMD指令在建立Docker鏡像時不執行,只有在容器啓動時才執行
既能夠以exec形式也能夠以shell形式指定要執行的命令
CMD 指令指定命令使用JSON格式,只能使用雙引號,不能使用單引號
CMD ["echo", "HelloWorld"] 使用exec形式,不能獲取到$HOME等環境變量信息
CMD ["sh", "-c", "echo $HOME"] 使用shell腳本形式,能獲取到HOME等環境變量信息
build鏡像的時候不會運行CMD指令指定的命令,只要在使用鏡像啓動容器時才運行CMD指令指定的命令
COPY指令
COPY指令從build上下文複製文件或者文件夾到容器文件系統
ADD指令
ADD指令不但能夠複製文件到容器文件系統,並且還能夠從internet上下載文件並複製到容器
ADD指令能夠自動解壓壓縮文件
一般咱們使用COPY指令,除非明確須要ADD指令
Docker緩存
每次Docker執行一個指令將建立新的鏡像
若是下一次指令沒有發生變化,Docker默認使用現有的緩存
能夠經過指定 --no-cache=true 來指定不使用緩存
也可使用鏈式命令來避免使用緩存
首先註冊Docker Hub帳號
docker tag 給鏡像打標籤
Repository格式:ID/鏡像名字
Latest標籤
默認Docker使用latest做爲標籤
一般Repository用latest表示竟像是最新穩定版,但這只是默認傳統,不是強制要求
當新版本鏡像上傳到Repository,latest標籤的鏡像不會自動更新
儘可能避免使用latest標籤
經過本文,咱們就對Docker有了一個直觀的理解,也明白瞭如何從遠程倉庫拉取鏡像,運行鏡像,如何進行端口映射等等Docker基礎知識。感受很充實~