docker基礎

  一個java web工程,由於開發階段須要安裝jdk、tomcat、mysql、redis、nginx等等軟件,在部署在其餘平臺有須要從新安裝一遍,特別作集羣安裝很是浪費時間
,並且軟件版本的不一樣,各類配置文件,很容易致使誇平臺部署沒法運行,docker的出現,解決了運行環境和配置的問題,方便持續集成並有助於總體發佈容器虛擬化技術,目的就是「一次封裝,導出運行」。java

1、docker與虛擬機

虛擬機:帶環境安裝的一種解決方案,模擬一整套操做系統,佔用資源多,啓動很是慢。
linux容器(docker):不須要捆綁一整套操做系統,也沒有對硬件進行虛擬,而只對進程進行隔離,只須要本身須要的資源,直接運行與宿主內核,容器沒有本身的內核mysql

2、docker三要素

倉庫、鏡像、容器linux

3、docker經常使用命令

  • 幫助命令
    • docker verison
    • docker info
    • docker --help
  • 鏡像命令
    • docker images
      -a // 顯示全部(含中間層)
      -q //只顯示鏡像id
      --digests // 顯示鏡像摘要信息
      --no-trunc // 顯示完整鏡像信息nginx

    • docker search [option] imageName
      --no-trunc
      -s //列出收藏數不小於的指定數的鏡像 如:docker search -s 30 tomcat
      --automated // 只列出automated build類型的鏡像web

    • docker pull imageNmae[:tag]
      tag通常表示版本信息,不寫的話,默認:latest最新版本redis

    • docker rmi -f imageId(或者imageName[:tag])
      刪除多個:docker rmi -f tomcat nginx 或者 docker rmi -f $(docker images -qa)sql

  • 容器命令
    • 啓動容器(經過鏡像構建容器實例)
      docker run [option] imageId(name) [command] [args..]docker

      >**OPTIONS**  
      說明(經常使用):有些是一個減號有些是兩個減號  
      --name="容器新名字" 爲容器指定一個名稱  
      -d: 後臺運行容器,並返回容器|D,也即啓動守護式容器  
      -i: 以交互模式運行容器,一般與+同時使用;  
      -t: 爲容器從新分配一個僞輸入終端,一般與i同時使用;  
      -P: 隨機端口映射;  
      -p: 指定端口映射,有如下四種格式  
        ip: hostPort: container Port  
        ip: :container Port 
        hostPort: containerPort  
        containerPort
    • docker ps [option]
      docker ps [option]
      如:docker ps 默認顯示正在運行的容器
      如:docker ps -n 10 顯示最近建立的10個容器centos

      >**OPTIONS**(經常使用):   
      -a: 列出當前全部正在運行的容器+歷史上運行過的  
      -l: 顯示最近建立的容器。  
      -n: 顯示最近n個建立的容器  
      -q: 靜默模式,只顯示容器編號  
      -no- trunc: 不截斷輸出。
    • 退出容器
      exit:中止容器並退出
      ctrl+p+q :不中止容器退出tomcat

    • 進入未中止的容器(交互)
      docker attach 容器id(name)
      docker exec -it 容器id(name) /bin/bash (進入交互模式)
      補充:docker exec -it 容器id(name) ls -l (不進入,只交互一次)

    • 中止容器或強制中止
      docker stop 容器name(容器id)
      docker kill 容器name(容器id)

    • 啓動容器或重啓
      docker start 容器name(容器id)
      docker restart 容器name(容器id)

    • 刪除容器
      刪除單個:docker rm [-f] 容器name(容器id)
      刪除多個:docker rm [-f] $(docker ps -a -q) 或者 docker ps -a -q | xargs docker rm
      注意:-f 表示強制刪除 ,不加-f ,能夠只刪除已中止的容器

    • 查看容器(運行中)內部細節
      docker inspect 容器id(name)

    • 查看容器進程
      docker top 容器id(name)

    • 容器日誌
      docker logs -t -f --tail 5 容器id

    • 拷貝容器內文件到主機
      docker cp 容器id:容器類文件路徑 目的主機路徑

    • 補充

      docker run-d 容器名
      使用鏡像 centos: latest之後臺模式啓動一個容器如
      docker run -d centos

      問題: 而後 docker ps-a進行查看,會發現容器已經退出

      很重要的要說明的一點:Dker容器後臺運行,就必須有一個前臺進程,容器運行的命令若是不是那些一直掛起的命令(好比運行top,tail),就是會自動退出的。這個是 docker的機制問題,好比你的web容器,咱們以 ngInx爲例,正常狀況下,咱們配置啓動服務只須要啓動響應的 service便可。例如service nginx start。可是,這樣作, ngInx爲後臺進程模式運行就致使 docker前臺沒有運行的應用,
      這樣的容器後臺啓動後,會當即自殺由於他以爲他沒事可作了。因此,最佳的解決方案是,將你要運行的程序之前臺進程的形式運行

4、docker鏡像

  • 鏡像
    是一種輕量級、可執行的獨立軟件包,用來打包軟件運行環境和基於運行環境開發的軟件,它包含運行某個軟件所需的全部內容包括代碼、運行時、庫、環變量和配置文件

  • Docker鏡像加轂原理
      docker的鏡像實際上由一層一層的文件系統組成,這種層級的文件系統 UnionFS。
      bootfs( boot file system)主要包含 bootloader和kernel, bootloader主要是引導加載kernel,Lnux剛啓動時會加載 bootfs文件系統,在
    Docker鏡像的最底層是 bootfs。這一層與咱們典型的 Linux/Unix系統是同樣的,包含boot加載器和內核。當boot加載完成以後整個內核
    就都在內存中了,此時內存的使用權已由 bootfs轉交給內核,此時系統也會卸載 bootfs
      rootfs( root file system),在 bootfs之上·包含的就是典型 Linux系統中的ldev,/proc,/bin,/etc等標準目錄和文件。 rootfs就是各類不
    同的操做系統發行版,好比 Ubuntu, Centos等等
      對於一個精簡的OS,root能夠很小,只須要包括最基本的命令、工具和程序庫就能夠了,由於底層直接用Host的kernel,自已己只須要
    提供 rootfs魷行了。因而可知對於不一樣的nux發行版,boot基本是一致的, rootfs會有差異,所以不一樣的發行版能夠公用bootfs

聯合文件系統
Union FS(聯合文件系統); Union文件系統( UnionFS)是一種分層、輕量級而且高性能的文件系統,它支持對文件系統的修改做爲
交來一層層的疊加,同時能夠將不一樣目錄掛載到同一個虛擬文件系統下 unite several directories into a single virtual
filesystem) Union文件系統是 Docker鏡像的基礎。鏡像能夠經過分層來進行繼承,基於基礎鏡像(沒有父鏡像),能夠製做各類具
體的應用鏡像
特性:一次同時加載多個文件系統,但從外面看起來,只能看到一個文件系統,聯合加載會把各層文件系統疊加起來,這樣最終的文
件系統會包含全部底層的文件和目錄

  • docker commit -m="描述信息" -a="做者" 容器id 新鏡像名稱[:tag]
    將運行中的鏡像,提交成新的鏡像

5、容器數據卷

容器的持久化 、容器間繼承+共享數據

  卷就是目錄或文件,存在於一個或多個容器中,由 docker掛載到容器,但不屬於聯合文件系統,所以可以繞過 Union File Systen提供一些用於持續存儲或共享數據的特性
  卷的設計目的就是數據的持久化,徹底獨立於容器的生存週期,所以 Docke不會在容器刪除時刪除其掛載的數據卷
特色:
1:數據卷可在容器之間共享或重用數據
2:卷中的更改能夠直接生效
3:數據卷中的更改不會包含在鏡像的更新中
4:數據卷的生命週期一直持續到沒有容器使用它爲止

  • 添加數據卷
    docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 鏡像名
    docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 鏡像名 (帶權限 ,ro 表示內文件只讀)
    還有一種方式,dockerfile,看後面筆記

  • 數據卷容器
    命名的容器掛載數據卷,其它容器經過掛載這個(父容器)實現數據共亨,掛載數據卷的容器,稱之爲數據卷容器

    docker run -it --name name2 volumes-from name1 鏡像名
    說明:同一個鏡像模板,啓動name1,而後name2 繼承自name1,那麼數據卷目錄共享資源。
    結論:容器間配置信息的傳遞,卷的生命週期一直持續到沒有容器使用爲止

6、DockerFile解析

dockerfile是構建docker鏡像的構建文件,是由一系列命令和參數構成的腳本

  • 保留字
    • FROM
      基礎鏡像,當前新鏡像是基於哪一個鏡像的
    • MAINTAINER
      鏡像維護者的姓名和郵箱地址
    • RUN
      容器構建時須要運行的命令
    • EXPOSE
      當前容器對外暴露出的端口
    • WORKDIR
      指定在建立容器後,終端默認登錄的進來工做目錄,一個落腳點
    • ENV
      用來在構建鏡像過程當中設置環境變量
    • ADD
      將宿主機目錄下的文件拷貝進鏡像且ADD命令會自動處理URL和解壓tar壓縮包
    • COPY
      相似ADD,拷貝文件和目錄到鏡像中,將從構建上下文目錄中 <源路徑> 的文件/目錄複製到新的一層的鏡像內的 <目標路徑> 位置
    • VOLUME
      容器數據卷,用於數據保存和持久化工做
    • CMD
      指定一個容器啓動時要運行的命令,Dockerfile 中能夠有多個cMD指令,但只有最後一個生效,CMD會被 docker run以後的參數替換
    • ENTRYPOINT
      指定一個容器啓動時要運行的命令,ENTRYPOINT的目的和CMD同樣都是在指定容器啓動程序及參數,可是docker run 以後參數會傳遞給ENTRYPOINT,以後造成新的命令組合
    • ONBUILD 當構建一個被繼承的dockerfile時運行命令,父鏡像在被子繼承後父鏡像的 onbuild被觸發
相關文章
相關標籤/搜索