每一輪新技術的興起,不管對公司仍是我的既是機會也是挑戰。docker
我我的的見解是:若是某項新技術將來將成爲主流,就應該及早儘快掌握。 由於:ubuntu
一、新技術意味着新的市場和新的需求。
初期掌握這種技術的人不會不少,而市場需求會愈來愈大,於是會造成供不該求的賣方市場,物以稀爲貴,這對技術人員將是一個可貴的價值提高機會。vim
二、學習新技術須要時間和精力,早起步早成材。服務器
三、本文主要總結容器核心知識,進階知識之後有機會在學習網絡
What - 什麼是容器?
容器是一種輕量級、可移植、自包含的軟件打包技術,使應用程序能夠在幾乎任何地方以相同的方式運行。開發人員在本身筆記本上建立並測試好的容器,無需任何修改就可以在生產系統的虛擬機、物理服務器或公有云主機上運行。架構
How-爲何須要容器?socket
Docker 將集裝箱思想運用到軟件打包上,爲代碼提供了一個基於容器的標準化運輸系統。Docker 能夠將任何應用及其依賴打包成一個輕量級、可移植、自包含的容器。容器能夠運行在幾乎全部的操做系統上學習
容器基本入門測試
Docker 的核心組件包括:ui
Docker 客戶端 - Client:經過docker在host上構建和運行容器
Docker 服務器 - Docker daemon:是服務器組件,以 Linux 後臺服務的方式運行。
Docker 鏡像 - Image:經過它能夠建立 Docker 容器。
Registry:存放 Docker 鏡像的倉庫,Registry 分私有和公有兩種。
Docker 容器 - Container
Docker 架構以下圖所示:
Docker 採用的是 Client/Server 架構。客戶端向服務器發送請求,服務器負責構建、運行和分發容器。客戶端和服務器能夠運行在同一個 Host 上,客戶端也能夠經過 socket 或 REST API 與遠程的服務器通訊。
新鏡像是從 base 鏡像一層一層疊加生成的。每安裝一個軟件,就在現有鏡像的基礎上增長一層。
問什麼 Docker 鏡像要採用這種分層結構呢?
最大的一個好處就是 - 共享資源。
好比:有多個鏡像都從相同的 base 鏡像構建而來,那麼 Docker Host 只需在磁盤上保存一份 base 鏡像;同時內存中也只需加載一份 base 鏡像,就能夠爲全部容器服務了。並且鏡像的每一層均可以被共享,咱們將在後面更深刻地討論這個特性。
dockerfile文件建立鏡像
Dockerfile 是一個文本文件,記錄了鏡像構建的全部步驟。
第一個 Dockerfile
用 Dockerfile 建立上節的 ubuntu-with-vi,其內容則爲:
下面咱們運行 docker build 命令構建鏡像並詳細分析每一個細節。
root@ubuntu:~# pwd ①
/root
root@ubuntu:~# ls ②
Dockerfile
root@ubuntu:~#docker build -t ubuntu-with-vi-dockerfile . ③
Sending build context to Docker daemon 32.26 kB ④
Step 1 : FROM ubuntu ⑤
---> f753707788c5
Step 2 : RUN apt-get update && apt-get install -y vim ⑥
---> Running in 9f4d4166f7e3 ⑦
......
Setting up vim (2:7.4.1689-3ubuntu1.1) ...
---> 35ca89798937 ⑧
Removing intermediate container 9f4d4166f7e3 ⑨
Successfully built 35ca89798937 ⑩
root@ubuntu:~#
① 當前目錄爲 /root。
② Dockerfile 準備就緒。
③ 運行 docker build 命令,-t 將新鏡像命名爲 ubuntu-with-vi-dockerfile,命令末尾的 . 指明 build context 爲當前目錄。Docker 默認會從 build context 中查找 Dockerfile 文件,咱們也能夠經過 -f 參數指定 Dockerfile 的位置。
④ 從這步開始就是鏡像真正的構建過程。 首先 Docker 將 build context 中的全部文件發送給 Docker daemon。build context 爲鏡像構建提供所須要的文件或目錄。
Dockerfile 中的 ADD、COPY 等命令能夠將 build context 中的文件添加到鏡像。此例中,build context 爲當前目錄 /root,該目錄下的全部文件和子目錄都會被髮送給 Docker daemon。
因此,使用 build context 就得當心了,不要將多餘文件放到 build context,特別不要把 /、/usr 做爲 build context,不然構建過程會至關緩慢甚至失敗。
⑤ Step 1:執行 FROM,將 ubuntu 做爲 base 鏡像。
ubuntu 鏡像 ID 爲 f753707788c5。
⑥ Step 2:執行 RUN,安裝 vim,具體步驟爲 ⑦、⑧、⑨。
⑦ 啓動 ID 爲 9f4d4166f7e3 的臨時容器,在容器中經過 apt-get 安裝 vim。
⑧ 安裝成功後,將容器保存爲鏡像,其 ID 爲 35ca89798937。
這一步底層使用的是相似 docker commit 的命令。
⑨ 刪除臨時容器 9f4d4166f7e3。
⑩ 鏡像構建成功。
經過 docker images 查看鏡像信息。
鏡像 ID 爲 35ca89798937,與構建時的輸出一致。
在上面的構建過程當中,咱們要特別注意指令 RUN 的執行過程 ⑦、⑧、⑨。Docker 會在啓動的臨時容器中執行操做,並經過 commit 保存爲新的鏡像。
查看鏡像分層結構
ubuntu-with-vi-dockerfile 是經過在 base 鏡像的頂部添加一個新的鏡像層而獲得的。
這個新鏡像層的內容由 RUN apt-get update && apt-get install -y vim 生成。這一點咱們能夠經過 docker history 命令驗證。
docker history 會顯示鏡像的構建歷史,也就是 Dockerfile 的執行過程。
回顧一下經過 Dockerfile 構建鏡像的過程:
從 base 鏡像運行一個容器。
執行一條指令,對容器作修改。
執行相似 docker commit 的操做,生成一個新的鏡像層。
Docker 再基於剛剛提交的鏡像運行一個新容器。
重複 2-4 步,直到 Dockerfile 中的全部指令執行完畢。
下面列出了 Dockerfile 中最經常使用的指令,完整列表和說明可參看官方文檔。
FROM
指定 base 鏡像。
MAINTAINER
設置鏡像的做者,能夠是任意字符串。
COPY
將文件從 build context 複製到鏡像。
COPY 支持兩種形式:
COPY src dest
COPY ["src", "dest"]
注意:src 只能指定 build context 中的文件或目錄。
ADD
與 COPY 相似,從 build context 複製文件到鏡像。不一樣的是,若是 src 是歸檔文件(tar, zip, tgz, xz 等),文件會被自動解壓到 dest。
ENV
設置環境變量,環境變量可被後面的指令使用。例如:
...
ENV MY_VERSION 1.3
RUN apt-get install -y mypackage=$MY_VERSION
...
EXPOSE
指定容器中的進程會監聽某個端口,Docker 能夠將該端口暴露出來。咱們會在容器網絡部分詳細討論。
VOLUME
將文件或目錄聲明爲 volume。咱們會在容器存儲部分詳細討論。
WORKDIR
爲後面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令設置鏡像中的當前工做目錄。
RUN
在容器中運行指定的命令。
CMD
容器啓動時運行指定的命令。
Dockerfile 中能夠有多個 CMD 指令,但只有最後一個生效。CMD 能夠被 docker run 以後的參數替換。
ENTRYPOINT
設置容器啓動時運行的命令。
Dockerfile 中能夠有多個 ENTRYPOINT 指令,但只有最後一個生效。CMD 或 docker run 以後的參數會被當作參數傳遞給 ENTRYPOINT。
下面咱們來看一個較爲全面的 Dockerfile:
注:Dockerfile 支持以「#」開頭的註釋。
下面是鏡像的經常使用操做子命令:
images 顯示鏡像列表
history 顯示鏡像構建歷史
commit 從容器建立新鏡像
build 從 Dockerfile 構建鏡像
tag 給鏡像打 tag
pull 從 registry 下載鏡像
push 將 鏡像 上傳到 registry
rmi 刪除 Docker host 中的鏡像
search 搜索 Docker Hub 中的鏡像
除了 rmi 和 search,其餘命令都已經用過了。
rmi
rmi 只能刪除 host 上的鏡像,不會刪除 registry 的鏡像。
Search:默認在docker hub 中查找鏡像:docker search httpd
容器指令
容器的經常使用操做命令:
create 建立容器
run 運行容器
pause 暫停容器
unpause 取消暫停繼續運行容器
stop 發送 SIGTERM 中止容器
kill 發送 SIGKILL 快速中止容器
start 啓動容器
restart 重啓容器
attach attach 到容器啓動進程的終端
exec 在容器中啓動新進程,一般使用 "-it" 參數
logs 顯示容器啓動進程的控制檯輸出,用 "-f" 持續打印
rm 從磁盤中刪除容器
如下三者是當前主流的容器編排引擎。
docker swarm 是 Docker 開發的容器編排引擎。
kubernetes 是 Google 領導開發的開源容器編排引擎,同時支持 Docker 和 CoreOS 容器。
mesos 是一個通用的集羣資源調度平臺,mesos 與 marathon 一塊兒提供容器編排引擎功能。