Docker是在linux容器裏運行應用的開源工具,是一種輕量級的虛擬機。Docker包含三大核心概念,分別是:鏡像、容器和倉庫。Docker的容器技術能夠在一臺主機上輕鬆的爲任何應用建立一個輕量級的、可移植的、自給自足的容器。經過這種容器打包應用程序,意味着簡化了從新部署、調試這些瑣碎的重複工做。極大地提升了工做效率。linux
Docker容器與傳統虛擬化的比較nginx
特性 | Docker容器 | 虛擬機 |
---|---|---|
啓動速度 | 秒級 | 分鐘級 |
計算能力消耗 | 幾乎無 | 消耗50% |
性能 | 接近原生 | 弱於 |
單機系統支持量 | 上千個 | 幾十個 |
隔離性 | 資源限制 | 徹底隔離 |
Docker的鏡像是建立容器的基礎,相似虛擬機的快照,能夠理解爲一個面向Docker容器的只讀模板。例如,一個鏡像能夠是一個完整的centos操做系統環境,成爲一個centos鏡像;也能夠是一個安裝了MySQL的應用程序,稱爲一個MySQL鏡像。docker
Docker的容器是從鏡像建立的運行實例,它能夠被啓動、中止和刪除。所建立的每個容器都是相互隔離、互不可見的,能夠保證平臺的安全性。能夠把容器看做是一個簡單的linux環境,Docker利用容器來運行和隔離應用。json
Docker倉庫是用來集中保存鏡像的地方,當建立了本身的鏡像以後,可使用push將它上傳到公共倉庫或者私有倉庫,這樣,當你下次要在另外一臺機器上使用鏡像時,只須要pull下來便可。vim
Docker支持在主流的操做平臺上使用,包括Windows、Linux、MacOS等,本次使用Docker的yum源來進行安裝。centos
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
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
參考:阿里雲容器鏡像服務bash
docker version //查看所使用Docker版本
使用docker search + 關鍵字的方式,搜索遠端倉庫中的鏡像,搜索返回不少包含關鍵字的鏡像,其中返回信息包含鏡像名稱(NAME)、描述(DESCRIPTION)、星級(STARS)、是否官方建立(OFFICIAL)、是否主動建立(AUTOMATED)。默認的輸出信息會按照星級進行排序,星級表示了鏡像的受歡迎程度,越高越好用。這裏我以httpd爲例搜索。服務器
docker search httpd
docker pull httpd
從下載的過程能夠看出,鏡像文件由若干層(layer)組成,這種組成方式稱之爲AUFS(聯合文件系統),是實現增量保存與更新的基礎,下載過程當中會輸出鏡像的各層信息。
ide
docker images //查詢系統中全部鏡像的信息
參數信息:
命令格式: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),或者採用阿里雲鏡像倉庫。
$ sudo docker login --username=[用戶名] registry.cn-qingdao.aliyuncs.com 用於登陸的用戶名爲阿里雲帳號全名,密碼爲開通服務時設置的密碼。
$ sudo docker pull registry.cn-qingdao.aliyuncs.com/[命名空間/倉庫名稱]:[鏡像版本號]
$ sudo docker login --username=46877806@qq.com registry.cn-qingdao.aliyuncs.com $ sudo docker tag [ImageId] registry.cn-qingdao.aliyuncs.com/[命名空間/倉庫名稱]:[鏡像版本號] $ sudo docker push registry.cn-qingdao.aliyuncs.com/[命名空間/倉庫名稱]:[鏡像版本號] //請根據實際鏡像信息替換示例中的[ImageId]、[鏡像版本號]和[命名空間/倉庫名稱]參數。
參考:阿里雲容器鏡像服務
容器的建立是將鏡像加載到容器的過程,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在後臺的標準過程是:
docker run centos /usr/bin/bash -c ls /
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
Cgroup是Control group的簡寫,是Linux內核提夠的一種限制使用物理資源的機制,主要包括CPU、內存、blkio。
使用 --cpu-quota 選項來限制cpu的使用率,cpu的百分比是以1000爲單位
docker run --cpu-quota 20000 容器名 //cpu的使用率限定爲20%
docker run --cpu-shares 1024 容器A docker run --cpu-shares 1024 容器B docker run --cpu-shares 1024 容器C //此時cpu的分配比例爲1:1:2
使用 --cpuset-cpus選項來使某些程序獨享cpu內核,以便提升其處理速度,選項0表示第一個內核,依次第二個,第三個。
docker run --cpuset-cpus 0,1,2,3 容器名 //使容器綁定1~4內核使用
docker容器中經過命令來限制內存使用量,當容器Cgrop使用的內存超過了限制的容量,Linux內核將會嘗試回收這些內存,若是依舊沒法控制內存使用在限制範圍以內,進程將會被殺死。
docker run -m 1024m 容器名 //限制使用內存爲1G
若是在一臺服務器上進行容器的混合部署,那麼會出現同時有幾個程序寫磁盤數據的狀況,這時能夠經過--device-write-iops選項來限制寫入的iops,相應的還有--device-read-bps選項限制讀取的iops。該方法只針對blkio限制的是設備,而不是分區。
docker run --device-write-bps /dev/sda1:1mb 容器名 //限制容器的/dev/sda1的寫入ipos爲1MB