Docker架構、鏡像及容器的安裝和基本操做

Docker概念

  • Docker是在Linux容器裏運行應用的開源工具,是一種輕量級的虛擬機。Docker的宗旨:Build,Ship and Run Any APP,Anywhere,即經過對應用組件的分裝、發佈、部署、運行等生命週期的管理,達到應用組件級別的「一次分裝,處處運行」的目的。這裏的組件,既能夠是一個應用,也能夠是一套服務,甚至是一個完整的操做系統。
  • Docker容器很快,啓動和中止能夠在秒級實現,比傳統虛擬機要快不少;Docker核心解決的問題是利用容器來實現相似VM的功能,從而更加節省的硬件資源提供給用戶更多的計算資源,因此Docker容器除了運行其中的應用以外,基本不消耗額外的系統資源,從而在保證應用性能的同時,減少了系統開銷,使得在一臺主機上同時運行數千個Docker容器成爲可能;Docker操做方便,還能夠經過Dockerfile配置文件支持靈活的自動化建立和部署。

Docker的核心概念

  • 鏡像(Image):是建立容器的基礎,相似於虛擬機的快照,能夠理解爲是一個面向Docker容器引擎的只讀模板。
  • 容器(Container):是從鏡像建立的運行實例,它能夠被啓動、中止、刪除。所建立的每個容器都是相互隔離、互不可見的,能夠保證平臺的安全性。還能夠把容器看做是一個簡易版的Linux環境,Docker利用容器來運行和隔離應用。
  • 倉庫(Repository):是用來集中保存鏡像的地方,當建立了本身的鏡像以後,可使用push命令將它上傳到公共倉庫(Public)或者私有倉庫(Private),這樣一來當下次要在另外一臺機器上使用這個鏡像的時候,只須要從倉庫上pull下來就能夠了。倉庫的註冊地址是http://hub.docker.com

Docker容器與傳統虛擬化的比較

特性 Docker容器 虛擬機
啓動速度 秒級 分鐘級
計算能力損耗 幾乎無 損耗50%左右
性能 接近原生 弱於
系統支持量(單機) 上千個 幾十個
隔離性 資源限制 徹底隔離

Docker之因此擁有衆多優點,跟操做系統虛擬化自身的特色是分不開的。傳統虛擬機須要有額外的虛擬機管理程序和虛擬機操做系統。而Docker容器是直接在操做系統層面之上實現的虛擬化,如圖所示:
Docker架構、鏡像及容器的安裝和基本操做php

Docker安裝

在CentOS系統下安裝Docker能夠有兩種方式:linux

  • 使用curl得到Docker的安裝腳本進行安裝。
  • 使用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運行容器前須要本地存在對應的鏡像,若是不存在本地鏡像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   #上傳鏡像

Docker容器操做

鏡像是隻讀模板,而容器會給這個只讀模板一個額外的可寫層。

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選項強制刪除,但建議先將容器中止再作刪除操做。

Docker資源控制

1.對CPU的控制

1)限制CPU使用速率

  • 在Docker中能夠經過 --cpu-quota選項來限制CPU的使用率,CPU的百分比是以1000爲單位的。
    docker run --cpu-quota 20000 容器名 #CPU的使用率限定爲20%
  • 在CentOS中還能夠經過修改對應的Cgrep配置文件/sys/fs/cgroup/cpu/docker/容器編號/cpu.cfs_quota_us的值來實現,直接執行echo命令將設定值導入到此文件中就會當即生效。
    [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 容器名
相關文章
相關標籤/搜索