Docker三十分鐘快速入門(上)

1、背景

​   最近,Docker技術真是一片火熱,它的出現也彌補了虛擬機資源消耗太高的問題,直接讓虛擬化技術有了質的飛躍。那麼本文咱們來聊一聊Docker,和你們一塊兒認識Docker,簡單入門Docker.linux

2、虛擬化技術簡介和發展

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啓動的開銷

  • 容器主要給應用提供虛擬化的運行環境

  • 容器只提供給應用所需的可執行文件和依賴庫

  • 虛擬機主要給操做系統提供運行環境

3、Docker架構

  • Docker daemon

    • 處理Docker API 請求

    • 管理Docker對象:如鏡像、容器、網絡等。

  • Docker client

    • Docker client使用Docker API 跟 Docker daemon進行通訊交互

    • 能夠跟多個不一樣的Docker Daemon進行通訊

  • Docker Registries

    • 存儲Docker鏡像

    • 公有和私有Docker Registry

  • Docker對象

    • 鏡像

    • 容器

4、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鏡像

    • 文檔清晰、完整

    • 安全,更新及時

    • 安全性更高

5、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

    

6、Docker經常使用命令

  • 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] 提交鏡像到遠程倉庫

  • docker rm -f $(docker ps -qa -f status=exited) 刪除全部已經停掉的容器

前臺運行 VS 後臺運行

  • 前臺運行Docker容器

    • 默認方式

    • docker run 運行容器中的應用並將console和應用進程中的標準輸入、輸出及錯誤關聯起來

    • 容器啓動後不能在console中執行其餘命令

  • 後臺運行Docker容器

    • 須要指定 -d 選項

    • docker run 將容器在後臺啓動,一般容器中的主程序退出後容器隨之退出

    • 容器啓動後能夠在console中繼續執行其餘命令

7、Docker端口映射和日誌

最典型的案例是:當咱們運行tomcat鏡像的時候,咱們須要爲該容器指定向外暴露的端口以及查看容器運行時tomcat的日誌信息。

  • 端口暴露

    • 運行時指定 -p或者-P選項,-p容許咱們指定端口信息,-P是docker默認隨機映射一個 49000~49900 的端口到內部容器開放的網絡端口

  • 查看日誌

    • docker logs containerId 查看容器輸出的日誌信息

    • 也能夠後臺運行容器,而後使用docker exec -ti containerId bash 命令進到logs目錄下查看catlina.log日誌信息

8、Docker 鏡像

  • Docker鏡像是容器的基礎

  • Docker鏡像是由有序文件系統層以及容器運行時所需參數組成

  • Docker鏡像是無狀態的

  • Docker鏡像是不可更改的

 

  • 運行中的容器,全部的變化被寫入可寫層

  • 一旦容器被刪除,可寫入層隨之刪除,但base鏡像依舊存在

  • 多個容器共享相同的base鏡像層

9、建立Docker鏡像

  • 經過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守護進程

10、深刻Dockerfile

  • 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 來指定不使用緩存

    • 也可使用鏈式命令來避免使用緩存

11、上傳Docker鏡像到Docker Hub

  • 首先註冊Docker Hub帳號

  • docker tag 給鏡像打標籤

  • Repository格式:ID/鏡像名字

  • Latest標籤

    • 默認Docker使用latest做爲標籤

    • 一般Repository用latest表示竟像是最新穩定版,但這只是默認傳統,不是強制要求

    • 當新版本鏡像上傳到Repository,latest標籤的鏡像不會自動更新

    • 儘可能避免使用latest標籤

12、總結

  經過本文,咱們就對Docker有了一個直觀的理解,也明白瞭如何從遠程倉庫拉取鏡像,運行鏡像,如何進行端口映射等等Docker基礎知識。感受很充實~

相關文章
相關標籤/搜索