Docker的安裝、鏡像操作、容器操作及資源控制
Docker是在linux容器裏運行應用的開源工具,是一種輕量級的虛擬機。Docker包含三大核心概念,分別是:鏡像、容器和倉庫。Docker的容器技術可以在一臺主機上輕松的為任何應用創建一個輕量級的、可移植的、自給自足的容器。通過這種容器打包應用程序,意味著簡化了重新部署、調試這些瑣碎的重復工作。極大地提高了工作效率。
Docker容器與傳統虛擬化的比較
特性 | Docker容器 | 虛擬機 |
---|---|---|
啟動速度 | 秒級 | 分鐘級 |
計算能力消耗 | 幾乎無 | 消耗50% |
性能 | 接近原生 | 弱於 |
單機系統支持量 | 上千個 | 幾十個 |
隔離性 | 資源限制 | 完全隔離 |
Docker核心概念
鏡像(image)
Docker的鏡像是創建容器的基礎,類似虛擬機的快照,可以理解為一個面向Docker容器的只讀模板。例如,一個鏡像可以是一個完整的centos操作系統環境,成為一個centos鏡像;也可以是一個安裝了MySQL的應用程序,稱為一個MySQL鏡像。
容器(container)
Docker的容器是從鏡像創建的運行實例,它可以被啟動、停止和刪除。所創建的每一個容器都是相互隔離、互不可見的,可以保證平臺的安全性。可以把容器看作是一個簡單的linux環境,Docker利用容器來運行和隔離應用。
倉庫(repository)
Docker倉庫是用來集中保存鏡像的地方,當創建了自己的鏡像之後,可以使用push將它上傳到公共倉庫或者私有倉庫,這樣,當你下次要在另一臺機器上使用鏡像時,只需要pull下來即可。
docker安裝
Docker支持在主流的操作平臺上使用,包括Windows、Linux、MacOS等,本次使用Docker的yum源來進行安裝。
yum倉庫配置
vim /etc/yum.repo.d/docker.repo
[docker]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
安裝Docker
yum -y install docker-engine
開啟服務
systemctl start docker.service //開啟服務 systemctl enable docker.service //設置為開機自啟
配置阿裏雲鏡像加速器
在使用Docker的過程中涉及到從倉庫下載鏡像,利用國外的源下載鏡像時,有時下載速度會特別慢,這裏我使用的阿裏雲的鏡像加速服務。安裝安裝1.10.0以上版本的Docker客戶端
配置鏡像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-‘EOF‘
{
"registry-mirrors": ["https://j0bdjvov.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
參考:阿裏雲容器鏡像服務
Docker鏡像操作
查看版本
docker version //查看所使用Docker版本
搜索鏡像
使用docker search + 關鍵字的方式,搜索遠端倉庫中的鏡像,搜索返回很多包含關鍵字的鏡像,其中返回信息包含鏡像名稱(NAME)、描述(DESCRIPTION)、星級(STARS)、是否官方創建(OFFICIAL)、是否主動創建(AUTOMATED)。默認的輸出信息會按照星級進行排序,星級表示了鏡像的受歡迎程度,越高越好用。這裏我以httpd為例搜索。
docker search httpd
下載鏡像
docker pull httpd
從下載的過程可以看出,鏡像文件由若幹層(layer)組成,這種組成方式稱之為AUFS(聯合文件系統),是實現增量保存與更新的基礎,下載過程中會輸出鏡像的各層信息。
查看鏡像信息
docker images //查詢系統中所有鏡像的信息
參數信息:
- REPOSITORY——鏡像屬於的倉庫
- TAG——鏡像的標簽信息
- IMAGE ID——鏡像的唯一id號,鏡像的唯一標識
- CREATED——鏡像創建時間
- VIRTUAL SIZE——鏡像大小
使用鏡像id,查看鏡像詳細信息
命令格式:docker inspect 鏡像id號
docker inspect 11426a19f1a2
鏡像添加新標簽
鏡像名稱的改變包括鏡像名稱和鏡像標簽,使用 docker tag進行修改,httpd(修改後名稱,自定義):lamp(修改後標簽,自定義)
docker tag httpd httpd:lamp
鏡像刪除
使用docker rmi刪除多余的鏡像,可以使用鏡像的標簽或者是鏡像id刪除鏡像,當一個鏡像有多個標簽時,刪除命令只會刪除該鏡像多個標簽中的指定標簽,並不會影響鏡像文件。
當鏡像未在容器中運行時,可直接刪除鏡像
當鏡像在容器中運行時,則需先刪除容器,方可刪除鏡像
存出和載入鏡像
存出鏡像
當需要將一臺機器上的鏡像遷移到另一臺機器使用時,需將鏡像保存為本地文件,這一過程叫做存出鏡像,鏡像存出保存在當前目錄。
docker save -o nginx nginx:latest
載入鏡像
將存出的鏡像拷貝到另一臺機器上使用,然後將該導出文件導入到該機器的鏡像庫中,這一過程叫做載入鏡像,這裏載入的方式有兩種,使用的方式也不盡相同。
docker load < nginx //方式一 docker --input nginx //方式二
上傳鏡像
使用官方的鏡像倉庫(Docker Hub),或者采用阿裏雲鏡像倉庫。
登錄阿裏雲Docker Registry
$ sudo docker login --username=[用戶名] registry.cn-qingdao.aliyuncs.com 用於登錄的用戶名為阿裏雲賬號全名,密碼為開通服務時設置的密碼。
從Registry中拉取鏡像
$ sudo docker pull registry.cn-qingdao.aliyuncs.com/[命名空間/倉庫名稱]:[鏡像版本號]
將鏡像推送到Registry
$ sudo docker login [email protected] registry.cn-qingdao.aliyuncs.com $ sudo docker tag [ImageId] registry.cn-qingdao.aliyuncs.com/[命名空間/倉庫名稱]:[鏡像版本號] $ sudo docker push registry.cn-qingdao.aliyuncs.com/[命名空間/倉庫名稱]:[鏡像版本號] //請根據實際鏡像信息替換示例中的[ImageId]、[鏡像版本號]和[命名空間/倉庫名稱]參數。
參考:阿裏雲容器鏡像服務
Docker容器操作
容器的創建與啟動
容器的創建是將鏡像加載到容器的過程,Docker的容器十分輕量級,用戶可以隨時創建或者刪除。新創建的容器默認處於停止狀態,不運行任何程序,需要在其中發起一個進程來啟動容器,這個進程是該容器的唯一進程,所以當該進程結束的時候,容器也會完全停止。停止的容器重新啟動並保留原來的修改。在創建完成容器時會返回唯一的ID。
容器的創建
docker create -it nginx:latest /bin/bash //-i 讓容器的輸入保持打開 -t 讓Docker分配一個偽終端 docker ps -a //查看所有容器的運行狀態 -a 顯示系統最近一次啟動的容器
容器的啟動
docker start 9ced2c379b0b //可以是容器的id或者是容器名稱
一鍵創建並啟動容器
用戶可以直接執行docker run,直接創建並啟動容器,等同於先執行docker create,再執行docker start。需要註意的是,一旦命令執行結束,容器也會停止。當運用docker run來創建容器時,Docker在後臺的標準過程是:
- 檢查本地是否存在指定鏡像,若不存在,則會從公共倉庫下載
- 利用鏡像創建並啟動一個容器
- 分配一個文件系統給容器,在只讀的鏡像層外面掛載一層可讀寫層
- 從宿主主機的網橋接口中橋接一個虛擬機接口到容器中
- 分配一個地址池中的IP地址給容器
- 執行用戶指定的應用程序
- 執行完畢後容器被終止運行
docker run centos /usr/bin/bash -c ls /
若是需要讓docker容器以守護態形式在後臺運行,可以添加 -d 選項來實現
docker run -d centos /usr/bin/bash -c "while true;do echo hello;done"
容器的終止
docker stop 9ced2c379b0b
容器的進入
想要進入容器,要確保容器處於up狀態
容器的導出與導入
用戶可以將任何一個docker容器從一臺機器遷移到另一臺機器,在遷移過程中首先要將已經創建好的容器導出為文件,無論容器是處於運行狀態還是關閉狀態均可導出,導出之後將文件傳輸到其他機器上,使用導入命令,實現容器的遷移。
docker export cc10d2c6a7b3 > centos7 cat centos7 | docker import - centos7:test
容器的刪除
對於容器的刪除,一般是對處於關閉狀態的容器操作,但是也可對處於運行狀態的容器進行,使用-f選項,不推薦。
docker rm cc10d2c6a7b3
Docker資源控制
Cgroup是Control group的簡寫,是Linux內核提夠的一種限制使用物理資源的機制,主要包括CPU、內存、blkio。
對CPU的控制
限制cpu使用速率
使用 --cpu-quota 選項來限制cpu的使用率,cpu的百分比是以1000為單位
docker run --cpu-quota 20000 容器名 //cpu的使用率限定為20%
多任務按比例分享CPU
docker run --cpu-shares 1024 容器A docker run --cpu-shares 1024 容器B docker run --cpu-shares 1024 容器C //此時cpu的分配比例為1:1:2
限制cpu內核使用
使用 --cpuset-cpus選項來使某些程序獨享cpu內核,以便提高其處理速度,選項0表示第一個內核,依次第二個,第三個。
docker run --cpuset-cpus 0,1,2,3 容器名 //使容器綁定1~4內核使用
對內存使用的限制
docker容器中通過命令來限制內存使用量,當容器Cgrop使用的內存超過了限制的容量,Linux內核將會嘗試回收這些內存,如果依舊無法控制內存使用在限制範圍之內,進程將會被殺死。
docker run -m 1024m 容器名 //限制使用內存為1G
對blkio的限制
如果在一臺服務器上進行容器的混合部署,那麽會出現同時有幾個程序寫磁盤數據的情況,這時可以通過--device-write-iops選項來限制寫入的iops,相應的還有--device-read-bps選項限制讀取的iops。該方法只針對blkio限制的是設備,而不是分區。
docker run --device-write-bps /dev/sda1:1mb 容器名 //限制容器的/dev/sda1的寫入ipos為1MB
Docker的安裝、鏡像操作、容器操作及資源控制