跟傳統VM比較具備以下優勢:html
運行時的性能能夠獲取極大提高,管理操做(啓動,中止,開始,重啓等等) 都是以秒或毫秒爲單位的。前端
你會擁有足夠的「操做系統」,僅需添加或減少鏡像便可。在一臺服務器上能夠佈署100~1000個Containers容器。可是傳統虛擬化,你虛擬10-20個虛擬機就不錯了。python
開源的,免費的,低成本的。由現代Linux內核支持並驅動。注* 輕量的Container一定能夠在一個物理機上開啓更多「容器」,註定比VMs要便宜。mysql
Docker 在以下幾個方面具備較大的優點:linux
Docker在整個開發週期均可以完美的輔助你實現快速交付。Docker容許開發者在裝有應用和服務本地容器作開發。能夠直接集成到可持續開發流程中。nginx
開發者可使用一個標準的鏡像來構建一套開發容器,開發完成以後,運維人員能夠直接使用這個容器來部署代碼。 Docker 能夠快速建立容器,快速迭代應用程序,並讓整個過程全程可見,使團隊中的其餘成員更容易理解應用程序是如何建立和工做的。 Docker 容器很輕很快!容器的啓動時間是秒級的,大量地節約開發、測試、部署的時間。git
Docker容器幾乎能夠在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、我的電腦、服務器等。 這種兼容性可讓用戶把一個應用程序從一個平臺直接遷移到另一個。github
Docker的兼容性和輕量特性能夠很輕鬆的實現負載的動態管理。你能夠快速擴容或方便的下線的你的應用和服務,這種速度趨近實時。golang
Docker 對系統資源的利用率很高,一臺主機上能夠同時運行數千個 Docker 容器。容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘可能小。傳統虛擬機方式運行 10 個不一樣的應用就要起 10 個虛擬機,而Docker 只須要啓動 10 個隔離的應用便可。web
使用 Docker,只須要小小的修改,就能夠替代以往大量的更新工做。全部的修改都以增量的方式被分發和更新,從而實現自動化而且高效的管理。
一個完整的Docker鏡像能夠支撐一個Docker容器的運行,在Docker容器運行過程當中主要提供文件系統數據支撐。
Docker鏡像做爲docker中最基本的概念,有如下幾個特性:
Docker容器,能夠理解爲一個或多個運行進程,而這些運行進程將佔有相應的內存,相應的CPU計算資源,相應的虛擬網絡設備以及相應的文件系統資源。而Docker容器所佔用的文件系統資源,則經過Docker鏡像的鏡像層文件來提供。
基於每一個鏡像的json文件,Docker能夠經過解析Docker鏡像的json的文件,獲知應該在這個鏡像之上運行什麼樣的進程,應該爲進程配置怎麼樣的環境變量,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能夠配置的國內鏡像有不少可供選擇,例如: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服務便可,修改倉庫地址爲國內倉庫後,獲取鏡像速度很是快。
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 |
截取容器中止時的退出狀態值。 |
#查看虛擬機(容器)的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/
一般來說,開發人員和管理人員默認經過命令行來建立及運行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端口
管理啓動,中止容器實例
#將修改的新容器提交爲新鏡像; docker commit f43cc8b041d0 #默認會提交到images列表中; docker images #默認提交的鏡像名稱是None,能夠修改鏡像名稱; docker tag b95ad546e113 nginx2 |
#將修改的新容器提交爲新鏡像;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 |
基於Docker run建立Docker容器時,可使用--net選項指定容器的網絡模式,Docker默認有如下四種網絡模式:
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橋接網卡配置,操做流程以下:
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 |
DEVICE="br0" BOOTPROTO=static ONBOOT=yes TYPE="Bridge" IPADDR=192.168.86.128 NETMASK=255.255.255.0 GATEWAY=192.168.86.2 |
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 |
docker pull docker.io/registry |
mkdir -p /data/registry/ docker run -itd -p 5000:5000 -v /data/registry:/var/lib/registry docker.io/registry |
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 |
docker pull busybox docker tag busybox 192.168.86.128:5000/busybox docker push 192.168.86.128/busybox |
curl -XGET http://192.168.86.128:5000/v2/_catalog curl -XGET http://192.168.86.128:5000/v2/busybox/tags/list |
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鏡像。
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類型; |
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? ~* |
從企業需求出發,定製適合本身需求、高效方便的鏡像,能夠參考官方Dockerfile文件,也能夠根據自身的需求,逐步的完善,在構建中不斷優化Dockerfile文件;
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.
咱們若是如今啓動sshd,sshd會報錯:
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
咱們看到容器IP爲192.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 .
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 |
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 |
最終截圖以下:
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 |
1) Docker容器支持CPU、MEM、DISK的資源的配置的,默認配置的參數指令:
啓動容器:
docker run -itd --privileged --net=none --cpuset-cpus=0-1 -m 1024m --name=ssh_86.132 centos-ssh:v1 /bin/bash
#查看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,沒法作到動態給正在運行容器指定大小,
第一種方式:指定容器啓動默認磁盤大小
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)最後驗證磁盤大小: