概要
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),也就是存儲在庫中的鏡像。