文章目錄
- Docker技術簡介
- 概述
- 版本說明
- Docker參考手冊
- Docker 應用分析
- Docker安裝
- 準備作業
- 開啟虛擬機系統
- 離線安裝docker
- 在線安裝Docker
- Docker入門實踐
- 基本操作
- 核心物件分析
- 鏡像
- 容器
- 資料卷
- Docker鏡像操作實踐
- 下載
- 運行鏡像
- 洗掉鏡像檔案
- Docker容器操作實踐
- 啟動分析
- 查看容器資訊
- 停止或重啟容器
- 進入指定容器
- 退出容器
- 洗掉容器
- Docker資料管理實踐
- 概述
- 資料卷
- 資料卷操作
- 掛載主機目錄(常用)
- Dockerfile檔案應用實踐
- 概述
- 準備作業
- Dockerfile檔案
- 運行鏡像檔案
- 鏡像匯出匯入操作
- 制作Sentinel鏡像(練習)
- 總結(Summary)
- 重難點分析
- FAQ分析
- Bug分析
Docker技術簡介
概述
Docker是一個虛擬化平臺( 官網https://www.docker.com/),誕生于 2013 年初,基于 Google 公司的 Go 語言進行實作,可以通過虛擬化方式,為應用提供可運行的容器,基于這種方式,可更快地打包、測驗以及部署應用程式,

現階段,很多應用軟體的安裝都在向基于docker方式的安裝進行實作,例如mysql,那么為什么不直接在作業系統中安裝一個mysql,而是用容器呢?因為,安裝MySql程序并不簡單,要配置安裝源,安裝依賴包,對mysql進行配置…如果要在多臺主機上安裝,每臺主機都要進行這些繁瑣的操作,萬一服務器掛了,這一系列操作還要再重來一遍,但有了docker,一個安裝配置好的mysql容器,可以直接拿到另一臺主機上啟動,而不必重新安裝mysql,另外,docker還有一重要的用處,就是可以保證開發,測驗和生產環境的一致.
版本說明
Docker分成了兩個版本:Docker EE (企業版)和Docker CE(社區版本),其中,Docker EE由公司支持,可在經過認證的作業系統和云提供商中使用,Docker CE是免費的Docker產品的新名稱,Docker CE包含了完整的Docker平臺,非常適合開發人員和運維團隊構建容器APP,
Docker參考手冊
docker中文免費手冊 [Docker — 從入門到實踐]
https://vuepress.mirror.docker-practice.com
Docker 應用分析
參考docker 官網(https://docs.docker.com/get-started/overview/),了解其docker運行機制,例如:

其中:
- Docker Host是我們的docker宿主機(就是安裝了docker的作業系統)
- Registry是docker拉取鏡像的遠程倉庫,提供大量的鏡像供下載,下載完成之后保存在Images中
- Docker Daemon是docker的服務執行緒,處理Docker客戶端命令,
- Images 是Docker本地的鏡像倉庫,可以通過docker images查看鏡像檔案,
以docker pull 命令為例,了解docker執行程序:
1)客戶端將指令發送給docker daemon
2)docker daemon 先檢查本地images中有沒有相關的鏡像
3)如果本地沒有相關的鏡像,則向鏡像服務器請求,將遠程鏡像下載到本地
Docker安裝
準備作業
第一步:準備CentOS(用課前資料中的CentOS7964),本次以CentOS7為例進行安裝,
第二步:基于vmvare打開CentOS

第三步:克隆CentOS(選擇鏈接克隆-更省空間),命名為CentOS7964-docker






開啟虛擬機系統
第一步:啟動虛擬機,默認賬號密碼為root/root

第二步:打開終端,通過ifconfig指令檢查網路,
[root@centos7964 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.227.129 netmask 255.255.255.0 broadcast 192.168.227.255
inet6 fe80::20c:29ff:fee9:918a prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:e9:91:8a txqueuelen 1000 (Ethernet)
RX packets 287398 bytes 419668874 (400.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 127375 bytes 8442701 (8.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
....
第三步:通過MobaXterm工具鏈接虛擬機系統




離線安裝docker
第一步:下載docker離線包
https://download.docker.com/linux/static/stable/x86_64/docker-20.10.6.tgz
說明,也可以從https://download.docker.com/linux/static/stable/網址下載指定版本
第二步:下載離線安裝工具
https://github.com/Jrohy/docker-install/

說明,將下載好的這個工具解壓,
第三步:將下載好的資源放在一個目錄,例如:
在linux環境下,創建/root/setup/docker目錄,然后拷貝下載好的資源到此目錄(可通過MobaXterm工具直接上傳到linux目錄),例如
[root@centos7964 docker]# pwd
/root/setup/docker
[root@centos7964 docker]# ls -l
總用量 68132
-rw-r--r--. 1 root root 69637582 8月 4 13:04 docker-20.10.6.tgz
-rw-r--r--. 1 root root 114793 8月 4 13:04 docker.bash
-rwxr-xr-x. 1 root root 7546 8月 4 13:04 install.sh
[root@centos7964 docker]#
第四步:執行安裝操作
# 進入/root/setup/docker 檔案夾
cd docker-install
# 為 install.sh添加執行權限
chmod +x install.sh
# 安裝
./install.sh -f docker-20.10.6.tgz
第五:安裝成功以后,檢查安裝狀態
docker info
在線安裝Docker
第一步:卸載舊版
sudo yum remove docker-ce \
docker-ce-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
第二步:安裝一組工具
sudo yum install -y yum-utils
第三步:設定 yum 倉庫地址
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
第四步:更新 yum 快取
sudo yum makecache fast #yum 是包管理器
第五步:安裝新版 docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
Docker入門實踐
基本操作
第一步:啟動docker
sudo systemctl start docker
第二步:設定 docker 開機啟動
sudo systemctl enable docker
第三步:鏡像加速
由于國內網路問題,需要配置加速器來加速,修改組態檔 /etc/docker/daemon.json
下面命令直接生成檔案 daemon.json
cat <<EOF > /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com"
],
"max-concurrent-downloads": 10,
"log-driver": "json-file",
"log-level": "warn",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"data-root": "/var/lib/docker"
}
EOF
說明:在執行如上指令時,保證你的登錄用戶為root管理員用戶,
第四步:重新啟動服務,
重新加載docker配置
sudo systemctl daemon-reload
重啟docker服務
sudo systemctl restart docker
第五步:查看鏡像配置
docker info
第六步:下載hello-world 鏡像
sudo docker pull hello-world
第七步:檢查docker 鏡像
Docker images

第八步:運行docker鏡像
docker run hello-world

第九步:檢查已啟動的docker 服務 (正在運行的)
Docker ps
假如希望查看所有鏡像,包含沒有運行的鏡像容器,可以執行如下指令:
Docker ps –all #可以用 docker ps -a 縮寫形式
第十步:停止docker容器服務
docker stop 服務id
第十步:洗掉docker 容器
docker container rm 容器名或容器id
第十一步:洗掉docker鏡像
docker image rm hello-world
核心物件分析
鏡像
Docker 鏡像是一個特殊的檔案系統,除了提供容器運行時所需的程式、庫、資源、配置等檔案外,還包含了一些為運行時準備的一些配置引數(如匿名卷、環境變數、用戶等),鏡像不包含任何動態資料,其內容在構建之后也不會被改變,
鏡像只是一個虛擬的概念,其實際體現并非由一個檔案組成,而是由一組檔案系統組成,或者說,由多層檔案系統聯合組成,
容器
鏡像(Image)和容器(Container)的關系,就像是光碟和光驅,容器是鏡像運行時的載體,容器可以被創建、啟動、停止、洗掉、暫停等,
容器的本質是行程,但與直接在宿主機執行的行程不同,容器行程運行于屬于自己的獨立的 命名空間,因此容器可以擁有自己的 root 檔案系統、自己的網路配置、自己的行程空間,甚至自己的用戶 ID 空間,容器內的行程是運行在一個隔離的環境里,使用起來,就好像是在一個獨立于宿主的系統下操作一樣,這種特性使得容器封裝的應用比直接在宿主運行更加安全,
資料卷
鏡像使用的是分層存盤方式,容器也是如此,每一個容器運行時,是以鏡像為基礎層,在其上創建一個當前容器的存盤層(我們可以稱這個為容器運行時執行讀寫操作而準備的存盤層),容器存盤層的生存周期和容器一樣,容器消亡時,容器存盤層也隨之消亡,因此,任何保存于容器存盤層的資訊都會隨容器洗掉而丟失,
按照 Docker 最佳實踐的要求,容器不應該向其存盤層內寫入任何資料,容器存盤層要保持無狀態化,所有的檔案寫入操作,都應該使用 資料卷(Volume)、或者系結宿主目錄,在這些位置的讀寫會跳過容器存盤層,直接對宿主(或網路存盤)發生讀寫,其性能和穩定性更高,
資料卷的生存周期獨立于容器,容器消亡,資料卷不會消亡,因此,使用資料卷后,容器洗掉或者重新運行之后,資料卻不會丟失,
Docker鏡像操作實踐
下載
第一步:下載 CentOS 鏡像 (說明,假如是自己制作鏡像,都會先下載一個空的centos鏡像,官方鏡像倉庫地址為https://hub.docker.com/),假如后面我們要自己做鏡像,都需要這樣的一個空的系統鏡像檔案,
docker pull centos:7

第二步:查看centos7鏡像檔案
docker images
#或者
docker image ls
運行鏡像
通過docker啟動運行 centos7鏡像
docker run -it xxxx bash
xxxx - 鏡像名, 或 image id 的前幾位
-it 這是兩個引數,一個是 -i:互動式操作,一個是 -t 終端,我們這里打算進入 bash 執行一些命令并查看回傳結果,因此我們需要互動式終端,
bash 放在鏡像名后的是命令,這里我們希望有個互動式 Shell,因此用的是 bash,
洗掉鏡像檔案
假如鏡像不需要了可洗掉鏡像,例如:
洗掉鏡像id前綴為501的 鏡像,一般三位以上,足夠區分即可,
docker image rm 501
洗掉指定鏡像名的鏡像
docker image rm centos
Docker容器操作實踐
啟動分析
通過 docker run 來創建啟動容器(這個容器相當于一個獨立的集裝箱)
docker run -it centos:7 bash
Docker 在后臺運行的標準操作包括:
- 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
- 利用鏡像創建并啟動一個容器
- 分配一個檔案系統(簡版linux系統),并在只讀的鏡像層外面掛載一層可讀寫層
- 從宿主主機配置的網橋介面中橋接一個虛擬介面到容器中去
- 從地址池配置一個 ip 地址給容器
- 執行用戶指定的應用程式
后臺運行
docker run -dit centos:7
-d 后臺運行容器
容器是否會長久運行,是和 docker run 指定的命令有關,和 -d 引數無關,
查看容器資訊
查看后臺運行的容器輸出結果
docker container logs 802
查看docker中的容器
docker ps -a
其中,-a all, 全部
停止或重啟容器
停止運行的容器,代碼如下:
docker container stop 802
重新啟動容器,代碼如下:
docker container restart 802
進入指定容器
當需要進入容器進行操作時(容器運行著),可以使用 docker exec 命令,例如:
docker exec -it 802 bash #802為容器id
退出容器
假如從宿主機進入了啟動的容器,退出容器需要使用exit指令,例如:
exit
洗掉容器
假如容器不用了,可執行洗掉操作,例如:
docker container rm 802 #802為容器id
其中,如果洗掉運行中的容器,需要添加 -f 引數,
清理所有終止狀態容器,例如
docker container prune
Docker資料管理實踐
概述
在容器中管理資料主要有兩種方式:
- 掛載主機目錄 (Bind mounts)-最常用 (docker run –v 宿主機目錄:容器目錄)
- 資料卷(Volumes)
資料卷
資料卷是一個可供一個或多個容器使用的特殊目錄,可以在容器之間共享和重用,默認會一直存在,即使容器被洗掉,
資料卷操作
第一步:創建資料卷
docker volume create container-vol
第二步:查看所有資料卷
docker volume ls
查看指定 資料卷 的資訊
docker volume inspect container-vol
查詢的結果:
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/container-vol/_data",
"Name": "container-vol",
"Options": {},
"Scope": "local"
}
]
第三步:啟動掛載資料卷的容器
docker run -it --mount source=container-vol,target=/root centos:7 bash
或者采用如下簡寫方式
docker run -it -v container-vol:/root centos:7 bash
-v container-vol:/root 把資料卷 container-vol 掛載到容器的 /root 目錄
第四步:洗掉資料卷(如果資料卷被容器使用則無法洗掉)
docker volume rm container-vol
清理無主資料卷
docker volume prune
掛載主機目錄(常用)
docker run -it -v /usr/app:/opt/app centos:7 bash
其中:
1)/usr/app:為宿主機目錄
2)/opt/app: 為啟動容器的一個目錄
3)-v 用于指定掛載目錄,如果本地目錄(宿主機目錄)不存在, Docker 會自動為你按照掛載目錄進行目錄的創建,
例如:

查看掛載目錄資訊
docker inspect 91a #91a 為容器id
顯示結果:
...
"Mounts": [
{
"Type": "bind",
"Source": "/usr/app",
"Destination": "/opt/app",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
...
Dockerfile檔案應用實踐
概述
Dockerfile 是一個用來構建鏡像的文本檔案,文本內容包含了一條條構建鏡像所需的指令和說明,我們通常會基于此檔案創建docker鏡像,
準備作業
- centos:7鏡像 (所有的鏡像檔案創建時都需要有一個空的centos鏡像,就類似通過一個空的光碟或u盤創建一個系統啟動盤是一樣的)
- jdk壓縮包 jdk-8u51-linux-x64.tar.gz(可以從官網去下載:oracle.org),基于此壓縮包,制作jdk鏡像,
Dockerfile檔案
在創建新的鏡像時都需要有一個Dockerfile檔案(檔案名一定要注意大小寫),這個檔案要與你的資源放在一起(例如你下載的jdk),我們可以通過linux系統中的touch指令創建此檔案(touch Dockerfile)
現在,以centos7為基礎,構建oracle jdk8的鏡像,首先通過vim打開Dockerfile,這個檔案不存在會自動創建,然后進入編輯模式(按i字母),在編輯模式下可以拷貝如下陳述句(自己手動寫也可以,但確保寫的單詞正確,大小寫,空格),
第一步:撰寫FROM陳述句(關鍵字一定要大寫,例如FROM不能寫小寫)
FROM centos:7
第二步:通過ADD命令將宿主機中的壓縮包傳入鏡像容器中的指定目錄,并同時解壓縮
ADD jdk-8u51-linux-x64.tar.gz /usr/local/docker
第三步:設定環境變數(通過ENV關鍵字實作,目錄啟動容器中的目錄)
ENV JAVA_HOME=/usr/local/docker/jdk1.8.0_51 \
PATH=/usr/local/docker/jdk1.8.0_51/bin:$PATH
第四步:指定命令列操作(所有指令與后面內容要有空格)
CMD [‘bash’]
完整示例如下:(注意關鍵字與后面內容之間的空格,可以將如下完成示例拷貝Dockerfile檔案,但是一定要注意你的jdk名字是什么)
FROM centos:7
ADD jdk-8u51-linux-x64.tar.gz /usr/local/docker
ENV JAVA_HOME=/usr/local/docker/jdk1.8.0_51 \
PATH=/usr/local/docker/jdk1.8.0_51/bin:$PATH
CMD ['bash']
使用 Dockerfile 構建鏡像(在Dockerfile所在目錄執行docker指令)
docker build -t jdk:8 . #不要丟掉這里的點,-t表示鏡像標識(鏡像名),是tag單詞的縮寫.

注意末尾的點,表示構建程序中從當前目錄尋找檔案,jdk:8為我們創建的鏡像名,
運行鏡像檔案
docker run -it jdk:8 bash
進入容器以后,可以通過echo $PATH查看環境變數,并可以通過java –version查看JDK版本資訊,

FAQ:如何通過此鏡像運行一個web服務,例如sentinel等,
第一步:將sentinel拷貝宿主機指定目錄,例如/root/servers目錄(servers目錄不存在可以自己創建),

第二步:啟動鏡像容器,通過java執行運行web服務
基于jdk:8鏡像啟動運行sentinel服務(服務啟動后可在宿主機通過localhost:8180進行訪問)
docker run -d -p 8180:8080 --name sentinel \
-v /root/servers:/usr/sca \
jdk:8 java -jar /usr/sca/sentinel-dashboard-1.8.0.jar
例如

其中,埠映射,可參考下面的圖,例如:

第三步:打開瀏覽器,訪問sentinel服務.
訪問時你的ip地址應該為宿主機的ip地址,埠號為宿主機的埠號.例如

鏡像匯出匯入操作
鏡像匯出(linux系統中的鏡像檔案下載到本地-例如window),匯出后給他人使用
docker save jdk:8 | gzip > jdk8.tar.gz
鏡像匯入(要在jdk8.tar.gz檔案所在目錄下執行)
docker load < jdk8.tar.gz
制作Sentinel鏡像(練習)
第一步:定義Dockerfile檔案,同時將jdk,sentinel也要和這個檔案放在同一個目錄
FROM centos:7
ADD jdk-8u51-linux-x64.tar.gz /usr/local/
ADD sentinel-dashboard-1.8.0.jar /usr/local/
ENV JAVA_HOME=/usr/local/jdk1.8.0_51 \
PATH=/usr/local/jdk1.8.0_51/bin:$PATH
EXPOSE 8080
ENTRYPOINT ["java","-jar","/usr/local/sentinel-dashboard-1.8.0.jar"]
第二步:使用 Dockerfile 構建鏡像(在Dockerfile所在目錄執行docker指令)
docker build -t sentinel:8 . #不要丟掉這里的點
第三步:運行sentinel容器
docker run -d -p 8180:8080 sentinel:8
假如我們要做目錄的掛載,保存容器中日志,可參考如下方式:
docker run -d -p 8180:8080 --name sentinel \
-v /usr/local/docker/sentinel/logs:/root/logs/csp sentinel:8
第四步:查看sentinel容器
docker ps
假如看不到容器,可通過"docker container logs 容器id"方式查看容器狀態.
第五步:訪問sentinel服務
訪問時你的ip地址應該為宿主機的ip地址,埠號為宿主機的埠號.例如

總結(Summary)
重難點分析
- Docker 是什么?
- Docker 核心思想
- Docker 核心概念(容器、鏡像、資料卷)
- Docker 容器、鏡像、資料卷操作
- Docker 鏡像制作(Dockerfile檔案)
FAQ分析
- 什么是Docker鏡像?
- 如何理解Docker容器
- Docker資料卷的作用是什么?
- Docker 有哪些常用指令?

- Dockerfile的作用是什么?
- 如何制作鏡像?
- 如何保存和匯入本地鏡像.
- Sentinel鏡像如何制作?
Bug分析
…
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292157.html
標籤:其他
