Docker 核心技術

docker是什麼?爲何會出現?
容器虛擬化技術;輕量級的虛擬機(但不是虛擬機)
開發:提交代碼 ——> 運維:部署
在這中間,由於環境和配置,出現問題 ——> 把代碼/配置/系統/數據...自底至上一塊兒打包成鏡像
一次封裝構建,處處運行
 
docker:用於將應用以輕量級容器的形式pack、ship、run
虛擬機的啓動是分鐘級的:資源佔用多,冗餘步驟多,啓動慢
而docker有更少的抽象層,啓動是秒級的:docker(linux容器)不是模擬一個完整的操做系統,而是對進程進行隔離,只須要軟件工做所需的庫資源和設置。沒有本身的內核,也不虛擬硬件,每一個容器相互隔離(有本身的文件系統)
 

 

一次開發、隨處運行:開發自運維
 
docker 的三大特徵:鏡像image、容器container、倉庫repository
鏡像是模板,容器就是鏡像的一個實例
 
容器能夠被啓動、開始、中止、刪除,每一個容器都是相互隔離的。容器的定義和鏡像幾乎如出一轍,惟一區別在於容器的最上面那一層是可讀可寫的。
倉庫:集中存放鏡像文件的地方。倉庫和倉庫註冊服務器registry是有區別的,registry上每每存放了多個repository。
 
Docker 經常使用命令
1. 幫助命令
docker version
docker info
dockder --help
 
 
2. 鏡像命令
docker images  查看全部鏡像
  -a 列出本地全部鏡像(包含中間鏡像層)
  -q 只顯示鏡像id
  -qa
  --digests 顯示鏡像摘要信息
  --no-trunc 顯示完整鏡像信息(不要截取)
 
docker search [OPTIONS] 鏡像名字  去docker hub上查找鏡像
  --no-trunc 顯示完整鏡像描述
  -s 列出收藏數不小於指定值的鏡像
  --automated 只列出automated build類型的鏡像
 
docker pull [OPTIONS] 鏡像名字:TAG  拉取鏡像
 
docker rmi [OPTIONS] 鏡像名字  刪除鏡像
  docker rmi -f 鏡像ID  刪除單個
  docker rmi -f 鏡像名1:TAG 鏡像名2:TAG  刪除多個
  docker rmi -f $(docker images -qa)  刪除所有
 
 
3. 容器命令
有鏡像才能建立容器
 
docker run [OPTIONS] 鏡像 [COMMAND] [ARG...]  新建並啓動容器
  

  啓動交互式容器:docker run -it 鏡像linux

docker ps [OPTIONS]  列出當前全部正在運行的容器
  
 
exit / ctrl+P+Q 容器中止退出/容器不中止退出  兩種退出容器的方式
 
docker start 容器名或id  啓動容器
 
docker restart 容器名或id  重啓容器
 
docker stop 容器名或id  中止容器
 
docker kill 容器名或id  強制中止容器
 
docker rm 容器名或id  刪除已中止容器
  一次性刪除多個容器:docker rm -f $(docker ps -qa)  docker ps -qa | xargs docker rm
 
docker run -d 容器名  啓動守護式容器
  
  最佳解決方案是將你要運行的程序之前臺進程的形式運行
 
docker logs 容器id  查看容器日誌
  -f 跟隨最新日誌打印
  -t  加入時間戳
  --tail  數字,顯示最後多少條
 
docker top 容器id  查看容器內的進程
 
docker inspect 容器id  查看容器內部細節(json串)
 
進入正在運行的容器並以命令行交互:
docker exec -it 容器id bashshell  在容器中打開新的終端,而且能夠啓動新的進程
docker attach 容器id  直接進入容器啓動命令的終端,不會啓動新的進程(從新進入)
 
docker cp 容器id:容器內路徑 目的主機路徑  從容器內拷貝文件到主機上
 
 
4.Docker 鏡像
鏡像:輕量級、可執行的獨立軟件包,用來打包軟件運行環境和基於運行環境開發的軟件(包括代碼、運行時、庫、環境變量和配置文件)
 
UnionFS聯合文件系統:分層、輕量級而且高性能的文件系統。對文件系統的修改做爲一次提交來一層一層的疊加。
  
 

爲何docker鏡像很小?

 

5.Docker 鏡像commit 操做補充
docker commit 容器id 命名空間/要建立的目標鏡像名:[標籤名]  提交容器副本使之成爲一個新的鏡像
  -m='提交的描述信息'
  -a='做者'

 
6.Docker 容器數據卷
把docker容器運行產生的數據持久化
容器之間繼承+共享數據
 
數據卷添加
直接命令添加
  命令:docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 鏡像名
    主機下面的目錄會自動建立
  查看數據卷是否掛載成功:docker inspect 容器id 查看數據綁定
  容器和宿主機之間數據是否共享?—— 共享
  容器中止退出後,主機修改數據,容器再次啓動後數據是否同步?—— 是
  命令(帶權限,相似於寫保護):docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 鏡像名
 
DockerFile添加
  1.根目錄下新建mydocker文件夾並進入
    cd /
    mkdir mydocker
  2.可在DockerFile中使用VOLUME指令來給鏡像添加一個或多個數據卷
    VOLUME["/dataVolumeContainer", "/dataVolumeContainer2", "/dataVolumeContainer3"]
    由於遷移性的緣由,不能指定主機目錄
  3.File構建
    FROM ubuntu
    VOLUME ["/dataVolumeContainer1","/dataVolumeCintainer2"]
    CMD echo "finished --success"
    CMD /bin/bash
  4.build 後生成新鏡像 wcj/ubuntu
    docker build -f /mydocker/Dockerfile -t wcj/ubuntu .
  5.run容器
    docker run -it wcj/ubuntu
  經過上述步驟,容器內的卷目錄地址已經知道,對應的主機目錄地址呢? ——主機對應默認地址。
    docker inspect 容器id  查看一下

 

 
7.數據卷容器
命名的容器掛載數據卷,其餘容器經過掛載這個(父容器)實現數據共享,掛載數據卷的容器,稱之爲數據卷容器
活動硬盤上掛活動硬盤,實現數據的傳遞
容器之間配置信息的傳遞,數據卷的生命週期一直持續到沒有容器使用它爲止(只要還有一個容器掛載,數據卷就是一直在容器間互通的)
 
先啓動一個父容器dc01,在dataVolumeContainer2新增內容
  docker run -it name dc01 wcj/ubuntu
  touch /dataVolumeCintainer2/dc01_add.txt
 
dc02/dc03繼承自dc01,分別新增內容
  docker run it --name dc02 --volumes-from dc01 wcj/ubuntu
  touch /dataVolumeCintainer2/dc02_add.txt
  docker run it --name dc03 --volumes-from dc01 wcj/ubuntu
  touch /dataVolumeCintainer2/dc03_add.txt
 
回到dc01,能看到dc02和dc03添加的內容
刪除dc01,dc02修改後dc03能否訪問? ——能夠
刪除dc02後dc03能否訪問?——能夠
新建dc04繼承dc03後再刪除dc03?——仍是能夠訪問
 
 
8.Dockerfile 解析
Dockerfile 是用來構建 docker 鏡像的的構建文件,是由一系列命令和參數構成的腳本。
構建三步驟:Dockerfile  docker build  docker run
  

  

 

Dockerfile 保留字指令
  
 
FROM
MAINTAINER
RUN
EXPOSE
WORKDIR
ENV
ADD  (複製+解壓/處理)
COPY  (就只是複製)
  COPY src dest
  COPY ["src","dest"]
VOLUME
CMD  (dockerfile中的多個CMD只有最後一個會生效,並且會被docker run以後手動加的參數覆蓋)
ENTRYPOINT  (追加,不被覆蓋。docker run 以後的參數會被看成參數傳遞給ENTRYPOINT,造成新的命令組合)
ONBUILD  (做爲父鏡像時,以後的內容被觸發)
 
 

 

鏡像的生成方法:
1. Dockerfile
2.從容器中建立一個新的鏡像
docker commit [OPTIONS] 容器id 鏡像名:TAG
  -m"說明文字"
  -a"做者"
  
相關文章
相關標籤/搜索