Docker學習整理

1. Docker簡介

Docker即通過對應用組件的封裝(packaging),分發(Distribution),部署(Deployment),運行(Runtime)等生命週期的管理,達到應用組件級別的“一次封裝,到處運行”。Docker引擎的基礎是Linux容器(LinuxContainers,LXC)技術。Docker採用標準的C/S 架構,包括客戶端和服務端兩部分,客戶端和服務端既可以運行在一個機器上,也可通過socket或者RESTful API來進行通信,如下圖所示:


1.1 命名空間

        命名空間(Namespace)是Linux內核針對實現容器虛擬化而引入的一個強大特性;每個容器都可以擁有自己單獨命名空間,運行在其中的應用都像是在獨立的操作系統運行一樣,命名空間保證來容器之間彼此互不影響。Docker網絡命名空間如下圖所示:


1.2 控制組

        控制組(CGroups)是Linux內核的一個特性,主要用來對共享資源進行隔離,限制,審計等;只有能控制分配到容器的資源,docker才能避免多個容器同時運行時的系統資源競爭。

1.3 聯合文件系統

        聯合文件系統(UnionFS)是一種輕量級的高性能分層文件系統,它支持將文件系統的修改信息作爲一次提交,並層層疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下;聯合文件系統是實現Docker鏡像的技術基礎,鏡像可以通過分層來進行繼承。當Docker利用鏡像啓動一個容器時,將利用鏡像分配文件系統並且掛載一個新的可讀寫的層給容器,容器會在這個文件系統中創建,並且這個可讀寫層被添加到鏡像中,如下圖所示:


1.4 容器定義

        容器有效地將有單個操作系統管理的資源劃分到孤立的組中,以便更好地在孤立的組之間平衡有衝突的資源使用需求。與虛擬化相比,這樣既不需要指令級模擬,也不需要即時編譯。容器可以在覈心CPU本地運行指令,而不需要任何專門的解釋機制。此外,也避免了準虛擬化和系統調用替換中的複雜行。

1.5 虛擬化定義

        在計算技術中,虛擬化(Virtualization)是一種資源管理技術,是將計算機的各種實體資源,如服務器,網絡,內存及存儲等,予以抽象,轉換後呈現出來,打破實體結構間的不可切割的障礙,是用戶可以用比原本的組態更好的方式來應用這些資源。

可以簡單地將Docker容器理解爲一種沙盒(Sandbox)。每個容器內運行一個應用,不同的容器相互隔離,容器之間也可以建立通信機制。


Docker容器是在操作系統層面上實現虛擬化,直接複用本地操作系統。由於Docker引擎使用了Linux內核特性,所以在Windows上運行的話,需要額外使用一個虛擬機來提供Linux支持。


2. Docker核心概念

2.1 Docker鏡像

        Docker鏡像(Image)類似於虛擬機鏡像,可以將它理解爲一個面向Docker引擎的只讀模版,包含來文件系統。鏡像是創建Docker容器的基礎。鏡像文件一般是由若干層組成,層(Layer)是AUFS(Advanced Union File System)一種聯合文件系統中的重要概念,是實現增量保存和更新的基礎。

2.2 Docker容器

        Docker容器(Container)類似於一個輕量級的沙箱,Docker利用容器來運行和隔離應用。容器是從鏡像創建的應用運行實例,可以將其啓動,開始,停止,刪除,而這些容器是相互隔離,互不可見的。容器是鏡像的一個運行實例,所不同的是,它帶有額外的可寫文件層。

2.3 Docker倉庫

        Docker倉庫(Repository)類似於代碼倉庫,是Docker集中存放鏡像文件的場所。

2.4 註冊服務器

        註冊服務器(Registry)是存放倉庫的地方,其上往往存放着多個倉庫。每一個倉庫集中存放某一類鏡像,往往包括多個鏡像文件,通過不同的標籤(tag)來進行區分。註冊服務器是存放倉庫的具體服務器,每個服務器上可以有多個倉庫,而每個倉庫下面有多個鏡像;倉庫可以被認爲是一個具體的項目或目錄。


2.5 docker 數據管理

(1)數據卷:在容器內創建數據卷,並且把本地的目錄或文件掛載到容器內的數據卷中;

(2)數據卷容器:使用數據卷容器在容器和主機,容器和容器之間共享數據。

2.6 Docker網絡配置

        docker提供映射容器端口到宿主主機和容器互聯機制來爲容器提供網絡服務。從外部訪問容器應用,需要通過端口映射實現容器訪問。容器的連接(linking)系統是除了端口映射外另一種與容器中應用進行交互的方式,它會在源和接收容器之間創建一個隧道,接收容器可以看到元容器指定的信息,通過容器名稱來進行互連。當兩個docker容器在同一主機(或虛擬機)時,可以通過—link命令讓兩者直接相互訪問;如果要跨主機實現容器互聯,則往往需要容器知道其物理主機的IP地址,利用Ambassador容器機制,可以讓互聯的容器無需知道所在物理主機的IP地址即可互聯。




2.7 Docker網絡實現

        其是利用Linux上的網絡命名空間和虛擬網絡設備;docker網絡就是很好地利用來Linux虛擬網絡技術,它在本地主機和容器內分別創建一個虛擬接口,並讓他們彼此聯通(這樣一對接口叫做veth pair),如下圖所示:






3. Docker命令 

Help命令: docker –help

3.1 鏡像命令

pull命令格式:dockerpull NAME[:TAG] 從網絡上下載鏡像,對於docker鏡像來說,如果不顯示制定TAG,則默認會選擇latest標籤,即下載倉庫中最新版本鏡像。

run命令: docker run --help

images命令:dockerimages 列出本地主機上已有的鏡像

inspect命令:dockerinspect 查看鏡像的信息

search命令:dockersearch 搜索遠程倉庫(註冊服務器Registry)中共享的鏡像

rmi命令:docker rmi 刪除鏡像,其中rmi(remove image)

commit命令:dockercommit 創建鏡像

save命令:docker save 將鏡像存儲到本地文件

load命令:docker load 將本地文件導入到本地鏡像庫

push命令:docker push 將鏡像上傳到倉庫


                                                            鏡像創建的方法


    創建鏡像的方法有是三種:基於已有鏡像的容器創建(docker commit),基於本地模板導入(從一個操作系統模板文件導入一個鏡像),基於Dockerfile創建。

基於Dockerfile創建:用戶可以使用Dockerfile來創建自定義的鏡像,編寫完dockerfile文件之後,可以通過docker build命令來創建鏡像,其中dockerfile對應的注意點如下:

(1)第一行必須指定基於的基礎鏡像

(2)鏡像操作指令:

指令格式:INSTRUCTION argumens

Ø  RUN指令:RUN 或者 RUN [“executable”,”param1”,”param2”],前者將在shell終端中運行命令即/bin/sh –c ;後者則使用exec執行;每運行一條RUN指令,鏡像添加新的一層,並提交

Ø  CMD指令:CMD [“executable”,”param1”,”param2”]使用exec執行;CMD command param1 param2 在/bin/sh中執行;CMD [“param1”,”param2”]提供給ENTRYPOINT的默認參數;指定運行容器時的操作命令,每個Dockerfile只能有一條CMD指令,如果指定了多條命令,只有最後一條會被執行。

Ø  MAINTATINER指令:MAINTATINER 制定維護者信息

Ø  EXPOSE 指令:EXPOSE 告訴Docker服務端容器暴露的端口號,供互聯繫統使用

Ø  ENV指令:ENV 指定一個環境變量,會被後續RUN指令使用,並在容器運行時保持

Ø  ADD指令:ADD 複製指定的到容器中的

Ø  COPY指令:COPY 複製本地主機到容器中的中

Ø  ENTRYPOINT指令:ENTRYPOINT[“executable”,”param1”,”param2”]或者ENTRYPOINT commandparam1 param2 配置容器啓動後執行的命令,並且不可被docker run提供的參數覆蓋;每一個dockerfile中只能有一個ENTRYPOINT,當指定多個ENTRYPOINT時,只有最後一個生效

Ø  VOLUME指令:VOLUME [“/data”] 創建一個可以從本地主機或其他容器掛載的掛載帶點

Ø  USER指令:USER daemon 指定運行容器時的用戶名或UID,後續的RUN也會使用指定用戶

Ø  WORKDIR指令:WORKDIR /path/to/workdir 爲後續的RUN,CMD,ENTRYPOINT指令配置工作目錄,可以使用多個WORKDIR指令,後續命令如果參數是相對路徑,則會基於之前命令制定的路徑

Ø  ONBUILD指令:ONBUILD [INSTRUCTION] 配置當所創建的鏡像作爲其他新創建鏡像的基礎鏡像時,所執行的操作指令

3.2 容器命令

create命令:dockercreate 新建一個容器,只是這個容器處於停止狀態,可以使用docker start 命令來啓動它

start命令:dockerstart 啓動一個容器,對於處於終止狀態的容器,使用start命令來重新啓動

restart命令:dockerrestart 將一個運行狀態的容器終止,然後再重新啓動它

run命令:docker run 運行一個容器,等價於先執行docker create命令創建一個容器,然後再執行docker start命令來啓動這個新建的容器

stop命令:docker stop 終止一個運行中的容器,當Docker容器中制定的應用終結時,容器也自動終止

ps命令:docker ps 可以列出容器信息

attach命令: dockerattach 將在後臺運行的容器通過attach命令來獲得對應的關聯

exec命令:docker exec 可以通過exec命令在對應的容器環境中執行對應命令

rm命令:docker rm 刪除容器

export命令:dockerexport 導出容器(導出一個已經創建的容器到一個文件)

import命令:dockerimport 導入容器(將導出的容器文件變成鏡像),其中docker load命令來導入鏡像存儲文件到本地的鏡像庫,也可以使用docker import命令來導入一個容器快照到本地鏡像庫;這兩者的區別在於容器快照文件將丟棄所有的歷史記錄和元數據信息(即僅保存容器當時的快照狀態),而鏡像存儲文件保存完整的記錄,體積也大;此外,從容器快照文件導入時可以重新制定標籤等元數據信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章