Docker虛擬化

1. Docker虛擬化特色

跟傳統VM比較具備以下優勢:html

  • 操做啓動快

運行時的性能能夠獲取極大提高,管理操做(啓動,中止,開始,重啓等等) 都是以秒或毫秒爲單位的。前端

  • 輕量級虛擬化

你會擁有足夠的「操做系統」,僅需添加或減少鏡像便可。在一臺服務器上能夠佈署100~1000個Containers容器。可是傳統虛擬化,你虛擬10-20個虛擬機就不錯了。python

  • 開源免費

開源的,免費的,低成本的。由現代Linux內核支持並驅動。注* 輕量的Container一定能夠在一個物理機上開啓更多「容器」,註定比VMs要便宜。mysql

2. 爲何使用docker

Docker 在以下幾個方面具備較大的優點:linux

  • 更快速的交付和部署

Docker在整個開發週期均可以完美的輔助你實現快速交付。Docker容許開發者在裝有應用和服務本地容器作開發。能夠直接集成到可持續開發流程中。nginx

開發者可使用一個標準的鏡像來構建一套開發容器,開發完成以後,運維人員能夠直接使用這個容器來部署代碼。 Docker 能夠快速建立容器,快速迭代應用程序,並讓整個過程全程可見,使團隊中的其餘成員更容易理解應用程序是如何建立和工做的。 Docker 容器很輕很快!容器的啓動時間是秒級的,大量地節約開發、測試、部署的時間。git

  • 高效的部署和擴容

Docker容器幾乎能夠在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、我的電腦、服務器等。 這種兼容性可讓用戶把一個應用程序從一個平臺直接遷移到另一個。github

Docker的兼容性和輕量特性能夠很輕鬆的實現負載的動態管理。你能夠快速擴容或方便的下線的你的應用和服務,這種速度趨近實時。golang

  • 更高的資源利用率

Docker 對系統資源的利用率很高,一臺主機上能夠同時運行數千個 Docker 容器。容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘可能小。傳統虛擬機方式運行 10 個不一樣的應用就要起 10 個虛擬機,而Docker 只須要啓動 10 個隔離的應用便可。web

  • 更簡單的管理

使用 Docker,只須要小小的修改,就能夠替代以往大量的更新工做。全部的修改都以增量的方式被分發和更新,從而實現自動化而且高效的管理。

3. Docker鏡像原理

一個完整的Docker鏡像能夠支撐一個Docker容器的運行,在Docker容器運行過程當中主要提供文件系統數據支撐。

Docker鏡像做爲docker中最基本的概念,有如下幾個特性:

  • 鏡像分層,每一個鏡像都由一個或多個鏡像層組成;
  • 可經過在某個鏡像加上必定的鏡像層獲得新鏡像(此過程可經過編寫dockerfile或基於容器Commit實現);
  • 每一個鏡像層擁有惟一鏡像ID;
  • 鏡像在存儲和使用時共享相同的鏡像層(根據ID),因此在pull鏡像時,已有的鏡像層會自動跳過下載;
  • 每一個鏡像層都是隻讀,即便啓動成容器,也沒法對其真正的修改,修改只會做用於最上層的容器層;

Docker容器,能夠理解爲一個或多個運行進程,而這些運行進程將佔有相應的內存,相應的CPU計算資源,相應的虛擬網絡設備以及相應的文件系統資源。而Docker容器所佔用的文件系統資源,則經過Docker鏡像的鏡像層文件來提供。

基於每一個鏡像的json文件,Docker能夠經過解析Docker鏡像的json的文件,獲知應該在這個鏡像之上運行什麼樣的進程,應該爲進程配置怎麼樣的環境變量,Docker守護進程實現了靜態向動態的轉變。

4. Docker安裝配

CentOS7.x Linux,基於YUM二進制方式,操做命令以下:

#安裝第三方Epel-relase擴展源;

yum install epel-release -y

#安裝Docker軟件包程序;

yum install docker -y

#查看Docker軟件包是否部署;

yum list docker

rpm -qa|grep -w docker

#啓動Docker Engine服務;

systemctl start docker.service

#查看Docker版本信息;

docker version

 
根據如上Docker部署方法,Docker虛擬化平臺構建完成,如圖所示:

5. Docker倉庫源更新實戰

Docker默認鏈接的國外官方鏡像,一般根據網絡狀況不一樣,訪問時快時慢,大多時候獲取速度很是慢,爲了提示效率能夠自建倉庫或者先修改成國內倉庫源,提高拉取鏡像的速度。

Docker能夠配置的國內鏡像有不少可供選擇,例如:Docker中國區官方鏡像、阿里雲、網易蜂巢、DaoCloud等,這些都是國內比較快的鏡像倉庫。

從國外官網下載Docker Tomcat鏡像,訪問速度慢,

Docker鏡像修改方法,vim /etc/docker/daemon.json,執行以下命令便可:

cat>/etc/docker/daemon.json<<EOF
{

"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com"]

}

EOF

service docker restart

systemctl start docker.service

重啓Docker服務便可,修改倉庫地址爲國內倉庫後,獲取鏡像速度很是快。

6. Docker經常使用命令講解

Docker經常使用命令詳解:

docker  version #查看版本

docker  search centos #搜索可用docker鏡像

docker  images 查看當前docker全部鏡像

docker  pull  centos #下載鏡像

cat   centos.tar | docker import  -  centos6  #Docker導入鏡像

docker  export  容器id  > cenos6.tar  #Docker導出鏡像

docker  run   centos echo "hello word"  #docker容器中運行hello world!

docker  run  centos yum install ntpdate   #在容器中安裝ntpdate的程序

docker  ps -l 命令得到最後一個容器的id

docker   ps  -a查看全部的容器。

運行docker commit 提交剛修改的容器,例如:

docker  commit  2313132(容器的id  centos:v1

docker run -it -d  --privileged  --name docker-web centos /bin/bash 生成一個新的/bin/bash shell環境的容器,能夠登陸進入操做,其中-t 表示打開一個終端的意思,-i表示能夠交互輸入,--name 表示容器的名字, --privileged表示特權較高能夠mount並容器裏面啓動容器

docker exec -it  id  /bin/bash  進入容器裏面

docker  run  -d  centos:v1  /bin/bash  ,-d表示在後臺啓動,以daemon方式啓動。  

docker stop  id 關閉容器

docker start  id 啓動某個容器

docker  rm  id 刪除容器,docker  rmi  images刪除鏡像

docker  run  -d  -p 80:80   centos:v2,解析:-p指定容器啓動後docker上運行的端口映射及容器裏運行的端口,80:80,第一個80表示docker系統上的80,第二個80表示docker虛擬機裏面的端口。用戶默認訪問本機80端口,自動映射到容器裏面的80端口。

Docker命令表格以下:

docker

search

在docker hub中搜索鏡像;

docker

pull

從docker鏡像源服務器拉取指定鏡像或者庫鏡像;

docker

push

推送指定鏡像或者庫鏡像至docker源服務器;

docker

history

展現一個鏡像造成歷史;

docker

images

列出系統當前鏡像;

docker

run

建立一個新的容器並運行一個命令;

docker

start

啓動容器;

docker

stop

中止容器;

docker

attach

當前shell下attach鏈接指定運行鏡像;

docker

build

經過Dockerfile定製鏡像;

docker

commit

提交當前容器爲新的鏡像;

docker

cp

從容器中拷貝指定文件或者目錄到宿主機中;

docker

create

建立一個新的容器,同run,但不啓動容器;

docker

diff

查看docker容器變化;

docker

events

從docker服務獲取容器實時事件;

docker

exec

在已存在的容器上運行命令;

docker

export

導出容器的內容流做爲一個tar歸檔文件[對應import];

docker

import

從tar包中的內容建立一個新的文件系統映像[對應export];

docker

info

顯示系統相關信息;

docker

inspect

查看容器詳細信息;

docker

kill

指定docker容器;

docker

load

從一個tar包中加載一個鏡像[對應save];

docker

login

註冊或者登錄一個docker源服務器;

docker

logout

Docker registry退出;

docker

logs

輸出當前容器日誌信息;

docker

port

查看映射端口對應的容器內部源端口;

docker

pause

暫停容器;

docker

ps

列出容器列表;

docker

restart

重啓運行的容器;

docker

rm

移除一個或者多個容器;

docker

rmi

移除一個或多個鏡像;

docker

save

保存一個鏡像爲一個tar包[對應load];

docker

tag

給源中鏡像打標籤,修改鏡像名稱;

docker

top

查看容器中運行的進程信息;

docker

unpause

取消暫停容器;

docker

version

查看docker版本號;

docker

wait

截取容器中止時的退出狀態值。

7. Docker虛擬化平臺的案例

1)根據如上的Docker部署指令,Docker虛擬化平臺構建完成,做爲運維人員如何在企業中應用好Docker軟件呢?可以使用Docker虛擬化平臺實現哪些企業需求呢?Docker虛擬化技術的產物是Docker容器(虛擬機)。
2)要掌握Docker虛擬化技術,首先要了解3個Docker虛擬化相關的概念:
  •  Docker鏡像
Docker鏡像相似Linux ISO鏡像文件,主要是存儲了各類應用程序、軟件服務、各類數據等,爲Docker虛擬化的產物(虛擬機)提供數據支撐的,後續的虛擬機所需的文件、數據都是從鏡像文件中獲取的,並且Docker鏡像內容只讀的、不能被修改的、模板數據。
  • Docker容器(虛擬機)
Docker容器(虛擬機)是基於Docker鏡像運行以後的實例,相似進程和程序的關係(進程是程序運行以後的實例),Docker容器是可讀、可寫的,不能直接修改鏡像的數據內容,鏡像是持續爲容器提供服務,沒有鏡像就沒有容器,容器永遠離不開鏡像。
  •  Docker倉庫
Docker倉庫是用於存儲鏡像的地方,倉庫一般分爲兩類:公共倉庫、私有倉庫,企業測試環境、生產環境推薦自建私有倉庫,私有倉庫:安全、穩定、高效、管理、定製性。
 
3)基於Docker虛擬化平臺,構建一套Nginx WEB服務器(容器),同時讓NginxWEB服務器對外提供WEB服務,用戶經過瀏覽器能夠實現頁面的訪問,操做步驟以下:
#在Docker倉庫中搜索Nginx鏡像;
docker search nginx
 
#從Docker倉庫下載Nginx鏡像;
docker pull docker.io/nginx
#查看本地Nginx鏡像列表;
docker images|grep -i nginx
 
#基於本地Nginx鏡像啓動Nginx WEB服務(容器|虛擬機);
docker run -itd -p 80:80 docker.io/nginx
    Run,全新啓動一臺容器(虛擬機);
  • -i,interactive交互模式;
  • -t,tty打開一個終端;
  • -d,daemon後臺啓動;
  • -p,開啓DNAT映射,將宿主機80映射至容器的80,用戶訪問宿主機的80便是訪問容器的80。
#查看已經啓動的Nginx虛擬機(容器);
  • docker ps

#訪問Nginx容器中的WEB服務;

#查看虛擬機(容器)的IP地址;

docker inspect 3d5559023d71|grep -i ipaddr|tail -1|awk -F\" '{print $4}'

#將宿主機的index.html文件部署至Nginx容器(虛擬機)中;

docker cp index.html 3d5559023d71:/usr/share/nginx/html/

8.WEB平臺管理&鏡像管理

Docker WEB管理

一般來說,開發人員和管理人員默認經過命令行來建立及運行Docker容器,但Docker的Remote API讓他們能夠經過充分利用REST(表明性狀態傳輸協議)的API,運行相同的命令。Docker UI也是基於API方式管理宿主機的Docker引擎。Docker UI Web前端程序讓你能夠處理一般經過Web瀏覽器的命令行來管理的許多任務。主機上的全部容器均可以經過僅僅一條鏈接來處理,該項目幾乎沒有任何依賴關係。該軟件目前仍在大力開發之中,可是它採用麻省理工學院(MIT)許可證,因此能夠免費地重複使用。

Docker UI不包含任何內置的身份驗證或安全機制,因此務必將任何公之於衆的DockerUI鏈接放在用密碼來保護的系統後面。

1)下載Docker UI鏡像;

只須要在宿主機pull相關的鏡像便可,指令以下:

docker pull uifd/ui-for-docker

docker images

 

2)啓動docker-UI服務,而且映射9000至容器9000;

docker run -it -d --name docker-web -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock docker.io/uifd/ui-for-docker

若是啓動Docker端口映射,報錯信息以下:

docker0: iptables: No chain/target/match by that name.

解決方法:

如上報錯信息是由於本地iptables規則策略沒有匹配的鏈表,解決方案以下:

pkill docker

iptables -t nat -F

ifconfig docker0 down

yum install -y bridge* -y

brctl delbr docker0

service docker restart

宿主機訪問:9000端口

 

管理啓動,中止容器實例

 

3)Docker 鏡像管理Commit(完整導出)

#將修改的新容器提交爲新鏡像;

docker commit f43cc8b041d0

#默認會提交到images列表中;

docker images

#默認提交的鏡像名稱是None,能夠修改鏡像名稱;

docker tag b95ad546e113 nginx2


4)Docker 鏡像管理Export|Import(導出丟失內存中數據)

#將修改的新容器提交爲新鏡像;docker export c16d454849b6 >centos-v2.tar

#默認不會提交到images列表中,而是在當前目錄;

ls -l centos-v2.tar

#若是將導出tar鏡像文件,導入鏡像列表&能夠加上名稱;

cat centos-v2.tar |docker import -

cat centos-v2.tar |docker import - centos:v2

5)Docker 鏡像管理Load|Save(主要是針對鏡像|完整導出)

#導入images列表中的鏡像爲tar文件;

docker save centos:v1 >centos-v3.tar

#導入tar文件至鏡像列表&默認無需修更名稱;

docker load < centos-v3.tar

9.Docker網絡剖析&Pipework網絡

基於Docker run建立Docker容器時,可使用--net選項指定容器的網絡模式,Docker默認有如下四種網絡模式:

  • host模式,使用--net=host指定;
  • container模式,使用--net=container:NAME_or_ID指定;
  • none模式,使用--net=none指定;,
  • bridge模式,使用--net=bridge指定,默認設置;

1) Host模式詳解:

默認Docker容器運行會分配獨立的Network Namespace隔離子系統,基於host模式,容器將不會得到一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace,容器將不會虛擬出本身的網卡,配置本身的IP等,而是使用宿主機的IP和端口。

2) Container模式詳解:

熟悉了host模式,Container模式也很是好理解,Container模式指定新建立的容器和已經存在的一個容器共享一個Network Namespace,而不是和宿主機共享。

即新建立的容器不會建立本身的網卡,配置本身的IP,而是和一個指定的容器共享IP、端口範圍等。一樣兩個容器除了網絡方面相同以外,其餘的如文件系統、進程列表等仍是隔離的。

3) None模式詳解:

None模式與其餘的模式都不一樣,若是處於None模式,Docker容器擁有本身的Network Namespace,可是並不爲Docker容器進行任何網絡配置。也就是說該Docker容器沒有網卡、IP、路由等信息,須要手工爲Docker容器添加網卡、配置IP等,典型Pipework工具爲Docker容器指定IP等信息;

4) Bridge橋接模式

Bridge模式是Docker默認的網絡模式,該模式會爲每個容器分配Network Namespace、設置IP、路由等配置,默認會將Docker容器鏈接到一個虛擬網橋交換機Docker0上。

Docker Bridge建立過程:

1) 首先宿主機上建立一對虛擬網卡veth pair設備,veth設備老是成對出現的,組成了一個數據的通道,數據從一個設備進入,就會從另外一個設備出來,veth設備經常使用來鏈接兩個網絡設備。

2) Docker將veth pair設備的一端放在新建立的容器中,並命名爲eth0,而後將另外一端放在宿主機中,以vethxxx這樣相似的名字命名,並將這個網絡設備加入到docker0網橋中,能夠經過brctl show命令查看。

3) 從docker0子網中分配一個IP給容器使用,並設置docker0的IP地址爲容器的默認網關。

4) 此時容器IP與宿主機可以通訊,宿主機也能夠訪問容器中的IP地址,在Bridge模式下,連在同一網橋上的容器之間能夠相互通訊,同時容器也能夠訪問外網,可是其餘物理機不能訪問docker容器IP,須要經過NAT將容器IP的port映射爲宿主機的IP和port。

Bridge自定義橋接br0:

基於CentOS7.x構建Docker橋接網絡,案例方法以下:

配置bridge橋接網絡能夠直接設置網卡配置文件:

/etc/sysconfig/network-scripts/下,修改ifcfg-ens32網卡配置,同時增長ifcfg-br0橋接網卡配置,操做流程以下:

#宿主機ens32網卡內容:
cat /etc/sysconfig/network-scripts/ifcfg-ens33

DEVICE=ens32

BOOTPROTO=static

ONBOOT=yes

TYPE=Ethernet

BRIDGE="br0"

IPADDR=192.168.86.128

NETMASK=255.255.255.0

GATEWAY=192.168.86.2

#宿主機br0網卡內容:
cat /etc/sysconfig/network-scripts/ifcfg-br0

DEVICE="br0"

BOOTPROTO=static

ONBOOT=yes

TYPE="Bridge"

IPADDR=192.168.86.128

NETMASK=255.255.255.0

GATEWAY=192.168.86.2

重啓網卡並啓動docker服務便可;

service network restart

systemctl daemon-reload

systemctl restart docker.service

 Docker默認提供了一個隔離的內網環境,啓動時會創建一個docker0的虛擬網卡,每一個容器都是鏈接到docker0網卡上的。而docker0的ip段爲172.17.0.1,若是想讓容器與宿主機同一網段的其餘機器訪問,就必須在啓動docker的時候將某個端口映射到宿主機的端口。

KVM的橋接網絡很是方便,其實docker也比較方便,至少不是自帶的橋接而已,今天咱們來說解centos7下若是快速實現docker容器橋接網絡,併爲容器分配外網IP。以下爲經過pipework工具配置容器IP方法:

安裝pipework

git clone https://github.com/jpetazzo/pipework

cp ~/pipework/pipework /usr/local/bin/

下載centos鏡像啓動容器並設置網絡

docker pull docker.io/jdeathe/centos-ssh

docker tag docker.io/jdeathe/centos-ssh centos-ssh (修改鏡像別名)

docker run -itd --privileged --net=none --name=ssh_86.131 centos-ssh /bin/bash

pipework  br0  centos-ssh  192.168.86.131/24@192.168.86.2(@後面是bro網卡)

進入容器查看ip

docker exec -it 8dec649772d4 /bin/bash   


 

10.Docker倉庫構建&倉庫管理

1)Docker虛擬化技術的底層支撐是Docker鏡像,沒有Docker鏡像,就不會存在Docker容器,Docker容器所需的數據能夠從鏡像中讀取的。Docker鏡像存儲在Docker倉庫中的,倉庫分爲兩種:
  • Docker公共倉庫:零配置、公共的、相對穩定、不安全、速度比較慢;
  • Docker私有倉庫:手工配置、私有、很穩定、安全、速度很是快。
2)下載Docker registry鏡像,命令以下:
docker pull docker.io/registry
3)啓動私有倉庫容器,啓動命令以下:

mkdir -p  /data/registry/

docker run -itd  -p  5000:5000 -v /data/registry:/var/lib/registry  docker.io/registry

Docker本地倉庫啓動後臺容器啓動,如圖所示:

 

4)將本地鏡像上傳至Docker倉庫中,命令操做以下;

for i in `docker images |awk 'NR>1 {print $1":"$2}'`;do echo $i ;done

for i in `docker images |awk 'NR>1 {print $1":"$2}'`;do docker tag $i localhost:5000/$i ;docker push localhost:5000/$i;done

5)客戶端上傳鏡像至本地私有倉庫,以下以busybox鏡像爲例,將busybox上傳至私有倉庫服務器。 

docker pull busybox

docker tag busybox 192.168.86.128:5000/busybox

docker push 192.168.86.128/busybox

6)檢測本地私有倉庫:

curl -XGET http://192.168.86.128:5000/v2/_catalog

curl -XGET http://192.168.86.128:5000/v2/busybox/tags/list

7)客戶端使用本地私有倉庫:
客戶端docker配置文件vim /etc/sysconfig/docker添加以下代碼,同時重啓docker服務,獲取本地私有倉庫如圖所示:

OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --insecure-registry 192.168.86.128:5000'

ADD_REGISTRY='--add-registry 192.168.86.128:5000'

至此,docker本地私有倉庫部署完畢,能夠向倉庫中添加或者更新Docker鏡像。

11.Dockerfile企業案例

因爲Docker官網公共倉庫鏡像大多不完整,沒法真正知足企業的生產環境系統,此時須要咱們自行定製鏡像或者從新打包鏡像。Docker鏡像製做是管理員的必備工做之一,Docker鏡像製做的方
法主要有兩種,製做方法以下:
  • Docker commit|export將新容器提交至Images列表;
  • 編寫Dockerfile,bulid新的鏡像至鏡像列表;

1. Dockerfile語法命令詳解一

企業生產環境推薦使用Dockerfile製做鏡像,Dockerfile製做原理:將基於一個基礎鏡像,經過編寫Dockerfile方式,將各個功能進行疊加,最終造成新的Docker鏡像,是目前互聯網企業中打包鏡像最爲推薦的方式。Dockerfile是一個鏡像的表示,也是一個鏡像的原材料,能夠經過Dockerfile來描述構建鏡像,並自動構建一個容器。
以下爲DockerFile製做鏡像,必備的指令和參數的詳解:

FROM  指定所建立鏡像的基礎鏡像;

MAINTAINER 指定維護者信息;

RUN 運行命令;

CMD 指定啓動容器時默認執行的命令;

LABEL 指定生成鏡像的元數據標籤信息;

EXPOSE 聲明鏡像內服務所監聽的端口;

ENV 指定環境變量;

ADD 賦值指定的<src>路徑下的內容到容器中的<dest>路徑下,<src>能夠爲URL;若是爲tar文件,會自動解壓到<dest>路徑下

COPY 賦值本地主機的<scr>路徑下的內容到容器中的<dest>路徑下;通常狀況下推薦使用COPY而不是ADD;

ENTRYPOINT 指定鏡像的默認入口;

VOLUME 建立數據掛載點;

USER 指定運行容器時的用戶名或UID;

WORKDIR 配置工做目錄;

ARG 指定鏡像內使用的參數(例如版本號信息等);

ONBUILD 配置當前所建立的鏡像做爲其餘鏡像的基礎鏡像時,所執行的建立操做的命令;

STOPSIGNAL 容器退出的信號;

HEALTHCHECK  如何進行健康檢查;

SHELL 指定使用SHELL時的默認SHELL類型;

2. Dockerfile語法命令詳解二

FROM指定所建立的鏡像的基礎鏡像,若是本地不存在,則默認會去Docker Hub下載指定鏡像。

格式爲:FROM<image>,或FROM<image>:<tag>,或FROM<image>@<digest>。任何Dockerfile中的第一條指令必須爲FROM指令。而且,若是在同一個Dockerfile文件中建立多個鏡像,可使用多個FROM指令(每一個鏡像一次)。

MAINTAINER指定維護者信息,格式爲MAINTAINER<name>。例如:MAINTAINER image_creator@docker.com 

該信息將會寫入生成鏡像的Author屬性域中。

RUN運行指定命令。

格式爲:RUN<command>或RUN ["executable","param1","param2"]。

注意:後一個指令會被解析爲json數組,因此必須使用雙引號。

前者默認將在shell終端中運行命令,即/bin/sh -c;後者則使用exec執行,不會啓動shell環境。

指定使用其餘終端類型能夠經過第二種方式實現,例如:

RUN ["/bin/bash","-c","echo hello"]

每條RUN指令將在當前鏡像的基礎上執行指定命令,並提交爲新的鏡像。當命令較長時可使用\換行。例如:

RUN apt-get update \

&& apt-get install -y libsnappy-dev zliblg-dev libbz2-dev \

&& rm -rf /var/cache/apt

CMD用來指定啓動容器時默認執行的命令。它支持三種格式:

CMD ["executable","param1","param2"] 使用exec執行,是推薦使用的方式;

CMD param1 param2 在/bin/sh中執行,提供給須要交互的應用;

CMD ["param1","param2"] 提供給ENTRYPOINT的默認參數。

每一個Dockerfile只能有一條CMD命令。若是指定了多條命令,只有最後一條會被執行。入股用戶啓動容器時指定了運行的命令(做爲run的參數),則會覆蓋掉CMD指定的命令。

LABEL指令用來生成用於生成鏡像的元數據的標籤信息。

格式爲:LABEL <key>=<value> <key>=<value> <key>=<value> ...。

例如:

LABEL version="1.0"

LABEL description="This text illustrates \ that label-values can span multiple lines."

EXPOSE聲明鏡像內服務所監聽的端口。

格式爲:EXPOSE <port> [<port>...]

例如:

EXPOSE 22 80 443 3306

注意:該命令只是起到聲明做用,並不會自動完成端口映射。在容器啓動時須要使用-P(大寫P),Docker主機會自動分配一個宿主機未被使用的臨時端口轉發到指定的端口;使用-p(小寫p),則能夠具體指定哪一個宿主機的本地端口映射過來。

ENV指定環境變量,在鏡像生成過程當中會被後續RUN指令使用,在鏡像啓動的容器中也會存在。

格式爲:ENV <key><value>或ENV<key>=<value>...。

例如:

ENV GOLANG_VERSION 1.6.3

ENV GOLANG_DOWNLOAD_RUL https://golang.org/dl/go$GOLANG_VERSION.linux-amd64.tar.gz

ENV GOLANG_DOWNLOAD_SHA256 cdd5e08530c0579255d6153b08fdb3b8e47caabbe717bc7bcd7561275a87aeb

RUN curl -fssL "$GOLANG_DOWNLOAD_RUL" -o golang.tar.gz && echo "$GOLANG_DOWNLOAD_SHA256 golang.tar.gz" | sha256sum -c - && tar -C /usr/local -xzf golang.tar.gz && rm golang.tar.gz

ENV GOPATH $GOPATH/bin:/usr/local/go/bin:$PATH

RUN mkdir -p "$GOPATH/bin" && chmod -R 777 "$GOPATH"

指令指定的環境變量在運行時能夠被覆蓋掉,如docker run --env <key>=<value> built_image。

ADD該指令將複製指定的<src>路徑下的內容到容器中的<dest>路徑下。

格式爲:ADD<src> <dest>

其中<src>可使Dockerfile所在目錄的一個相對路徑(文件或目錄),也能夠是一個URL,還能夠是一個tar文件(若是是tar文件,會自動解壓到<dest>路徑下)。<dest>可使鏡像內的絕對路徑,或者至關於工做目錄(WORKDIR)的相對路徑。路徑支持正則表達式,例如:

ADD *.c /code/

COPY複製本地主機的<src>(爲Dockerfile所在目錄的一個相對路徑、文件或目錄)下的內容到鏡像中的<dest>下。目標路徑不存在時,會自動建立。路徑一樣支持正則。格式爲:COPY <src> <dest>當使用本地目錄爲源目錄時,推薦使用COPY。

ENTRYPOINT指定鏡像的默認入口命令,該入口命令會在啓動容器時做爲根命令執行,全部傳入值做爲該命令的參數。

支持兩種格式:

ENTRYPOINT ["executable","param1","param2"] (exec調用執行);

ENTRYPOINT command param1 param2(shell中執行)。

此時,CMD指令指定值將做爲根命令的參數。

每一個Dockerfile中只能有一個ENTRYPOINT,當指定多個時,只有最後一個有效。

在運行時能夠被--entrypoint參數覆蓋掉,如docker run --entrypoint。

VOLUME

建立一個數據卷掛載點。

格式爲:VOLUME ["/data"]

能夠從本地主機或者其餘容器掛載數據卷,通常用來存放數據庫和須要保存的數據等。

USER

指定運行容器時的用戶名或UID,後續的RUN等指令也會使用特定的用戶身份。格式爲:USER daemon

當服務不須要管理員權限時,能夠經過該指令指定運行用戶,而且能夠在以前建立所須要的用戶。例如:

RUN groupadd -r nginx && useradd -r -g nginx nginx要臨時獲取管理員權限能夠用gosu或者sudo。

WORKDIR爲後續的RUN、CMD和ENTRYPOINT指令配置工做目錄。

格式爲:WORKDIR /path/to/workdir。

可使用多個WORKDIR指令,後續命令若是參數是相對的,則會基於以前命令指定的路徑。例如:

WORKDIR /a

WORKDIR b

WORKDIR c

RUN pwd

則最終路徑爲/a/b/c

ARG指定一些鏡像內使用的參數(例如版本號信息等),這些參數在執行docker build命令時才以--build-arg<varname>=<value>格式傳入。格式爲:ARG<name>[=<default value>]。

則能夠用docker build --build-arg<name>=<value>來指定參數值。

ONBUILD

配置當所建立的鏡像做爲其餘鏡像的基礎鏡像的時候,所執行建立操做指令。

格式爲:ONBUILD [INSTRUCTION]。

例如Dockerfile使用以下的內容建立了鏡像image-A:

[...]

ONBUILD ADD . /app/src

ONBUILD RUN /usr/local/bin/python-build --dir /app/src

[...]

若是基於image-A鏡像建立新的鏡像時,新的Dockerfile中使用FROM image-A指定基礎鏡像,會自動執行ONBUILD指令的內容,等價於在後面添加了兩條指令:

FROM image-A

# Automatically run the following

ONBUILD ADD . /app/src

ONBUILD RUN /usr/local/bin/python-build --dir /app/src

使用ONBUILD指令的鏡像,推薦在標籤中註明,例如:ruby:1.9-onbuild。

STOPSIGNAL

指定所建立鏡像啓動的容器接收退出的信號值。例如:

STOPSIGNAL singnal

HEALTHCHECK配置所啓動容器如何進行健康檢查(如何判斷是否健康),自Docker 1.12開始支持。格式有兩種:

HEALTHCHECK [OPTIONS] CMD command    :根據所執行命令返回值是否爲0判斷;HEALTHCHECK NONE:禁止基礎鏡像中的健康檢查。

 [OPTION]支持:

--inerval=DURATION  (默認爲:30s):多久檢查一次;

--timeout=DURATION  (默認爲:30s):每次檢查等待結果的超時時間;

--retries=N        (默認爲:3):若是失敗了,重試幾回才最終肯定失敗。

SHELL指定其餘命令使用shell時的默認shell類型。

格式爲: SHELL ["executable","parameters"]默認值爲 ["bin/sh","-c"]。

注意:對於Windows系統,建議在Dockerfile開頭添加# escape=`來指定轉移信息。

建立鏡像

編寫Dockerfile以後,能夠經過docker build命令來建立鏡像。

基本的docker build [選項] 內容路徑,該命令將讀取指定路徑下(包括子目錄)的Dockerfile,並將該路徑下的全部內容發送給Docker服務端,由服務端來建立鏡像。所以除非生成鏡像須要,不然通常建議放置Dockerfile的目錄爲空目錄。

若是使用非內容路徑下的Dockerfile,能夠經過-f選項來指定其路徑;

要指定生成鏡像的標籤信息,可使用-t選項。

例如:指定Dockerfile所在路徑爲 /tmp/docker_builder/,而且但願生成鏡像標籤爲build_repo/first_image,可使用下面的命令:

docker build -t build_repo/first_image /tmp/docker_builder

使用.dockerignore文件

能夠經過.dockeringore文件(每一行添加一條匹配模式)來讓Docker忽略匹配模式路徑下的目錄和文件。例如:

# comment

*/tmp*

*/*/tmp*

tmp?

~*

3.Dockerfile製做規範及技巧

從企業需求出發,定製適合本身需求、高效方便的鏡像,能夠參考官方Dockerfile文件,也能夠根據自身的需求,逐步的完善,在構建中不斷優化Dockerfile文件;

Dockerfile製做鏡像規範和技巧以下:

  • 精簡鏡像用途:儘可能讓每一個鏡像的用途都比較集中、單一,避免構造大而複雜、多功能的鏡像;
  • 選用合適的基礎鏡像:過大的基礎鏡像會形成構建出臃腫的鏡像,通常推薦比較小巧的鏡像做爲基礎鏡像;
  • 提供詳細的註釋和維護者信息: Dockerfile也是一種代碼,須要考慮方便後續擴展和他人使用;
  • 正確使用版本號:使用明確的具體數字信息的版本號信息,而非latest,能夠避免沒法確認具體版本號,統一環境;
  • 減小鏡像層數:減小鏡像層數建議儘可能合併RUN指令,能夠將多條RUN指令的內容經過&&鏈接;
  • 及時刪除臨時和緩存文件:這樣能夠避免構造的鏡像過於臃腫,而且這些緩存文件並無實際用途;
  • 提升生產速度:合理使用緩存、減小目錄下的使用文件,使用.dockeringore文件等;
  • 調整合理的指令順序:在開啓緩存的狀況下,內容不變的指令儘可能放在前面,這樣能夠提升指令的複用性;
  • 減小外部源的干擾:若是確實要從外部引入數據,須要制定持久的地址,並帶有版本信息,讓他人能夠重複使用而不出錯。

4.DockerFile企業案例一

DockerFile企業案例一,將啓動Docker容器,同時開啓Docker容器對外的22端口的監聽,實現經過CRT或者Xshell登陸:

#進入容器

docker exec -it 85aa1a867c3f /bin/bash

rpm --rebuilddb && yum  install  pam  cracklib-dicts -y

[root@5255b18871ae /]# echo '123456' | passwd --stdin root

Changing password for user root.

passwd: all authentication tokens updated successfully.

咱們若是如今啓動sshdsshd會報錯:

Could not load host key: /etc/ssh/ssh_host_rsa_key

Could not load host key: /etc/ssh/ssh_host_ecdsa_key

Could not load host key: /etc/ssh/ssh_host_ed25519_key

因此咱們先生成/etc/ssh/ssh_host_rsa_key/etc/ssh/ssh_host_ecdsa_key和/etc/ssh/ssh_host_ed25519_key

[root@85aa1a867c3f /]# ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''

[root@85aa1a867c3f /]# ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_ecdsa_key -N ''

[root@85aa1a867c3f /]# ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_ed25519_key -N ''

而後查一下容器的IP啓動sshd

[root@5255b18871ae /]# /usr/sbin/sshd 

咱們看到容器IP192.168.1.3,從外部遠程ssh到這個容器:

發現容器當即關閉了鏈接,緣由是容器的ssh使用了pam_loginuid.so模塊,咱們把它關掉:

[root@5255b18871ae /]# sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^/#/' /etc/pam.d/sshd

上述命令的意思是:在/etc/pam.d/sshd文件裏註釋掉"session    required     pam_loginuid.so"這一行。

而後從新啓動sshd

[root@5255b18871ae /]# /usr/sbin/sshd 

再次嘗試遠程ssh登入:

[root@localhost ~]# ssh root@192.168.1.3

root@192.168.1.3's password:

Last login: Tue Dec  2 03:00:07 2014 from 192.168.1.3

[root@5255b18871ae ~]#

登陸成功!

 Dockerfile文件方式製做以下:

Docker服務端建立Dockerfile文件,實現容器運行開啓22端口,內容以下:

# 設置基本的鏡像,後續命令都以這個鏡像爲基礎

FROM centos

# 做者信息

MAINTAINER JFEDU.NET

# RUN命令會在上面指定的鏡像裏執行任何命令

RUN rpm --rebuilddb;yum install passwd openssl openssh-server -y

RUN echo '123456' | passwd --stdin root

RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700

/root/.ssh

RUN ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''

RUN ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_ecdsa_key -N ''

RUN ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_ed25519_key -N ''

RUN sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^/#/' /etc/pam.d/sshd

# 暴露ssh端口22

EXPOSE 22

# 設定運行鏡像時的默認命令:輸出ip,並以daemon方式啓動sshd

CMD /usr/sbin/sshd;/bin/bash

基於Dockerfile來建立生成鏡像,命令以下:

docker build根據Dockerfile建立鏡像(centos:ssh)執行一下兩步:

docker  build  -t  centos:ssh  -  <  Dockerfile

docker  build  -t  centos:ssh  .

5. DockerFile企業案例二

DockerFile企業案例二,開啓SSH 6379端口,讓Redis端口對外訪問,Dockerfile內容以下:

# 設置基本的鏡像,後續命令都以這個鏡像爲基礎

FROM centos_lamp:v1

# 做者信息

MAINTAINER JFEDU.NET

# RUN命令會在上面指定的鏡像裏執行任何命令

RUN rpm --rebuilddb;yum install redis* -y

RUN sed -i '/bind/127.0.0.1/0.0.0.0/g' /etc/redis.conf

#暴露ssh端口6379

EXPOSE 6379

#設定運行以daemon方式啓動sshd

CMD /usr/sbin/redis -D

6. DockerFile企業案例三

DockerFile企業案例三,基於Dockerfile開啓Apache 80端口,並遠程鏈接服務器,dockerfile內容以下:

# 設置基本的鏡像,後續命令都以這個鏡像爲基礎

FROM centos_lamp:v1

# 做者信息

MAINTAINER JFEDU.NET

# RUN命令會在上面指定的鏡像裏執行任何命令

RUN rpm --rebuilddb;yum install pcre-devel -y

RUN rpm --rebuilddb;yum install httpd httpd-devel –y

RUN echo 「<h1>The Test Page JFEDU</h1>」

>>/var/www/html/index.html

#暴露ssh端口80

EXPOSE 80

#啓動httpd

CMD service httpd start;/bin/bash

最終截圖以下:

7. DockerFile企業案例四

DockerFile企業案例四,Docker虛擬化中,如何來構建咱們的MYSQL數據庫服務器呢?答案很簡單,咱們能夠是dockerfile來生成mysql鏡像並啓動運行便可。

FROM centos:v1

RUN groupadd -r mysql && useradd -r -g mysql mysql

RUN rpm --rebuilddb;yum install -y gcc zlib-devel gd-devel

ENV MYSQL_MAJOR 5.6

ENV MYSQL_VERSION 5.6.20

RUN curl -SL "http://dev.mysql.com/get/Downloads/MySQL-$MYSQL_MAJOR/mysq l-$MYSQL_VERSION-linux-glibc2.5-x86_64.tar.gz" -o mysql.tar.gz \ && curl -SL "http://mysql.he.net/Downloads/MySQL-$MYSQL_MAJOR/mysql-$MY SQL_VERSION-linux-glibc2.5x86_64.tar.gz.asc" -o mysql.tar.gz.asc \ && mkdir /usr/local/mysql \ && tar -xzf mysql.tar.gz -C /usr/local/mysql \ && rm mysql.tar.gz* \

ENV PATH $PATH:/usr/local/mysql/bin:/usr/local/mysql/scripts

WORKDIR /usr/local/mysql

VOLUME /var/lib/mysql

EXPOSE 3306

CMD /usr/local/mysql/bin/mysqld_safe

12.Docker容器CPU&MEM&DISK資源擴容

一、Docker容器CPU&MEM資源擴容

1) Docker容器支持CPU、MEM、DISK的資源的配置的,默認配置的參數指令:

  • CPU配置:--cpuset-cpus=0-0;
  • MEM配置:-m 512m;

啓動容器:

  • privileged:特權:容許執行mount等root執行的命令,還能夠容器裏面啓動容器

docker run -itd --privileged --net=none --cpuset-cpus=0-1 -m 1024m --name=ssh_86.132 centos-ssh:v1 /bin/bash

2Docker容器Disk硬盤資源擴容一(Overlay2驅動方式) 

#查看docker默認驅動命令是docker info|egrep "Storage Driver"

第一種方式:指定容器啓動默認磁盤大小

Overlay2驅動方式:不支持在線擴容

Docker容器默認啓動的虛擬機,會佔用宿主機的資源CPU、內存、硬盤),例如默認Docker基於Overlay2驅動方式,容器硬盤的rootfs 根分區空間是整個宿主機的空間大小。

能夠指定默認容器的大小(在啓動容器的時候指定),能夠在docker配置文件:/etc/sysconfig/docker中,OPTIONS參數後面添加以下代碼,指定Docker容器rootfs容量大小爲10G:

vi /etc/sysconfig/docker

OPTIONS='--storage-opt overlay2.size=10G'

修改Docker存儲配置文件,加入以下代碼:(默認若是已經爲overlay2,則無需修改)

vi /etc/sysconfig/docker-storage

DOCKER_STORAGE_OPTIONS="--storage-driver overlay2 "

而後重啓docker便可;

 Overlay2 Docker磁盤驅動模式,若是要調整其大小,經過如上的方法,會致使Docker引擎服務沒法啓動,還須要文件系統設置爲xfs,而且支持目錄級別的磁盤配額功能;

CentOS7.x Xfs磁盤配額配置,新添加一塊硬盤,設置磁盤配額方法步驟以下:

1)添加新的硬盤如圖所示:

 2)格式化硬盤爲xfs文件系統格式,命令以下:

mkfs.xfs -f /dev/sdb

3)建立data目錄,後續將做爲docker數據目錄;

mkdir /data/ -p

4)掛載data目錄,

mount -o uquota,prjquota /dev/sdb /data/

或者寫入fstab執行mount -a

5)docker引擎默認數據存儲目錄:/var/lib/docker重命名,而且將/data/docker目錄軟連接至/var/lib/下便可;

mkdir -p /data/docker/

cd /var/lib/

mv docker docker.bak

ln -s /data/docker/  .

6)重啓Docker服務,而且查看進程,能夠看到docker overlay2.size大小配置,如圖所示:

 7) 基於Docker客戶端指令啓動Docker容器,而且查看最新容器的磁盤空間爲10G,則設置容器大小成功,如圖所示:

以上方法只適用於新容器生成,而且修改後須要重啓docker,沒法作到動態給正在運行容器指定大小, 

三、Docker容器Disk硬盤資源擴容二(DeviceMapper驅動方式)

第一種方式:指定容器啓動默認磁盤大小

DeviceMapper驅動方式:支持在線擴容

Docker容器硬盤熱擴容操做記錄centos 7裏使用docker的時候默認存儲引擎是Overlay2,而DeviceMapper驅動支持ext二、ext三、ext4,不支持xfs,而xfs是CentOS7的默認文件系統類型

因此建議docker服務器的文件系統格式調整爲ext4(在centos7系統安裝時能夠手動指定所在分區爲ext4格式)。

操做步驟:

1,以在docker配置文件:/etc/sysconfig/docker中,OPTIONS參數後面添加以下代碼,指定Docker容器rootfs容量大小爲10G:

OPTIONS='--storage-opt dm.basesize=10G'

 2,修改Docker存儲配置文件,修改默認存儲引擎爲DeviceMapper,加入以下代碼:(默認若是已經爲devicemapper,則無需修改)

vi /etc/sysconfig/docker-storage

DOCKER_STORAGE_OPTIONS="--storage-driver devicemapper"

而後重啓docker便可;

devicemapper Docker磁盤驅動模式,若是要調整其大小,經過如上的方法,會致使Docker引擎服務沒法啓動,還須要格式化文件系統設置爲ext4,而且支持目錄級別的磁盤配額功能;

CentOS7.x ext4磁盤配額配置,新添加一塊硬盤,設置磁盤配額方法步驟以下:

 2)格式化硬盤爲ext4文件系統格式,命令以下:

mkfs.ext4 -f /dev/sdb

3)建立data目錄,後續將做爲docker數據目錄;

mkdir /data/ -p

4)掛載data目錄下,vi /etc/fstab  && mount -a

5)將docker引擎默認數據存儲目錄:/var/lib/docker重命名,而且將/data/docker目錄軟連接至/var/lib/下便可;

mkdir -p /data/docker/

cd /var/lib/

mv docker docker.bak

ln -s /data/docker/  .

6)重啓Docker服務,而且查看進程,能夠看到docker dm.basesize大小配置,如圖所示:

7) 基於Docker客戶端指令啓動Docker容器,而且查看最新容器的磁盤空間爲10G,則設置容器大小成功,如圖所示:

 

 

第二種方法:在線擴容正在運行容器指定大小 :

xfs文件系統修改文件系統大小命令:xfs_growfs

ext4文件系統修改文件系統大小命令:  resize2fs

1)查看現有的容器磁盤大小:

2)查看mapper設備:

3)查看卷信息表:

4)根據要擴展的大小,計算須要多少扇區:

第二個數字是設備的大小,表示有多少個512-bytes 的扇區. 這個值略高於 10GB 的大小。

咱們來計算一下一個 15GB 的卷鬚要多少扇區,

echo $((15*1024*1024*1024/512))   31457280

5)修改卷信息表--激活--而且驗證(紅色3個部分)

echo 0 31457280 thin 253:2 62|dmsetup load docker-8:16-131100-7181dfff737acecb33c71d4b8dd79beef3bd84e34df6c4e51cd5096591548009

dmsetup resume docker-8:16-131100-7181dfff737acecb33c71d4b8dd79beef3bd84e34df6c4e51cd5096591548009

dmsetup table docker-8:16-131100-7181dfff737acecb33c71d4b8dd79beef3bd84e34df6c4e51cd5096591548009

6)修改文件系統大小:

先查看卷所在的目錄是什麼文件系統,centos7默認爲xfs用xfs_growfs 命令,若是是ext4則用resize2fs命令

8)最後驗證磁盤大小:

相關文章
相關標籤/搜索