2021-05-12 14:32:11
Docker容器超詳細講解
一、概述
1.1 基本概念:
Docker 是一個開源的應用容器引擎,基於 Go 語言 並遵從Apache2.0協定開源。Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後發佈到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面(類似 iPhone 的 app),更重要的是容器效能開銷極低。
1.2 優勢:
簡化程式:
Docker 讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的 Linux 機器上,便可以實現虛擬化。Docker改變了虛擬化的方式,使開發者可以直接將自己的成果放入Docker中進行管理。方便快捷已經是 Docker的最大優勢,過去需要用數天乃至數週的 任務,在Docker容器的處理下,只需要數秒就能完成。
節省開支:
一方面,雲端計算時代到來,使開發者不必為了追求效果而設定高額的硬體,Docker 改變了高效能必然高價格的思維定勢。Docker 與雲的結合,讓雲空間得到更充分的利用。不僅解決了硬體管理的問題,也改變了虛擬化的方式。
1.3 與傳統VM特性對比:
作為一種輕量級的虛擬化方式,Docker在執行應用上跟傳統的虛擬機器方式相比具有顯著優勢:
Docker容器很快,啟動和停止可以在秒級實現,這相比傳統的虛擬機器方式要快得多。
Docker容器對系統資源需求很少,一台主機上可以同時執行數千個Docker容器。
Docker通過類似Git的操作來方便使用者獲取、分發和更新應用映象,指令簡明,學習成本較低。
Docker通過Dockerfile組態檔來支援靈活的自動化建立和部署機制,提高工作效率。
Docker容器除了執行其中的應用之外,基本不消耗額外的系統資源,保證應用效能的同時,盡量減小系統開銷。
Docker利用Linux系統上的多種防護機制實現了嚴格可靠的隔離。從1.3版本開始,Docker引入了安全選項和映象簽名機制,極大地提高了使用Docker的安全性。
特性 | 容器 | 虛擬機器 |
啟動速度 | 秒級 | 分鐘級 |
硬碟使用 | 一般為MB | 一般為GB |
效能 | 接近原生 | 弱於原生 |
系統支援量 | 單機支援上千個容器 | 一般幾十個 |
隔離性 | 安全隔離 | 完全隔離 |
1.4 基礎架構
Docker 使用用戶端-伺服器 (C/S) 架構模式,使用遠端API來管理和建立Docker容器。
Docker 容器通過 Docker 映象來建立。
容器與映象的關係類似於物件導向程式設計中的物件與類。
Docker | 物件導向 |
---|---|
容器 | 物件 |
映象 | 類 |
1.5 Docker技術的基礎:
-
namespace,容器隔離的基礎,保證A容器看不到B容器. 6個名空間:User,Mnt,Network,UTS,IPC,Pid
-
cgroups,容器資源統計和隔離。主要用到的cgroups子系統:cpu,blkio,device,freezer,memory
-
unionfs,典型:aufs/overlayfs,分層映象實現的基礎
1.6 Docker元件:
-
docker Client用戶端————>向docker伺服器進程發起請求,如:建立、停止、銷毀容器等操作
-
docker Server伺服器進程—–>處理所有docker的請求,管理所有容器
-
docker Registry映象倉庫——>映象存放的中央倉庫,可看作是存放二進位制的scm
二、安裝部署
2.1 準備條件
目前,CentOS 僅發行版本中的核心支援 Docker。
Docker 執行在 CentOS 7 上,要求系統為64位元、系統核心版本為 3.10 以上。
Docker 執行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系統為64位元、系統核心版本2.6.32-431 或者更高版本。
2.2 安裝docker
systemctl start docker #啟動
systemctl enable docker #設定開機自啟動
2.3 基本命令
預設從國外拉去,速度很慢,可以使用daocloud設定加速
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://d6f11267.m.daocloud.io
指令碼是寫入
echo "{"registry-mirrors": ["http://d6f11267.m.daocloud.io"]}"> /etc/docker/daemon.json
systemctl restart docker #重新啟動失效
根據需求拉取映象:
docker pull docker.io/ansible/centos7-ansible
拉去search到的全部映象:
for i in `docker search centos|awk '!/NAME/{print $2}'`;do docker pull $i;done
docker images
2.4 命令整理:
容器操作:
docker create # 建立一個容器但是不啟動它
docker run # 建立並啟動一個容器
docker stop # 停止容器執行,傳送信號SIGTERM
docker start # 啟動一個停止狀態的容器
docker restart # 重新啟動一個容器
docker rm # 刪除一個容器
docker kill # 傳送信號給容器,預設SIGKILL
docker attach # 連線(進入)到一個正在執行的容器
docker wait # 阻塞一個容器,直到容器停止執行
獲取容器資訊:
docker ps # 顯示狀態為執行(Up)的容器
docker ps -a # 顯示所有容器,包括執行中(Up)的和退出的(Exited)
docker inspect # 深入容器內部獲取容器所有資訊
docker logs # 檢視容器的紀錄檔(stdout/stderr)
docker events # 得到docker伺服器的實時的事件
docker port # 顯示容器的埠對映
docker top # 顯示容器的進程資訊
docker diff # 顯示容器檔案系統的前後變化
匯出容器:
docker cp # 從容器裡向外拷貝檔案或目錄
docker export # 將容器整個檔案系統匯出為一個tar包,不帶layers、tag等資訊
執行:
docker exec # 在容器裡執行一個命令,可以執行bash進入互動式
映象操作:
docker images # 顯示本地所有的映象列表
docker import # 從一個tar包建立一個映象,往往和export結合使用
docker build # 使用Dockerfile建立映象(推薦)
docker commit # 從容器建立映象
docker rmi # 刪除一個映象
docker load # 從一個tar包建立一個映象,和save配合使用
docker save # 將一個映象儲存為一個tar包,帶layers和tag資訊
docker history # 顯示生成一個映象的歷史命令
docker tag # 為映象起一個別名
映象倉庫(registry)操作:
docker login # 登入到一個registry
docker search # 從registry倉庫搜尋映象
docker pull # 從倉庫下載映象到本地
docker push # 將一個映象push到registry倉庫中
2.5 簡單實踐操作
執行並進入容器操作:
docker run -i -t docker.io/1832990/centos6.5 /bin/bash
-t 表示在新容器內指定一個偽終端或終端;
-i表示允許我們對容器內的 (STDIN) 進行互動;
-d表示將容器在後台執行;
/bin/bash 。這將在容器內啟動 bash shell;
所以當容器(container)啟動之後,我們會獲取到一個命令提示字元:
在容器內我們安裝MySQL並設定開機自啟動,將修改後的映象提交:
docker ps -l 查詢容器ID
docker commit -m "功能" -a "使用者資訊" ID tag 提交修改後的映象
docker inspect ID 檢視詳細資訊
docker push ID 上傳docker映象
利用DockerFile建立映象
使用命令 docker build , 需要建立一個 Dockerfile 檔案,其中包含一組指令來告訴 Docker 如何構建映象。
mkdir DockerFile
cd DockerFile
cat > Dockerfile <<EOF
FROM 603dd3515fcc
MAINTAINER Docker xuel
RUN yum install mysql mysql-server -y
RUN mddir /etc/sysconfig/network
RUN /etc/init.d/mysqld start
EOF
docker build -t "centos6.8:mysqld" .
-t 制定repository 與tag
. 指定Dockerfile的路徑
注意一個映象不能超過 127 層
此外,還可以利用 ADD 命令複製本地檔案到映象;
用 EXPOSE 命令來向外部開放埠;
用 CMD 命令來描述容器啟動後執行的程式等。
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
2.6 Dockerfile詳解
Dockerfile的指令是忽略大小寫的,建議使用大寫,使用 # 作為註釋,每一行只支援一條指令,每條指令可以攜帶多個引數。
Dockerfile的指令根據作用可以分為兩種,構建指令和設定指令。
相關文章