首頁 > 軟體

Docker容器超詳細講解

2020-06-16 16:47:46

一、概述

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

yum install docker -y          #安裝
systemctl start docker        #啟動   
systemctl enable docker        #設定開機自啟動

2.3 基本命令

docker search centos  #搜尋映象

預設從國外拉去,速度很慢,可以使用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的指令根據作用可以分為兩種,構建指令和設定指令。


IT145.com E-mail:sddin#qq.com