docker核心概念(鏡像、容器、倉庫)及基本操作


概要

    docker是一種linux容器技術。容器有效的將由單個操作系統掛管理的資源划分到孤立的組中,以便更好的在組之間平衡有沖突的資源使用需求。可簡單理解為一種沙盒 。每個容器內運行一個應用,不同的容器之間相互隔離,容器之間也可以建立通信機制。容器的創建和停止都十分快速,資源需求遠遠低於虛擬機。

    

好處

    能高效地構建應用。

    對於運維開發來說,

    能快速的交付和部署

    高效的資源利用

    輕松的遷移擴展

    簡單的更新管理

    

與虛擬機的比較

 

docker與虛擬化

    虛擬化是一種資源管理技術,是將計算機的各種實體資源,如服務器,網絡,內存等抽象、轉化后呈現出來,使用戶以更好的方式來應用這些資源。虛擬化目標往往是為了在同一個主機上運行多個系統或者應用,從而提高資源的利用率,降低成本,方便管理及容錯容災。

操作系統級的虛擬化:內核通過創建多個虛擬的操作系統實例(內核和庫)來隔離不同的進程。docker以及其他容器技術就屬於此范疇。

 

傳統虛擬化方式是在硬件層面實現虛擬化,需要有額外的虛擬機管理應用和虛擬機操作系統層。而docker容器是在操作系統層面上實現虛擬化,直接復用本地主機操作系統,更加輕量。

 

docker核心概念

鏡像(Image)

容器(Container)

倉庫(Repository)

 

鏡像:類似虛擬機鏡像

容器:類似linux系統環境,運行和隔離應用。容器從鏡像啟動的時候,docker會在鏡像的最上一層創建一個可寫層,鏡像本身是只讀的,保持不變。

倉庫:每個倉庫存放某一類鏡像。

 

容器、倉庫、鏡像運行關系圖:

 

docker的安裝以及鏡像,容器,倉庫的基本操作

 

docker的安裝(centos7中可以直接yum安裝)

    yum install –y docker

更新需要自行通過源碼安裝,或者下載二進制文件安裝。

 

鏡像

# 搜索鏡像

docker search <image> # 在docker index中搜索image

    --automated=false 僅顯示自動創建的鏡像

    --no-trunc=false 輸出信息不截斷顯示

    -s 0 指定僅顯示評價為指定星級的鏡像

 

# 下載鏡像

docker pull <image> # 從docker registry server 中下拉image

還可通過指定標簽下載某鏡像

    docker pull [:TAG]

    docker pull centos:7

 

# 查看鏡像/刪除

docker images: # 列出images

docker images -a # 列出所有的images(包含歷史)

docker ps -a #列出本機所有容器

docker rmi <image ID>: # 刪除一個或多個image

 

# 存出和載入鏡像

    存出本地鏡像文件為.tar

    docker save -o ubuntu_14.04.tar ubuntu:14.04

    導入鏡像到本地鏡像庫

    docker load --input ubuntu_14.04.tar或者

    docker load < ubuntu_14.04.tar

 

# 上傳鏡像

    用戶在dockerhub網站注冊后,即可上傳自制的鏡像。

    docker push NAME[:TAG]

 

容器

    容器是鏡像的一個運行實例,不同的是它帶有額外的可寫層。

    可認為docker容器就是獨立運行的一個或一組應用,以及它們所運行的必需環境。

    

# 創建(使用鏡像創建容器):

    首先得查看鏡像的REPOSITORY和TAG

docker run -i -t REPOSITORY:TAG (等價於先執行docker create 再執行docker start 命令)

其中-t選項讓docker分配一個偽終端並綁定到容器的標准輸入上, -i則讓容器的標准輸入保持打開。若要在后台以守護態(daemonized)形式運行,可加參數-d

 

在執行docker run來創建並啟動容器時,后台運行的標准包括:

  • 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
  • 利用鏡像創建並啟動一個容器
  • 分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀可寫層
  • 從宿主機配置的網橋接口中橋接一個虛擬接口到容器
  • 從地址池配置一個ip地址給容器
  • 執行用戶指定的應用程序
  • 執行完畢后容器被終止

     

docker start/stop/restart <container> #:開啟/停止/重啟container

 

# 進入容器:

docker attach [container_id] #連接一個正在運行的container實例(即實例須為start狀態,可以多個 窗口同時attach 一個container實例),但當某個窗口因命令阻塞時,其它窗口也無法執行了。

 

exec可直接在容器內運行的命令。docker exec -ti [container_id] /bin/bash

 

# 刪除容器:

docker rm <container...> #:刪除一個或多個container

docker rm `docker ps -a -q` #:刪除所有的container

docker ps -a -q | xargs docker rm #:同上, 刪除所有的container

 

docker -rm

    -f 強制中止並運行的容器

    -l 刪除容器的連接,但保留容器

    -v 刪除容器掛載的數據卷

    

# 修改容器:

docker commit <container> [repo:tag] # 將一個container固化為一個新的image,后面的repo:tag可選。

 

# 導入和導出容器:

    導出到一個文件,不管是否處於運行狀態。

    docker export CONTAINER > test.tar

    

    導入為鏡像:

cat test.tar | docker import - centos:latest

 

倉庫

    倉庫是集中存放鏡像的地方。每個服務器上可以有多個倉庫。

    倉庫又分為公有倉庫(DockerHub、dockerpool)和私有倉庫

 

DockerHub:docker官方維護的一個公共倉庫https://hub.docker.com,其中包括了15000多個的鏡像,大部分都可以通過dockerhub直接下載鏡像。也可通過docker search和docker pull命令來下載。

DockerPool:國內專業的docker技術社區,http://www.dockerpool.com也提供官方鏡像的下載。

 

docker私有倉庫的搭建:

192.168.2.189 倉庫

192.168.2.201 客戶端

1.先拉取registry鏡像(用來啟動倉庫)和busybox鏡像(用來上傳)

docker pull registry

docker pull busybox

我這里下載的是registry 2

 

2.使用docker tag命令將這個鏡像標記為192.168.2.189:5000/busybox

docker tag IMAGR[:TAG] NAME[:TAG]

docker tag docker.io/busybox 192.168.2.189:5000

 

3.修改docker配置文件,增加參數 --insecure-registry=192.168.2.189:5000

此處的參數指定為非安全模式,也就是http而不是https,然后重啟docker服務。

 

4.創建registry容器並啟動

docker run -d -p 5000:5000 --privileged=true -v /myregistry:/var/lib/registry registry

–privileged=true :CentOS7中的安全模塊selinux把權限禁掉了,參數給容器加特權,不加上傳鏡像會報權限錯誤(OSError: [Errno 13] Permission denied: '/tmp/registry/repositories/liibrary')或者(Received unexpected HTTP status: 500 Internal Server Error)錯誤

-v選項指定將/myregistry/目錄掛載給/var/lib/registry/,/tmp/registry是registry版本1的倉庫目錄。

/myregistry為本地創建的目錄。

 

5.把本地標記的鏡像push到倉庫

docker push 192.168.2.189:5000/busybox

 

6.查看本地目錄/myregistry以及在客戶端上pull剛才push的鏡像

客戶端在pull之前也需要修改配置文件指定倉庫,也和上面一樣添加參數--insecure-registry=192.168.2.189:5000,然后重啟docker。

 

7.也可以通過registry v2 api來查看push的鏡像是否存在於倉庫

GET /v2/_catalog檢索列出所有存儲庫(Listing Repositories),也就是存儲在庫中的鏡像。     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM