一,為什麼要用 docker?
docker 是一個能夠把開發應用程式自動部署到容器的開源引擎。它由docker公司的團隊編寫,基于apache 2.0開源協定授權。它提供了一個簡單、輕量的模組化方式,使開發生命周期更高效快速,鼓勵了面向服務的架構設計。docker 項目的目标是實作輕量級的作業系統虛拟化解決方案。 docker 的基礎是 linux 容器(lxc)等技術。在 lxc 的基礎上 docker 進行了進一步的封裝,讓使用者不需要去關心容器的管理,使得操作更為簡便。使用者操作 docker 的容器就像操作一個快速輕量級的虛拟機一樣簡單。
docker 的特點:
1,更快速的傳遞和部署
2,更高效的虛拟化
3,更輕松的遷移和擴充
4,更簡單的管理
容器技術與傳統虛拟機性能對比:
docker與虛拟機建構對比
docker 容器本質上是主控端上的一個程序。docker 通過 namespace 實作了資源隔離,通過 cgroups 實作了資源的限制,通過寫時複制機制(copy-on-write)實作了高效的檔案操作。
docker有五個命名空間:
程序、網絡、挂載、宿主和共享記憶體
為了隔離有問題的應用,docker運用namespace将程序隔離,為程序或程序組建立已隔離的運作空間,為程序提供不同的命名空間視圖。這樣,每一個隔離出來的程序組,對外就表現為一個container(容器)。需要注意的是,docker讓使用者誤以為自己占據了全部資源,但這并不是”虛拟機”。
docker 中的三個概念:鏡像,容器,倉庫
1、鏡像(image):docker 鏡像就是一個隻讀的模闆,鏡像可以用來建立 docker 容器。docker 提供了一個很簡單的機制來建立鏡像或者更新現有的鏡像,使用者甚至可以直接從其他人那裡下載下傳一個已經做好的鏡像來直接使用。
鏡像是一種檔案結構。dockerfile中的每條指令都會在檔案系統中建立一個新的層次結構,檔案系統在這些層次上建構起來,鏡像就建構于這些聯合的檔案系統之上。docker官方網站專門有一個頁面來存儲所有可用的鏡像,網址是:index.docker.io。
2、容器( container):容器是從鏡像建立的運作執行個體。它可以被啟動、開始、停止、删除。每個容器都是互相隔離的、保證安全的平台。可以把容器看做是一個簡易版的 linux 環境,docker 利用容器來運作應用。鏡像是隻讀的,容器在啟動的時候建立一層可寫層作為最上層。
3、倉庫:倉庫是集中存放鏡像檔案的場所,倉庫注冊伺服器(registry)上往往存放着多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的标簽(tag)。目前,最大的公開倉庫是 docker hub,存放了數量龐大的鏡像供使用者下載下傳。
docker倉庫用來儲存我們的images,當我們建立了自己的image之後我們就可以使用push指令将它上傳到公有或者私有倉庫,這樣下次要在另外一台機器上使用這個image時候,隻需要從倉庫上pull下來就可以了。docker 倉庫的概念跟 git 類似,注冊伺服器可以了解為 github 這樣的托管服務。
二,安裝 docker
前提條件:docker運作對核心要求比較高,是以一般建議直接在ubuntu這樣的平台運作。但作為一個容器标準,docker也是支援其他如centos, mac os x, windows等平台。目前docker支援以下版本centos:centos 7(64位)centos 6.5(64位)及以後在運作centos 6.5及以後版本時,需要核心版本>=2.6.32-431,因為這些核心包含了運作docker的一些特定修改。
docker預設使用aufs作為存儲驅動,但是aufs并沒有被包括在linux的主線核心中。centos中可以使用device mapper作為存儲驅動,這是在2.6.9核心版本引入的新功能。我們需要先确認是否啟用該功能:
centos 7安裝
docker rpm包已經包含在centos-extra倉庫中,是以我們可以直接使用yum安裝:
# yum install docker
centos 6.6安裝
需要注意的是,centos6.6中,已經有一個同名docker的可執行系統程式包。是以docker rpm包命名為docker-io,我們先卸掉docker。
# yum -y remove docker
第三步 install docker-io
# yum -y install docker-io
這樣完成了docker的安裝。
# /etc/init.d/docker start #啟動docker
# docker info #檢視 docker 基本資訊
三, docker 基本操作
# docker search centos #搜尋容器
# docker pull centos #下載下傳容器
# docker images #檢視目前存在的鏡像
# docker run centos /bin/echo 'hello world' #運作一條指令後直接退出
# docker run --name mydocker -it centos /bin/bash #進入docker容器
-t 選項讓docker配置設定一個僞終端(pseudo-tty)并綁定到容器的标準輸入上,
-i 則讓容器的标準輸入保持打開。
–name 使用一個自定義的名字
# docker run -d --name mynginx nginx #啟動nginx鏡像,沒有會自動pull
# docker stop bfd094233f96 #停止一個容器,根據容器 id 進行删除
# docker rm bfd094233f96 #删除一個容器
# docker attach d20f3dc6cd92 #進入一個正在運作的容器
此指令不太好用,建議使用以下指令進入容器:
[root@localhost docker]# docker inspect --format "{{.state.pid}}" mynginx #擷取容器pid
19769
[root@localhost docker]# nsenter --target 19769 --mount --uts --ipc --net --pid #進入容器(推薦方法)
# docker run -d -p 91:80 --name mynginx2 nginx # -p 指定端口映射,将80映射為host的91
存儲鏡像:
# docker save -o ubuntu_14.04.tar ubuntu:14.04
載入鏡像:
# docker load < ubuntu_14.04.tar 或者使用
# cat ubuntu.tar | docker import - test/ubuntu:v1.0
移除本地鏡像:
# docker rmi training/sinatra
清理所有未打過标簽的本地鏡像:
# docker rmi $(docker images -q -f "dangling=true")
其中 -q 和 -f 是 quiet,–filter 的縮寫, 完整的指令其實可以寫着下面這樣,是不是更容易了解一點?
# docker rmi $(docker images --quiet --filter "dangling=true")
注: 容器是否會長久運作,是和docker run指定的指令有關,和 -d 參數無關。
要擷取容器的輸出資訊,可以通過 docker logs 指令。
# docker logs [container id or names]
删除容器:
# docker rm 預設并不會删除運作中的容器
有關容器和鏡像的底層資訊:
# docker inspect container/image
可以檢視:
容器執行個體的ip位址端口綁定清單
特定端口映射的搜尋
收集配置的詳細資訊
從容器内複制檔案到指定的路徑上:
docker cp container:path hostpath
使用dockerfile來建構鏡像:
docker build [options] path | url
–rm=true表示建構成功後,移除所有中間容器
–no-cache=false表示在建構過程中不使用緩存
本文作者:佚名
來源:51cto