特性 | Docker容器 | 虛擬機 |
---|---|---|
啓動速度 | 秒級 | 分鐘級 |
計算能力損耗 | 幾乎無 | 損耗50%左右 |
性能 | 接近原生 | 弱於 |
系統支持量(單機) | 上千個 | 幾十個 |
隔離性 | 資源限制 | 徹底隔離 |
Docker之因此擁有衆多優點,跟操做系統虛擬化自身的特色是分不開的。傳統虛擬機須要有額外的虛擬機管理程序和虛擬機操做系統。而Docker容器是直接在操做系統層面之上實現的虛擬化,如圖所示:
php
在CentOS系統下安裝Docker能夠有兩種方式:linux
使用YUM倉庫來安裝。git
注意:目前Docker只能支持64位系統docker
1.倉庫配置apache
[root@localhost ~]# vim /etc/yum.repos.d/docker.repo #建立docker倉庫 添加如下內容: [docker-repo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/7/ enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg
2.使用YUM安裝Dockervim
[root@localhost ~]# yum install docker -y
3.啓動Docker並設置爲開機自啓動centos
[root@localhost ~]# systemctl stop firewalld.service [root@localhost ~]# setenforce 0 [root@localhost ~]# systemctl start docker.service [root@localhost ~]# systemctl enable docker.service
4.檢查Docker版本能夠查看Docker服務安全
[root@localhost ~]# docker version Client: #docker客戶端 Version: 1.13.1 API version: 1.26 Package version: docker-1.13.1-68.gitdded712.el7.centos.x86_64 Go version: go1.9.4 Git commit: dded712/1.13.1 Built: Tue Jul 17 18:34:48 2018 OS/Arch: linux/amd64 Server: #docker服務端 Version: 1.13.1 API version: 1.26 (minimum version 1.12) Package version: docker-1.13.1-68.gitdded712.el7.centos.x86_64 Go version: go1.9.4 Git commit: dded712/1.13.1 Built: Tue Jul 17 18:34:48 2018 OS/Arch: linux/amd64 Experimental: false
註解: 安裝好的Docker系統有兩個程序:Docker服務端和Docker客戶端。其中Docker服務端是一個服務進程,管理着全部的容器。Docker客戶端則扮演着Docker服務端的遠程控制器,能夠用來控制Docker的服務端進程。大部分狀況下Docker服務端和客戶端運行在一臺機器上。
Docker運行容器前須要本地存在對應的鏡像,若是不存在本地鏡像Docker就會嘗試從默認鏡像倉庫下載https://hub.docker.combash
1.搜索鏡像服務器
命令格式:docker search 關鍵字
在使用下載鏡像前,可使用docker search命令,搜索遠端官方倉庫中的共享鏡像
[root@localhost ~]# docker search httpd #搜索關鍵字爲httpd的鏡像 INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/httpd The Apache HTTP Server Project 1885 [OK] docker.io docker.io/hypriot/rpi-busybox-httpd Raspberry Pi compatible Docker Image with ... 41 docker.io docker.io/centos/httpd 19 [OK] docker.io docker.io/centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or b... 14 docker.io docker.io/armhf/httpd The Apache HTTP Server Project 8 docker.io docker.io/macadmins/netboot-httpd use in combination with bruienne/bsdpy 6 [OK] docker.io docker.io/salim1983hoop/httpd24 Dockerfile running apache config 2 [OK] docker.io docker.io/epflidevelop/os-wp-httpd WP httpd 1 [OK] docker.io docker.io/fboaventura/dckr-httpd Small footprint http server to use with ot... 1 [OK] docker.io docker.io/lead4good/httpd-fpm httpd server which connects via fcgi proxy... 1 [OK] docker.io docker.io/tplatform/aws-linux-httpd24-php70 aws-linux-httpd24-php70 1 [OK] docker.io docker.io/tplatform/aws-linux-httpd24-php71-fpm aws-linux-httpd24-php71-fpm 1 [OK] ......//省略
參數註解: NAME:鏡像名稱 DESCRIPTION:描述信息 STARS :星級 OFFICIAL:是否官方建立 AUTOMATED:是否主動建立 默認的輸出結果會按照星級評價進行排序,表示該鏡像受歡迎程度,在下載鏡像時,能夠參考這一項,在搜索時還可使用-s或者--stars=x顯示指定星級以上的鏡像,星級越高表示越受歡迎。
2.獲取鏡像
搜索到符合需求的鏡像,可使用docker pull命令從網絡下載鏡像到本地使用。
命令格式:docker pull 倉庫名稱 [:標籤]
[root@localhost ~]# docker pull docker.io/httpd #下載鏡像docker.io/httpd Using default tag: latest #最新版本 Trying to pull repository docker.io/library/httpd ... latest: Pulling from docker.io/library/httpd d660b1f15b9b: Pull complete aa1c79a2fa37: Pull complete f5f6514c0aff: Pull complete 676d3dd26040: Pull complete 4fdddf845a1b: Pull complete 520c4b04fe88: Pull complete 5387b1b7893c: Pull complete Digest: sha256:8c84e065bdf72b4909bd55a348d5e91fe265e08d6b28ed9104bfdcac9206dcc8 Status: Downloaded newer image for docker.io/httpd:latest #下載成功 從整個下載的過程能夠看出,鏡像文件由若干層(Layer)組成,稱之爲AUFS(聯合文件系統),是實現增量保存與更新的基礎,下載過程當中會輸出鏡像的各層信息。
注意: 若是下載鏡像時不指定標籤,則會默認下載倉庫中最新版本的鏡像,即選擇標latest標籤,也能夠經過指定的標籤來下載特色版本的某一鏡像。這裏的標籤(tag)就是用來區分鏡像版本的。
3.查看鏡像信息
命令語法:docker images 倉庫名稱 :[標籤]
[root@localhost ~]# docker images #查看本地全部鏡像 REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/httpd latest 11426a19f1a2 9 days ago 178 MB
參數註解: REPOSITORY:鏡像屬於的倉庫 TAG :鏡像的標記信息,標記同一倉庫中的不一樣鏡像。 IMAGE ID :鏡像的惟一ID號,惟一標識了該鏡像。 CREATED :鏡像建立時間 SIZE :鏡像大小
用戶還能夠根據鏡像的惟一標識ID號,獲取鏡像詳細信息。
命令格式:docker inspect 鏡像ID號
[root@localhost ~]# docker inspect 11426a19f1a2
爲本地鏡像添加新的標籤
命令格式:docker tag 名稱 :[標籤] 新名稱 :[新標籤]
[root@localhost ~]# docker tag docker.io/httpd httpd:httpd [root@localhost ~]# docker images | grep httpd docker.io/httpd latest 11426a19f1a2 9 days ago 178 MB httpd httpd 11426a19f1a2 9 days ago 178 MB
4.刪除鏡像
刪除鏡像的操做方法有兩種:使用鏡像的標籤刪除鏡像;使用鏡像的ID刪除鏡像。
命令格式:docker rmi 倉庫名稱 : 標籤
[root@localhost ~]# docker rmi 11426a19f1a2 #刪除鏡像的ID號 [root@localhost ~]# docker rmi httpd:httpd #刪除鏡像的標籤 Untagged: httpd:httpd [root@localhost ~]# docker images | grep httpd docker.io/httpd latest 11426a19f1a2 9 days ago 178 MB
注意: 1)當一個鏡像有多個標籤的時候,docker rmi 命令只是刪除該鏡像多個標籤中的指定標籤,不會影響鏡像文件,但當該鏡像只剩下一個標籤的時候就要當心了,再使用刪除命令就會完全刪除該鏡像。 2)當使用docker rmi命令後面跟上鏡像的ID號時,必須確保該鏡像沒有被容器使用才能進行,刪除時系統會先刪除掉指向該鏡像的全部標籤,而後刪除該鏡像文件自己。若是該鏡像已經被容器使用,要先刪除依賴該鏡像的使用容器,再刪除鏡像。
5.存儲鏡像和載入鏡像
命令格式:docker save -o 存儲文件名 存儲的鏡像
[root@localhost ~]# docker save -o httpd docker.io/httpd #本地鏡像存出文件爲httpd [root@localhost ~]# ls -l httpd -rw-------. 1 root root 186415616 8月 10 11:24 httpd
載入鏡像
命令格式:docker load < 存出文件 或者 docker --input 存出的文件
6.上傳鏡像
本地存儲的鏡像愈來愈多,就須要指定一個專門的地方存放這些鏡像——倉庫。目前比較方便的就是公共倉庫,默認上傳到Docker Hub官方倉庫,須要註冊使用公共倉庫的帳號,可使用docker login命令來輸入用戶名、密碼和郵箱來完成註冊登陸。在上傳鏡像以前還須要對本地鏡像添加新的標籤,而後再使用docker push命令進行上傳。
命令格式:docker push 倉庫名稱 : 標籤
[root@localhost ~]# docker tag docker.io/httpd docke/httpd:centos7 #添加新標籤 [root@localhost ~]# docker login #登陸 Username: docke Password: [root@localhost ~]# docker push docke/httpd:centos7 #上傳鏡像
鏡像是隻讀模板,而容器會給這個只讀模板一個額外的可寫層。
1.容器的建立與啓動
容器的建立就是將鏡像加載到容器的過程。新建立的容器默認處於中止狀態,不容許任何程序,須要在其中發起一個進程來啓動容器,這個進程是該容器的惟一進程,當該進程結束的時候,容器也會徹底中止。中止的容器能夠從新啓動並保留原來的修改。
命令格式:docker create [選項] 鏡像 運行的程序
1)建立新容器
-i 讓容器的輸入保持打開 -t 讓Docker分配一個僞終端 [root@localhost ~]# docker create -it docker.io/httpd /bin/bash 96a826f750d53024dc63c3328c4ac45ae2a499b9ae613d700da38e7be99e452d #新容器的惟一ID
2)使用docker ps命令查看容器的運行狀態,-a 列出系統最近一次啓動的容器。
[root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 96a826f750d5 docker.io/httpd "/bin/bash" 4 minutes ago Created happy_gates
參數註釋: CONTAINER ID :容器的ID號 IMAGE :加載的鏡像 COMMAND :運行的程序 CREATED :建立的時間 STATUS :目前所處的狀態、端口映射
3)啓動中止狀態的容器
命令格式:docker start 容器的ID/ 名稱
[root@localhost ~]# docker start 96a826f750d5 96a826f750d5 [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 96a826f750d5 docker.io/httpd "/bin/bash" 9 minutes ago Up 13 seconds 80/tcp happy_gates
4)建立並啓動容器,能夠指向docker run 命令,等同於先執行docker create 命令,再執行docker start 命令。注意:只有後面的命令運行結束,容器就會中止。
[root@localhost ~]# docker run centos /usr/bin/bash -c ls / #建立、開啓centos容器並查詢鏡像的根目錄 anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var [root@localhost ~]# docker ps -a #查看容器的運行狀態 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES db67843e7d92 centos "/usr/bin/bash -c ..." 31 seconds ago Exited (0) 30 seconds ago festive_goldberg ae4c24239956 httpd "/bin/bash" 6 minutes ago Up 5 minutes 80/tcp nervous_kalam
讓容器再後臺持續運行
[root@localhost ~]# docker run -d centose /usr/bin/bash -c "while true;do echo hello;done"
2.容器的運行與終止
命令格式:docker stop 容器的ID/ 名稱
[root@localhost ~]# docker stop ae4c24239956 ae4c24239956 [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ae4c24239956 httpd "/bin/bash" 31 minutes ago Exited (0) 2 seconds ago nervous_kalam
3.容器的進入
命令格式:docker exec -it 容器 ID/ 名稱 /bin/bash
進入正在運行的容器
[root@localhost ~]# docker exec -it ae4c24239956 /bin/bash #進入容器 用戶能夠經過所建立的終端來輸入命令,經過exit命令退出容器: root@ae4c24239956:/usr/local/apache2# ls bin build cgi-bin conf error htdocs icons include logs modules root@ae4c24239956:/usr/local/apache2# exit exit
4.容器的導出與導入
用戶能夠將任何一個Docker容器從一臺機器遷移到另外一臺機器。在遷移的過程當中,首先須要將已經建立好的容器導出爲文件,可使用docker export命令實現,不管這個容器是處於運行狀態仍是中止狀態都可導出。導出以後可將導出文件傳輸到其餘機器,經過相應的導入命令實現容器的遷移。
命令格式:docker export 容器 ID/ 名稱 > 文件名
導出ae4c24239956 容器到文件 centos7tar
[root@localhost ~]# docker export ae4c24239956 > centos7tar [root@localhost ~]# ls -l centos7tar -rw-r--r--. 1 root root 182633984 8月 11 18:23 centos7tar
導出的文件從A機器拷貝到B機器,以後使用docker import命令導入,成爲鏡像。
命令格式:cat 文件名 | docker import - 生成的鏡像名稱 : 標籤
導入文件 centos7tar成爲本地鏡像
[root@localhost ~]# cat centos7tar | docker import - centos7:tes [root@localhost ~]# docker images | grep centos7 centos7 test 442bc7482423 5 minutes ago 174MB
5.容器的刪除
命令格式:docker rm 容器ID/ 名稱
[root@localhost ~]# docker rm ae4c24239956
注意: 若是要刪除一個正在運行的容器,能夠添加-f選項強制刪除,但建議先將容器中止再作刪除操做。
1.對CPU的控制
1)限制CPU使用速率
docker run --cpu-quota 20000 容器名 #CPU的使用率限定爲20%
[root@localhost ~]# echo 20000 > /sys/fs/cgroup/cpu/docker/ae4c24239956ee20786a966cd4db9a459a459e2c47faaf03977ab88d03b7a834/cpu.cfs_quota_us
2)多任務按比例分享CPU
當有多個容器任務運行時,很難計算CPU的使用率。爲了使容器合理使用CPU資源,能夠經過--cpu-share選項設置CPU按比例共享CPU資源,這種方式還能夠實現CPU使用率的動態調整。
好比:運行三個容器A、B、C,佔用CPU資源的比例爲1:1:2,能夠這樣執行:
docker run --cpu-share 1024 容器A docker run --cpu-share 1024 容器B docker run --cpu-share 2048 容器C
3)限制CPU的內核使用
在Docker中可使用--cpuset-cpus選項來使某些程序獨享CPU內核,以便提升其處理速度。
若是服務器有16個內核,那麼CPU的編號爲0~15,使容器綁定1~5個內核使用,則:
docker run --cpuset-cpus 0,1,2,3,4 容器名
建議: 儘可能使用綁定內核的方式分配CPU資源給容器進程使用,而後再配合 --cpu-share選項動態調整CPU使用資源的比例。
2.對內存使用的限制
在Docker中能夠經過docker run -m命令來限制容器內存使用量,相應的Cgroup配置文件爲/sys/fs/cgroup/memory/memory.limit_in_bytes 。可是須要注意:一旦容器Cgroup使用的內存超過了限制的容量,Linux內核將會嘗試收回這些內存,若是仍舊無法控制內存使用在限制範圍以內,進程就會被殺死。
例如:限制容器的內存爲512M
docker run -m 512m 容器名
3.對blkio的限制
若是是在一臺服務器上進行容器的混合部署,那麼會出現同時有幾個程序寫磁盤數據的狀況,這時能夠經過 --device-write-iops選項來限制寫入的iops,相應的還有 --device-read-bps選項能夠限制讀取的iops。可是這種方法只能針對blkio限制的是設備(device),而不是分區。相應Cgroup寫配置文件/sys/fs/cgroup/blkio/docker/容器ID/blkio.throttle.write_iops_device。
例如:限制容器的/dev/sda1 的寫入iops爲1MB
docker run --device-write-bps /dev/sda1:1mb 容器名