一:Docker簡介
1:Docker是什麼
1.1:爲什麼會有Docker出現
一款產品從開發到上線,從操作系統,到運行環境,再到應用配置。作爲開發+運維之間的協作我們需要關心很多東西,這也是很多互聯網公司都不得不面對的問題,特別是各種版本的迭代之後,不同版本環境的兼容,對運維人員都是考驗
Docker之所以發展如此迅速,也是因爲它對此給出了一個標準化的解決方案。
環境配置如此麻煩,換一臺機器,就要重來一次,費力費時。很多人想到,能不能從根本上解決問題,軟件可以帶環境安裝?也就是說,安裝的時候,把原始環境一模一樣地複製過來。開發人員利用 Docker 可以消除協作編碼時“在我的機器上可正常工作”的問題。
之前在服務器配置一個應用的運行環境,要安裝各種軟件,就拿尚硅谷電商項目的環境來說吧,Java/Tomcat/MySQL/JDBC驅動包等。安裝和配置這些東西有多麻煩就不說了,它還不能跨平臺。假如我們是在 Windows 上安裝的這些環境,到了 Linux 又得重新裝。況且就算不跨操作系統,換另一臺同樣操作系統的服務器,要移植應用也是非常麻煩的。
傳統上認爲,軟件編碼開發/測試結束後,所產出的成果即是程序或是能夠編譯執行的二進制字節碼等(java爲例)。而爲了讓這些程序可以順利執行,開發團隊也得準備完整的部署文件,讓維運團隊得以部署應用程式,開發需要清楚的告訴運維部署團隊,用的全部配置文件+所有軟件環境。不過,即便如此,仍然常常發生部署失敗的狀況。Docker鏡像的設計,使得Docker得以打破過去「程序即應用」的觀念。透過鏡像(images)將作業系統核心除外,運作應用程式所需要的系統環境,由下而上打包,達到應用程式跨平臺間的無縫接軌運作。
1.2:Docker理念
Docker是基於Go語言實現的雲開源項目。Docker的主要目標是“Build,Ship and Run Any App,Anywhere”,也就是通過對應用組件的封裝、分發、部署、運行等生命週期的管理,使用戶的APP(可以是一個WEB應用或數據庫應用等等)及其運行環境能夠做到“一次封裝,到處運行”。
Linux 容器技術的出現就解決了這樣一個問題,而 Docker 就是在它的基礎上發展過來的。將應用運行在 Docker 容器上面,而 Docker 容器在任何操作系統上都是一致的,這就實現了跨平臺、跨服務器。只需要一次配置好環境,換到別的機子上就可以一鍵部署好,大大簡化了操作。
Docker解決了運行環境和配置問題軟件容器,方便做持續集成並有助於整體發佈的容器虛擬化技術。
2:Docker能幹什麼
2.1:之前的虛擬機技術
虛擬機(virtual machine)就是帶環境安裝的一種解決方案。
它可以在一種操作系統裏面運行另一種操作系統,比如在Windows 系統裏面運行Linux 系統。應用程序對此毫無感知,因爲虛擬機看上去跟真實系統一模一樣,而對於底層系統來說,虛擬機就是一個普通文件,不需要了就刪掉,對其他部分毫無影響。這類虛擬機完美的運行了另一套系統,能夠使應用程序,操作系統和硬件三者之間的邏輯不變。
虛擬機的缺點:資源佔用多,冗餘步驟多,啓動慢。
2.2:容器虛擬化技術
由於前面虛擬機存在這些缺點,Linux 發展出了另一種虛擬化技術:Linux 容器(Linux Containers,縮寫爲 LXC)。
Linux 容器不是模擬一個完整的操作系統,而是對進程進行隔離。有了容器,就可以將軟件運行所需的所有資源打包到一個隔離的容器中。容器與虛擬機不同,不需要捆綁一整套操作系統,只需要軟件工作所需的庫資源和設置。系統因此而變得高效輕量並保證部署在任何環境中的軟件都能始終如一地運行。
比較了 Docker 和傳統虛擬化方式的不同之處:
傳統虛擬機技術是虛擬出一套硬件後,在其上運行一個完整操作系統,在該系統上再運行所需應用進程;
而容器內的應用進程直接運行於宿主的內核,容器內沒有自己的內核,而且也沒有進行硬件虛擬。因此容器要比傳統虛擬機更爲輕便。
每個容器之間互相隔離,每個容器有自己的文件系統 ,容器之間進程不會相互影響,能區分計算資源。
2.3:開發/運維(一次構建、隨處運行)
2.3.1:更快速的應用交付和部署
傳統的應用開發完成後,需要提供一堆安裝程序和配置說明文檔,安裝部署後需根據配置文檔進行繁雜的配置才能正常運行。Docker化之後只需要交付少量容器鏡像文件,在正式生產環境加載鏡像並運行即可,應用安裝配置在鏡像裏已經內置好,大大節省部署配置和測試驗證時間。
2.3.2:更便捷的升級和擴縮容
隨着微服務架構和Docker的發展,大量的應用會通過微服務方式架構,應用的開發構建將變成搭樂高積木一樣,每個Docker容器將變成一塊“積木”,應用的升級將變得非常容易。當現有的容器不足以支撐業務處理時,可通過鏡像運行新的容器進行快速擴容,使應用系統的擴容從原先的天級變成分鐘級甚至秒級。
2.3.3:更簡單的系統運維
應用容器化運行後,生產環境運行的應用可與開發、測試環境的應用高度一致,容器會將應用程序相關的環境和狀態完全封裝起來,不會因爲底層基礎架構和操作系統的不一致性給應用帶來影響,產生新的BUG。當出現程序異常時,也可以通過測試環境的相同容器進行快速定位和修復。
3:Docker網站
3.1:Docker官網
http://www.docker.com
3.2:docker中文網站
https://www.docker-cn.com/
3.3:Docker Hub倉庫官網
Dhttps://hub.docker.com/
二:Docker安裝
1:Docker的基本組成
1.1:鏡像(image)
Docker 鏡像(Image)就是一個只讀的模板。鏡像可以用來創建 Docker 容器,一個鏡像可以創建很多容器。
1.2:容器(container)
Docker 利用容器(Container)獨立運行的一個或一組應用。容器是用鏡像創建的運行實例。
它可以被啓動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。
可以把容器看做是一個簡易版的 Linux 環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。
容器的定義和鏡像幾乎一模一樣,也是一堆層的統一視角,唯一區別在於容器的最上面那一層是可讀可寫的。
1.3:倉庫(repository)
倉庫(Repository)是集中存放鏡像文件的場所。
倉庫(Repository)和倉庫註冊服務器(Registry)是有區別的。倉庫註冊服務器上往往存放着多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標籤(tag)。
倉庫分爲公開倉庫(Public)和私有倉庫(Private)兩種形式。
最大的公開倉庫是Docker Hub(https://hub.docker.com/),存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括阿里雲 、網易雲 等
1.4:小總結
需要正確的理解倉儲/鏡像/容器這幾個概念:
Docker 本身是一個容器運行載體或稱之爲管理引擎。我們把應用程序和配置依賴打包好形成一個可交付的運行環境,這個打包好的運行環境就似乎 image鏡像文件。只有通過這個鏡像文件才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根據 image 文件生成容器的實例。同一個 image 文件,可以生成多個同時運行的容器實例。
image 文件生成的容器實例,本身也是一個文件,稱爲鏡像文件。
一個容器運行一種服務,當我們需要的時候,就可以通過docker客戶端創建一個對應的運行實例,也就是我們的容器
至於倉儲,就是放了一堆鏡像的地方,我們可以把鏡像發佈到倉儲中,需要的時候從倉儲中拉下來就可以了。
2:安裝步驟
2.1:Centos 6.8
yum install -y epel-release
yum install -y docker-io
安裝後的配置文件:/etc/sysconfig/docker
啓動Docker後臺服務:service docker start
docker version驗證
2.2:CentOS 7
2.2.1:官網安裝步驟
中文:https://docs.docker-cn.com/engine/installation/linux/docker-ce/centos/#prerequisites
英文:https://docs.docker.com/install/linux/docker-ce/centos/
2.2.2:確認CentOS版本
cat /etc/redhat-release
2.2.3:安裝gcc
yum -y install gcc
yum -y install gcc-c++
2.2.4:卸載舊版本
yum -y remove docker docker-common docker-selinux docker-engine
2.2.5:安裝需要的軟件包
yum install -y yum-utils device-mapper-persistent-data lvm2
2.2.6:設置stable鏡像倉庫
大坑:yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
推薦:yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.2.7:更新yum軟件包索引
yum makecache fast
2.2.8:安裝docker-ce
yum -y install docker-ce
2.2.9:啓動docker
systemctl start docker
2.2.10:測試
docker version
docker run hello-world
2.2.11:配置鏡像加速
mkdir -p /etc/docker
vim /etc/docker/daemon.json
#網易雲
{"registry-mirrors": ["http://hub-mirror.c.163.com"] }
#阿里雲
{
"registry-mirrors": ["https://{自已的編碼}.mirror.aliyuncs.com"]
}
systemctl daemon-reload
systemctl restart docker
2.2.12:卸載
systemctl stop docker
yum -y remove docker-ce
rm -rf /var/lib/docker
3:永遠的hello-world
3.1:阿里雲鏡像加速
3.1.1:是什麼
https://dev.aliyun.com/search.html
3.1.2:註冊一個阿里雲賬號
3.1.3:獲得加速器地址連接
3.1.4:配置本機Docker運行鏡像加速器
鑑於國內網絡問題,後續拉取 Docker 鏡像十分緩慢,我們可以需要配置加速器來解決,
我使用的是阿里雲的本人自己賬號的鏡像地址(需要自己註冊有一個屬於你自己的): https://xxxx.mirror.aliyuncs.com
vim /etc/sysconfig/docker
將獲得的自己賬戶下的阿里雲加速地址配置進
other_args="--registry-mirror=https://你自己的賬號加速信息.mirror.aliyuncs.com"
3.1.5:重新啓動Docker後臺服務
service docker restart
3.2:啓動Docker後臺容器
docker run hello-world
先檢查本地有沒有鏡像,沒有去遠程倉庫拉取,之後新建容器並運行
4:底層原理
4.1:Docker是怎麼工作的
Docker是一個Client-Server結構的系統,Docker守護進程運行在主機上, 然後通過Socket連接從客戶端訪問,守護進程從客戶端接受命令並管理運行在主機上的容器Docker是一個Client-Server結構的系統,Docker守護進程運行在主機上, 然後通過Socket連接從客戶端訪問,守護進程從客戶端接受命令並管理運行在主機上的容器。 容器,是一個運行時環境,就是我們前面說到的集裝箱。 容器,是一個運行時環境,就是我們前面說到的集裝箱。
4.2:爲什麼Docker比較比VM快
docker有着比虛擬機更少的抽象層。由亍docker不需要Hypervisor實現硬件資源虛擬化,運行在docker容器上的程序直接使用的都是實際物理機的硬件資源。因此在CPU、內存利用率上docker將會在效率上有明顯優勢。
docker利用的是宿主機的內核,而不需要Guest OS。因此,當新建一個容器時,docker不需要和虛擬機一樣重新加載一個操作系統內核。仍而避免引尋、加載操作系統內核返個比較費時費資源的過程,當新建一個虛擬機時,虛擬機軟件需要加載Guest OS,返個新建過程是分鐘級別的。而docker由於直接利用宿主機的操作系統,則省略了返個過程,因此新建一個docker容器只需要幾秒鐘。
三:Docker常用命令
1:幫助命令
docker version
docker info
docker --help
2:鏡像命令
2.1:列出本地的鏡像
docker images
[options]
-a :列出本地所有的鏡像(含中間映像層)
-q :只顯示鏡像ID
--digests :顯示鏡像的摘要信息
--no-trunc :顯示完整的鏡像信息
2.2:搜索鏡像
2.2.1:網站
https://hub.docker.com
2.2.2:命令
docker search [OPTIONS] 鏡像名字
[options]
--no-trunc : 顯示完整的鏡像描述
-s : 列出收藏數不小於指定值的鏡像
--automated : 只列出 automated build類型的鏡像
2.3:下載鏡像
docker pull 鏡像名字[:TAG]
2.4:刪除鏡像
刪除單個:docker rmi -f 鏡像ID
刪除多個 docker rmi -f 鏡像名1:TAG 鏡像名2:TAG
刪除全部:docker rmi -f $(docker images -qa)
3:容器命令
3.1:新建並啓動容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS說明(常用):有些是一個減號,有些是兩個減號
--name="容器新名字": 爲容器指定一個名稱;
-d: 後臺運行容器,並返回容器ID,也即啓動守護式容器;
-i:以交互模式運行容器,通常與 -t 同時使用;
-t:爲容器重新分配一個僞輸入終端,通常與 -i 同時使用;
-P: 隨機端口映射;
-p: 指定端口映射,有以下四種格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
3.2:列出所有正在運行的容器
docker ps [OPTIONS]
OPTIONS說明(常用):
-a :列出當前所有正在運行的容器+歷史上運行過的
-l :顯示最近創建的容器。
-n:顯示最近n個創建的容器。
-q :靜默模式,只顯示容器編號。
--no-trunc :不截斷輸出。
3.3:退出容器
exit:容器停止退出
ctrl+P+P:容器不停止退出
3.4:啓動容器
docker start 容器ID或者容器名
3.5:重啓容器
docker restart 容器ID或者容器名
3.6:停止容器
docker stop 容器ID或者容器名
3.7:強制停止容器
docker kill 容器ID或者容器名
3.8:刪除已停止的容器
docker rm 容器ID
一次性刪除多個容器:
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
3.9:啓動守護式進程
docker run -d 容器名
使用鏡像centos:latest以後臺模式啓動一個容器
docker run -d centos
然後docker ps -a進行查看, 會發現容器已經退出,很重要的要說明的一點::Docker容器後臺運行,就必須有一個前臺進程。容器運行的命令如果不是那些一直掛起的命令(比如運行top,tail),就是會自動退出的。這個是docker的機制問題,比如你的web容器,我們以nginx爲例,正常情況下,我們配置啓動服務只需要啓動響應的service即可。例如:service nginx start,但是,這樣做,nginx爲後臺進程模式運行,就導致docker前臺沒有運行的應用,這樣的容器後臺啓動後,會立即自殺因爲他覺得他沒事可做了。所以,最佳的解決方案是,將你要運行的程序以前臺進程的形式運行。
3.10:查看容器日誌
docker logs -f -t --tail 容器ID
-t 是加入時間戳
-f 跟隨最新的日誌打印
--tail 數字 顯示最後多少條
3.11:查看容器內運行的進程
docker top 容器ID
3.12:查看容器內部細節
docker inspect 容器ID
3.13:進入正在運行的容器並以命令行交互
docker exec -it 容器ID bashShell(/bin/bash) //exec 是在容器中打開新的終端,並且可以啓動新的進程
重新進入docker attach 容器ID //attach 直接進入容器啓動命令的終端,不會啓動新的進程
3.14:從容器內拷貝文件到主機上
docker cp 容器ID:容器內路徑 目的主機路徑
4:常用命令
attach Attach to a running container # 當前 shell 下 attach 連接指定運行鏡像
build Build an image from a Dockerfile # 通過 Dockerfile 定製鏡像
commit Create a new image from a container changes # 提交當前容器爲新的鏡像
cp Copy files/folders from the containers filesystem to the host path #從容器中拷貝指定文件或者目錄到宿主機中
create Create a new container # 創建一個新的容器,同 run,但不啓動容器
diff Inspect changes on a container's filesystem # 查看 docker 容器變化
events Get real time events from the server # 從 docker 服務獲取容器實時事件
exec Run a command in an existing container # 在已存在的容器上運行命令
export Stream the contents of a container as a tar archive # 導出容器的內容流作爲一個 tar 歸檔文件[對應 import ]
history Show the history of an image # 展示一個鏡像形成歷史
images List images # 列出系統當前鏡像
import Create a new filesystem image from the contents of a tarball # 從tar包中的內容創建一個新的文件系統映像[對應export]
info Display system-wide information # 顯示系統相關信息
inspect Return low-level information on a container # 查看容器詳細信息
kill Kill a running container # kill 指定 docker 容器
load Load an image from a tar archive # 從一個 tar 包中加載一個鏡像[對應 save]
login Register or Login to the docker registry server # 註冊或者登陸一個 docker 源服務器
logout Log out from a Docker registry server # 從當前 Docker registry 退出
logs Fetch the logs of a container # 輸出當前容器日誌信息
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT # 查看映射端口對應的容器內部源端口
pause Pause all processes within a container # 暫停容器
ps List containers # 列出容器列表
pull Pull an image or a repository from the docker registry server # 從docker鏡像源服務器拉取指定鏡像或者庫鏡像
push Push an image or a repository to the docker registry server # 推送指定鏡像或者庫鏡像至docker源服務器
restart Restart a running container # 重啓運行的容器
rm Remove one or more containers # 移除一個或者多個容器
rmi Remove one or more images # 移除一個或多個鏡像[無容器使用該鏡像纔可刪除,否則需刪除相關容器纔可繼續或 -f 強制刪除]
run Run a command in a new container # 創建一個新的容器並運行一個命令
save Save an image to a tar archive # 保存一個鏡像爲一個 tar 包[對應 load]
search Search for an image on the Docker Hub # 在 docker hub 中搜索鏡像
start Start a stopped containers # 啓動容器
stop Stop a running containers # 停止容器
tag Tag an image into a repository # 給源中鏡像打標籤
top Lookup the running processes of a container # 查看容器中運行的進程信息
unpause Unpause a paused container # 取消暫停容器
version Show the docker version information # 查看 docker 版本號
wait Block until a container stops, then print its exit code # 截取容器停止時的退出狀態值
四:Docker鏡像
1:什麼是Docker鏡像
1.1:UnionFS(聯合文件系統)
UnionFS(聯合文件系統):Union文件系統(UnionFS)是一種分層、輕量級並且高性能的文件系統,它支持對文件系統的修改作爲一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下(unite several directories into a single virtual filesystem)。Union 文件系統是 Docker 鏡像的基礎。鏡像可以通過分層來進行繼承,基於基礎鏡像(沒有父鏡像),可以製作各種具體的應用鏡像。
特性:一次同時加載多個文件系統,但從外面看起來,只能看到一個文件系統,聯合加載會把各層文件系統疊加起來,這樣最終的文件系統會包含所有底層的文件和目錄
1.2:Docker鏡像加載原理
docker的鏡像實際上由一層一層的文件系統組成,這種層級的文件系統UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引導加載kernel, Linux剛啓動時會加載bootfs文件系統,在Docker鏡像的最底層是bootfs。這一層與我們典型的Linux/Unix系統是一樣的,包含boot加載器和內核。當boot加載完成之後整個內核就都在內存中了,此時內存的使用權已由bootfs轉交給內核,此時系統也會卸載bootfs。
rootfs (root file system) ,在bootfs之上rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系統中的 /dev, /proc, /bin, /etc 等標準目錄和文件。rootfs就是各種不同的操作系統發行版,比如Ubuntu,Centos等等。包含的就是典型 Linux 系統中的 /dev, /proc, /bin, /etc 等標準目錄和文件。rootfs就是各種不同的操作系統發行版,比如Ubuntu,Centos等等。
對於一個精簡的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序庫就可以了,因爲底層直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可見對於不同的linux發行版, bootfs基本是一致的, rootfs會有差別, 因此不同的發行版可以公用bootfs。
1.3:分層的鏡像
以我們的pull爲例,在下載的過程中我們可以看到docker的鏡像好像是在一層一層的在下載
1.4:分層結構的好處
最大的一個好處就是共享資源,比如:有多個鏡像都從相同的 base 鏡像構建而來,那麼宿主機只需在磁盤上保存一份base鏡像,同時內存中也只需加載一份 base 鏡像,就可以爲所有容器服務了。而且鏡像的每一層都可以被共享。
2:Docker鏡像的特點
Docker鏡像都是隻讀的,當容器啓動時,一個新的可寫層被加載到鏡像的頂部。這一層通常被稱作“容器層”,“容器層”之下的都叫“鏡像層”。
3:Docker鏡像的commit
docker commit 提交容器副本使之成爲一個新的鏡像
docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要創建的目標鏡像名:[標籤名]
案例演示:
(1):從Hub上下載tomcat鏡像到本地併成功運行
docker run -it -p 8080:8080 tomcat
-p 主機端口:docker容器端口
-P 隨機分配端口
-i:交互
-t:終端
(2):故意刪除上一步鏡像生產tomcat容器的文檔
(3):以它爲模板commit一個沒有doc的tomcat新鏡像hhxy/tomcat02
(4):啓動新鏡像和原來的對比
五:Docker容器數據卷
1:什麼是容器數據卷
有點類似我們Redis裏面的rdb和aof文件
2:容器數據卷能幹啥
容器的持久化,容器間繼承+共享數據
3:容器內添加數據卷
3.1:直接命令添加
普通命令:docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 鏡像名
只讀命令: docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 鏡像名
3.2:DockerFile添加
3.2.1:在Dockerfile中使用VOLUME指令來給鏡像添加一個或多個數據卷
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
說明:
出於可移植和分享的考慮,用-v 主機目錄:容器目錄這種方法不能夠直接在Dockerfile中實現。
由於宿主機目錄是依賴於特定宿主機的,並不能夠保證在所有的宿主機上都存在這樣的特定目錄。
3.2.2:獲得一個新鏡像
docker build -f /mydocker/Dockerfile -t hhxy/centos
3.2.3:運行後查看數據卷對應的主機目錄地址
docker inspect 容器名/容器id
4:數據卷容器
4.1:是什麼
命名的容器掛載數據卷,其它容器通過掛載這個(父容器)實現數據共享,掛載數據卷的容器,稱之爲數據卷容器
4.2:案例
根據上一步生成的鏡像先啓動一個容器dc01
docker run -it --name dc01 hhxy/centos
啓動另一個容器dc02繼承於dc01,他們數據卷內容會互相同步
docker run -it --name dc02 --volumes-from dc01 hhxy/centos
六:DockerFile解析
1:DockerFile是什麼
Dockerfile是用來構建Docker鏡像的構建文件,是由一系列命令和參數構成的腳本。構建三步驟:編寫Dockerfile文件,docker build,docker run。
2:DockerFile構建過程解析
2.1:DockerFile基礎知識
(1):每條保留字指令都必須爲大寫字母且後面要跟隨至少一個參數
(2):指令按照從上到下,順序執行
(3):#表示註釋
(4):每條指令都會創建一個新的鏡像層,並對鏡像進行提交
2.2:Docker執行DockerFile的大致流程
(1):docker從基礎鏡像運行一個容器
(2):執行一條指令並對容器作出修改
(3):執行類似docker commit的操作提交一個新的鏡像層
(4):docker再基於剛提交的鏡像運行一個新容器
(5):執行dockerfile中的下一條指令直到所有指令都執行完成
2.3:小總結
從應用軟件的角度來看,DockerFile、Docker鏡像與Docker容器分別代表軟件的三個不同階段,DockerFile是軟件的原材料,Docker鏡像是軟件的交付品,Docker容器則可以認爲是軟件的運行態。DockerFile面向開發,Docker鏡像成爲交付標準,Docker容器則涉及部署與運維,三者缺一不可,合力充當Docker體系的基石。
DockerFile:需要定義一個DockerFile,DockerFile定義了進程需要的一切東西。DockerFile涉及的內容包括執行代碼或者是文件、環境變量、依賴包、運行時環境、動態鏈接庫、操作系統的發行版、服務進程和內核進程(當應用進程需要和系統服務和內核進程打交道,這時需要考慮如何設計namespace的權限控制)等等;
Docker鏡像:在用Dockerfile定義一個文件之後,docker build時會產生一個Docker鏡像,當運行 Docker鏡像時,會真正開始提供服務;
Docker容器:容器是直接提供服務的。
3:DockerFile體系結構(保留字指令)
FROM:基礎鏡像,當前新鏡像是基於哪個鏡像的
MAINTAINER:鏡像維護者的姓名和郵箱地址
RUN:容器構建時需要運行的命令
EXPOSE:當前容器對外暴露出的端口
WORKDIR:指定在創建容器後,終端默認登陸的進來工作目錄,一個落腳點
ENV:用來在構建鏡像過程中設置環境變量
ADD:將宿主機目錄下的文件拷貝進鏡像且ADD命令會自動處理URL和解壓tar壓縮包
COPY:類似ADD,拷貝文件和目錄到鏡像中。將從構建上下文目錄中 <源路徑> 的文件/目錄複製到新的一層的鏡像內的 <目標路徑> 位置
VOLUME:容器數據卷,用於數據保存和持久化工作
CMD:指定一個容器啓動時要運行的命令,Dockerfile 中可以有多個 CMD 指令,但只有最後一個生效,CMD 會被 docker run 之後的參數替換
ENTRYPOINT:指定一個容器啓動時要運行的命令,ENTRYPOINT 的目的和 CMD 一樣,都是在指定容器啓動程序及參數
ONBUILD:當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子繼承後父鏡像的onbuild被觸發
4:Base鏡像(scratch)
Docker Hub 中 99% 的鏡像都是通過在 base 鏡像中安裝和配置需要的軟件構建出來的
5:自定義鏡像
5.1:編寫DockerFile--Dockerfile
FROM centos
MAINTAINER lwk
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
5.2:構建
docker build -t Dockerfile 新鏡像名字:TAG
5.3:運行
docker run -it 新鏡像名字:TAG
5.4:列出鏡像的變更歷史
docker history 鏡像名