Docker技術( 容器虛擬化技術 )

時間靜止不是簡史發表於2019-10-18

第一章 Docker介紹

誕生背景

一款產品從開發到上線,從作業系統,到執行環境,再到應用配置。
作為開發+運維之間的協作我們需要關心很多東西,這也是很多網際網路公司都不得不面對的問題,
特別是各種版本的迭代之後,不同版本環境的相容,對運維人員都是考驗 .
Docker之所以發展如此迅速,也是因為它對此給出了一個標準化的解決方案。

環境配置如此麻煩,換一臺機器,就要重來一次,費力費時。
很多人想到,能不能從根本上解決問題,軟體可以帶環境安裝?
也就是說,安裝的時候,把原始環境一模一樣地複製過來。
開發人員利用 Docker 可以消除協作編碼時“在我的機器上可正常工作”的問題。

開發需要清楚的告訴運維部署團隊,用的全部配置檔案+所有軟體環境。
不過,即便如此,仍然常常發生部署失敗的狀況。
Docker映象的設計,使得Docker得以打破過去"程式即應用" 的觀念。
透過映象(images)將作業系統核心除外,運作應用程式所需要的系統環境,
由下而上打包,達到應用程式跨平臺間的無縫接軌運作。

在這裡插入圖片描述

Docker 介紹

Docker的主要目標是“Build,Ship and Run Any App,Anywhere”,
也就是通過對應用元件的封裝、分發、部署、執行等生命週期的管理,
使使用者的APP(可以是一個WEB應用或資料庫應用等等)及其執行環境能夠做到“一次封裝,到處執行”。

Linux 容器技術的出現就解決了這樣一個問題,而 Docker 就是在它的基礎上發展過來的。
將應用執行在 Docker 容器上面,而 Docker 容器在任何作業系統上都是一致的,
這就實現了跨平臺、跨伺服器只需要一次配置好環境,換到別的機子上就可以一鍵部署好, 大大簡化了操作

總結:
Docker是解決執行環境和配置問題的軟體容器 , 方便做持續集中並有助於整體釋出的容器虛擬化技術

在這裡插入圖片描述

虛擬機器技術與容器虛擬化技術

虛擬機器技術

虛擬機器(virtual machine)就是帶環境安裝的一種解決方案。
可以在一種作業系統裡面執行另一種作業系統,比如在Windows 系統裡面執行Linux 系統。
應用程式對此毫無感知,因為虛擬機器看上去跟真實系統一模一樣
缺點 :1 資源佔用多 2 冗餘步驟多 3 啟動慢

在這裡插入圖片描述

容器虛擬化技術

Linux 容器(Linux Containers,縮寫為 LXC)。
Linux 容器不是模擬一個完整的作業系統,而是對程式進行隔離。
有了容器,就可以將軟體執行所需的所有資源打包到一個隔離的容器中。
容器與虛擬機器不同,不需要捆綁一整套作業系統,只需要軟體工作所需的庫資源和設定
系統因此而變得高效輕量並保證部署在任何環境中的軟體都能始終如一地執行。

在這裡插入圖片描述
二者區別

  1. 傳統虛擬機器技術是虛擬出一套硬體後,在其上執行一個完整作業系統,在該系統上再執行所需應用程式;
  2. 而容器內的應用程式直接執行於宿主機( 即:所在主機,下面統稱宿主機 ) 的核心,容器內沒有自己的核心,而且也沒有進行硬體虛擬。因此容器要比傳統虛擬機器更為輕便。
  3. 每個容器之間互相隔離,每個容器有自己的檔案系統 ,容器之間程式不會相互影響,能區分計算資源。

官方網址

官方網址 : https://www.docker.com
Docker社群官方:https://hub.docker.com/

第二章 Docker安裝

Docker支援以下的CentOS版本:CentOS 7 (64-bit) ,CentOS 6.5 (64-bit) 或更高的版本

前提條件

目前,CentOS 僅發行版本中的核心支援 Docker。
Docker 執行在 CentOS 7 上,要求系統為64位、系統核心版本為 3.10 以上。
Docker 執行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系統為64位、系統核心版本為 2.6.32-431 或者更高版本。

# 檢視核心版本
uname -r 

安裝Docker

Docker安裝教程(CentOS 7)本人安裝成功

Docker安裝教程(CentOS 6)

Docker管理命令

# 重新載入後臺啟動程式
systemctl daemon-reload

# 啟動docker容器 ,每次關閉虛擬機器/運伺服器時需要啟動( 重要!!! )
sudo service docker start

# 檢視Docker容器狀態
sudo service docker status (should see active (running))

# 執行hello-world映象/測試Docker是否可以使用
sudo docker run hello-world

Docker底層原理

Docker結構圖

在這裡插入圖片描述
在這裡插入圖片描述

工作原理

Docker是一個Client-Server結構的系統,Docker守護程式執行在主機上,
然後通過Socket連線從客戶端訪問,守護程式從客戶端接受命令並管理執行在主機上的容器。
容器,是一個執行時環境,就是我們前面說到的集裝箱。

在這裡插入圖片描述

Docker為什麼比VM快

(1) docker有著比虛擬機器更少的抽象層。
由亍docker不需要Hypervisor實現硬體資源虛擬化,
執行在docker容器上的程式直接使用的都是實際物理機的硬體資源。
因此在CPU、記憶體利用率上docker將會在效率上有明顯優勢。
在這裡插入圖片描述

(2) docker利用的是宿主機的核心,而不需要Guest OS。
因此,當新建一個容器時,docker不需要和虛擬機器一樣重新載入一個作業系統核心。
因而避免引尋、載入作業系統核心返個比較費時費資源的過程,
當新建一個虛擬機器時,虛擬機器軟體需要載入Guest OS,返個新建過程是分鐘級別的。
而docker由於直接利用宿主機的作業系統,則省略了返個過程,因此新建一個docker容器只需要幾秒鐘。
通過下圖著重瞭解二者的比較( 圖很重要!!!)
在這裡插入圖片描述

第三章 Docker常用命令

幫助命令

# 檢視docker版本資訊
docker version

# 檢視docker所有安裝資訊
docker info

# 檢視docker幫助 ( 最為重要,學會利用幫助文件來學習 ,這是成為高手的必經之路!!! )
docker --help

映象命令

# 1.列出本地映象(圖1)
docker images

# option說明
 -a :列出所有映象
 -q:只列出映象id
 -digests :顯示映象的摘要資訊
--no-trunc :顯示相信資訊


# 2.搜尋某個映象名字 (會在docker社群搜尋相關的映象, 而我們配置的阿里源只是幫我們同步了docker社群的映象,圖2)
docker search 

# option說明
	- s顯示收藏數不小於指定值的映象
    --no-trunc :顯示相信資訊
    - automated :只列出automated型別的映象

# 3. 下載映象(圖3)
docker pull 映象的名字:[TAG](不寫預設為 lasted)

# 4. 刪除映象
docker rmi  -f 映象名/映象id
docker rmi -f $(docker images -qa )
   

各個選項說明:
REPOSITORY:表示映象的倉庫源
TAG:映象的標籤
IMAGE ID:映象ID
CREATED:映象建立時間
SIZE:映象大小
同一倉庫源可以有多個 TAG,代表這個倉庫源的不同個版本,我們使用 REPOSITORY:TAG 來定義不同的映象。
如果你不指定一個映象的版本標籤,例如你只使用 ubuntu,docker 將預設使用 ubuntu:latest 映象

圖1
在這裡插入圖片描述
圖2
在這裡插入圖片描述

圖3
在這裡插入圖片描述

容器命令

基本命令

# 1. 新建並啟動容器
docker run [OPTIONS] IMAGE [COMMOND] [ARGS...]

# OPTIONS 說明
	--name="容器新名字": 為容器指定一個名稱;
	-d: 後臺執行容器,並返回容器ID,也即啟動守護式容器;
	-i:以互動模式執行容器,通常與 -t 同時使用;
	-t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
	-P: 隨機埠對映;
	-p: 指定埠對映,有以下四種格式
	      ip:hostPort:containerPort
	      ip::containerPort
	      hostPort:containerPort
	      containerPort
	      
# eg: 使用映象centos:latest以互動模式啟動一個容器,在容器內執行/bin/bash命令。
docker run -it centos /bin/bash 

 
# 2. 查詢當前正在執行的容器(類比虛擬中的檢視程式)
docker ps [OPTIONS] 

# OPTIONS說明(常用):
	-a :列出當前所有正在執行的容器+歷史上執行過的
	-l :顯示最近建立的容器。
	-n:顯示最近n個建立的容器。
	-q :靜默模式,只顯示容器編號。
	--no-trunc :不截斷輸出。


# 3. 退出容器
exit  容器停止後退出
ctrl+p+q  容器不停止退出

# 4 .啟動容器
docker start 容器ID/容器名

# 5. 重啟容器 
docker restart

# 6. 停止容器
docker stop 容器ID/容器名

# 7. 強制停止容器
docker kill 容器ID/容器名

# 8. 刪除已經停止的容器(如果沒有停止,刪除後悔停止)
docker rm 容器ID
刪除多個容器(特別是第二種 ,先查詢所有執行的程式, 然後通過管道傳到後面的刪除操作中)
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm

重要命令

# 1. 啟動守護式容器(後臺執行)
docker -d 容器名

# 使用映象centos:latest以後臺模式啟動一個容器
docker run -d centos

問題:然後docker ps -a 進行檢視, 會發現容器已經退出
很重要的要說明的一點: Docker容器後臺執行,就必須有一個前臺程式.
容器執行的命令如果不是那些一直掛起的命令(比如執行top,tail),就是會自動退出的。

這個是docker的機制問題,比如你的web容器,我們以nginx為例,正常情況下,我們配置啟動服務只需要啟動響應的service即可。例如service nginx start
但是,這樣做,nginx為後臺程式模式執行,就導致docker前臺沒有執行的應用,
這樣的容器後臺啟動後,會立即自殺因為他覺得他沒事可做了.
所以,最佳的解決方案是,將你要執行的程式以前臺程式的形式執行
# 2. 檢視容器日誌
docker logs -f -t --tail 容器ID

eg :(圖1)
docker run -d centos /bin/sh -c "while true;do echo hello testLogs;sleep 2;done"
docker logs -tf --tail 10 02c81778b0e0

-t 是加入時間戳
-f 跟隨最新的日誌列印
--tail 數字 顯示最後多少條


# 3. 檢視容器內執行的程式(圖2)
docker top 容器ID

# 4. 檢視容器內部細節(圖3)
docker inspect 容器ID

# 5.進入正在執行的容器並進行互動(圖4)
docker exec -it 容器ID bashShell

# 6. 重新進入容器(圖5)
docker attach 容器ID bashShell(不寫的話預設 /bin/bash下)

# 比較5與6的區別
attach 直接進入容器啟動命令終端, 不會啟動新的執行緒
exec 是在容器中開啟新的終端, 並且可以啟動新的執行緒

圖1
在這裡插入圖片描述

圖2
在這裡插入圖片描述
圖3
在這裡插入圖片描述
圖4
在這裡插入圖片描述
圖5
在這裡插入圖片描述

Docker常用命令圖解

在這裡插入圖片描述

第四章 Docker映象

映象 / UnionFS(聯合檔案系統)

Union檔案系統(UnionFS)是一種分層、輕量級並且高效能的檔案系統
它支援對檔案系統的修改作為一次提交來一層層的疊加,
同時可以將不同目錄掛載到同一個虛擬檔案系統下。Union 檔案系統是 Docker 映象的基礎。
映象可以通過分層來進行繼承. 基於基礎映象(沒有父映象),可以製作各種具體的應用映象。

特性
一次同時載入多個檔案系統,但從外面看起來,只能看到一個檔案系統,
聯合載入會把各層檔案系統疊加起來,這樣最終的檔案系統會包含所有底層的檔案和目錄

在這裡插入圖片描述
總結:
映象就像洋蔥圈 ,就像蓮花捲 ,一層套一層 ,對外只顯示一個檔案系統.
而且, 這種分層映象還可以複用

特點

Dcoker映象都是隻讀的 , 當啟動容器時, 一個新的可寫層被載入到映象的頂部
這一層被稱為"容器層", "容器層"執行的都稱為"映象層"

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之上。
包含的就是典型 Linux 系統中的 /dev, /proc, /bin, /etc 等標準目錄和檔案。
rootfs就是各種不同的作業系統發行版,比如Ubuntu,Centos等等。

平時我們安裝進虛擬機器的CentOS都是好幾個G,為什麼docker這裡才220M

在這裡插入圖片描述
對於一個精簡的OS,rootfs可以很小,只需要包括最基本的命令、工具和程式庫就可以了,
因為底層直接用Host的kernel,自己只需要提供 rootfs 就行了。
由此可見對於不同的linux發行版, bootfs基本是一致的, rootfs會有差別, 因此不同的發行版可以公用bootfs。

Docker映象Commit操作

# 提交容器副本實質成為一個新的映象
docker commit -m="提交的描述資訊" -a="作者"	容器ID 要建立的目標映象名:[標籤名]


eg: 同時docker執行tomcat案例
# 1.  建立互動式介面 ( 相當於前臺啟動)
docker run -it -p 8888:8080 tomcat   # 埠對映將8888作為docker的入口,對映到tomcat映象的8080(圖1,圖2)
docker run -it -P  tomcat  #自動埠對映(通過 docker ps檢視埠, 圖3)
#後臺啟動(不會佔用當前頁面)
docker run -d -p 8888:8080 tomcat 


# 2. 進入tomcat (如果前置啟動,另開一個視窗 ,後置啟動則直接進入)
# 檢視執行容器ID
docker ps  
# 進入根目錄
docker exec -it 容器ID /bin/bash
/usr/local/tomcat# rm -rf webapps/docs/ 
# 刪除後訪問tomcat ,可以看到訪問主頁下的文件出現404(圖4)

# 3. 提交容器副本實使之為一個新的映象
# 檢視執行容器ID
docker ps  
# 提交容器
docker commit -m="del tomcat docs" -a="timepaus" 容器ID tomcat:v1.2
# 檢視映象(圖5)
docker images

# 4.同時啟動新映象並和原來的對比
可以看到我們自己提交的新映象也沒有文件()
但是我們重新下載的tomcat是有的

圖1
在這裡插入圖片描述
圖2
在這裡插入圖片描述
圖3
在這裡插入圖片描述
圖4

在這裡插入圖片描述
圖5
在這裡插入圖片描述

第五章 Docker容器資料卷

簡介

類似Redis中的rdb檔案和aof檔案
用於容器的持久化和榮期間的繼承與共享資料

容器內新增資料卷

1.直接命令新增

# 通過-v命令直接新增 (需要在根目錄下建立 containerData  )
# 建立後修改容器內containerData 會同步到hostData ,反之亦是如此
docker run -it -v /hostData:/containerData  映象名/ID

# 建立只讀許可權的檔案 , 容器內只能讀取這個檔案, 但是不能修改. ro: readonly
docker run -it -v /宿主機絕路路徑目錄:/容器內目錄:ro 映象名

2.Docker新增

DockerFile的簡單理解
在這裡插入圖片描述

# 1. 宿主機根目錄下建立mydocker資料夾並進入


# 2. 在mydocker檔案想建立DockerFile檔案並編輯,內容如下(圖1)

# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash

說明:
出於可移植和分享的考慮,用-v 主機目錄:容器目錄這種方法不能夠直接在Dockerfile中實現。
由於宿主機目錄是依賴於特定宿主機的,並不能夠保證在所有的宿主機上都存在這樣的特定目錄。


3. 使用docker build命令建立一個映象, 並掛載指定宿主機指定檔案
docker build -f /mydocker/DockerFile -t 定義的新映象名稱

4. 檢視映象
docker images

5.執行新映象
docker run -it 定義的新映象ID /bin/bash

6.通過映象執行後生成的容器ID檢視 (圖2), 對應的主機對映的資料卷地址
docker ps
docker inspect 容器ID

7.測試新增捲和主機是否互通有無
在容器中建立檔案, 看看主機中是否建立對應的檔案

注意: 
Docker掛載主機目錄(第3步)Docker訪問出現cannot open directory .: Permission denied
解決辦法:在掛載目錄後多加一個--privileged=true引數即可

圖1
在這裡插入圖片描述

圖2, 檢視執行的容器id相關資訊 docker inspect 容器ID
在這裡插入圖片描述
對比與總結
在這裡插入圖片描述

資料卷容器

命名的容器掛載資料卷,其它容器通過掛載這個(父容器)實現資料共享,
掛載資料卷的容器,稱之為資料卷容器

實現步驟

# 1. 以上一步所建映象為模板 ,首先啟動一個父容器dc01 ,在建立容器的資料卷文夾中建立一個檔案(圖1)
docker run -it --name 	dc01 zzyy/centos
touch dc01_add.txt

# 2. 建立子容器dc02,dc03繼承自dc01 , 在建立容器的資料卷文夾中建立一個檔案(圖2)
docker run -it --name dc02 --volumes-from dc01 zzyy/centos
touch dc02_add.txt
docker run -it --name dc03 --volumes-from dc01 zzyy/centos
touch dc01=3_add.txt


# 3. 回到dc01可以看到所有資料都被共享了(圖3)
# 4. 刪除dc01, dc02修改後dc03是否可訪問,可以 (圖4)
# 5. 刪除dc02dc03是否可以訪問, 可以(圖5)
# 6. 新建dc04繼承dc03是否可以訪問, 可以(圖6)

結論
容器之間配置資訊的傳遞, 資料卷的生命週期一直持續到沒有容器使用它為止

圖1
在這裡插入圖片描述
圖2
在這裡插入圖片描述
圖3
在這裡插入圖片描述
圖4
在這裡插入圖片描述

圖5
在這裡插入圖片描述
圖6
在這裡插入圖片描述

第六章 DockerFile解析

介紹

Dockerfile是用來構建Docker映象檔案 ,是有一系列命令和引數構成的指令碼

構建步驟

1.編寫Dockerfile檔案
2.docker build
3.docker run

格式

以centos的檔案為例

FROM scratch
ADD centos-8-container.tar.xz /

LABEL org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20190927"

CMD ["/bin/bash"]

語法

  1. 每條保留字指令都必須為答謝字母且後面至少跟一個引數
  2. 指令從上到下, 順序執行
  3. #表示註釋
  4. 每條指令都會建立一個一個新的映象層, 並提交

Docker執行DockerFile的大致流程

  1. docker從基礎映象執行一個容器
  2. 執行一條指令並對容器做出修改
  3. 執行類似docker commit 的操作提交一個新的映象層
  4. docker 再基於剛提交的映象執行一個新容器
  5. 執行dockerfile 中的下一條執行, 直至所有指令都完成

從應用軟體的角度來看,Dockerfile、Docker映象與Docker容器分別代表軟體的三個不同階段,

  • Dockerfile是軟體的原材料
  • Docker映象是軟體的交付品
  • Docker容器則可以認為是軟體的執行態。

Dockerfile面向開發,Docker映象成為交付標準,
Docker容器則涉及部署與運維,三者缺一不可,合力充當Docker體系的基石。

在這裡插入圖片描述

1 Dockerfile,需要定義一個Dockerfile,Dockerfile定義了程式需要的一切東西。Dockerfile涉及的內容包括執行程式碼或者是檔案、環境變數、依賴包、執行時環境、動態連結庫、作業系統的發行版、服務程式和核心程式(當應用程式需要和系統服務和核心程式打交道,這時需要考慮如何設計namespace的許可權控制)等等;
2 Docker映象,在用Dockerfile定義一個檔案之後,docker build時會產生一個Docker映象,當執行 Docker映象時,會真正開始提供服務;
3 Docker容器,容器是直接提供服務的

DockerFile保留字指令

檢視tomcat的DockerFile檔案 ,更好理解保留字
在這裡插入圖片描述

保留字整合案例

自定義映象

我們安裝的centos精簡版是沒有vim和ifconfig命令的支援的
我們可以通過編寫Dockerfile令其支援這些功能

# 1.搜尋centos映象並下載
docker search centos
docker pull centos

# 2.編寫建立一個檔案( /mydoker/dockerfile_centos ),編寫Dockerfile ,內容如下
--------------------------------------------------------------------
FROM centos
MAINTAINER timepause<qq_43371556@csdn.net>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "install vim and ifconfig commond plug-in components success"
CMD /bin/bash
-----------------------------------------------------------------------



# 3. 編譯執行centos( 注意最後的空格和點號,圖1 )
docker build -f /mydoker/dockerfile_centos -t mycentos:1.3 .

# 4. 測試功能( 圖2 )
# 檢視是否新增映象
docker ps
# 執行新映象 
docker run -it mycentos:1.3
# 在容器中使用vim 與if config命令

圖1
在這裡插入圖片描述

圖2
在這裡插入圖片描述

自定義tomcat9

# 1. 建立存放生成映象檔案的目錄
mkdir -p /myuse/mydocker/tomcat9

# 2.建立相關檔案(c.txt用於測試)
touch c.txt 


# 3.上傳tomcat和jdk(一定要注意版本, 根據版本修改Dockerfile檔案, 圖1)

#. 4.建立並編輯Dockerfile(需要提前下載centos)
vim Dockerfile
---------------------Dockerfile-------------------------------
FROM         centos
MAINTAINER    chy<chy@qq.com>
#把宿主機當前上下文的c.txt拷貝到容器/usr/local/路徑下
COPY c.txt /usr/local/cincontainer.txt
#把java與tomcat新增到容器中
ADD jdk-8u11-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.27.tar.gz /usr/local/
#安裝vim編輯器
RUN yum -y install vim
#設定工作訪問時候的WORKDIR路徑,登入落腳點
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java與tomcat環境變數
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.27
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.27
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器執行時監聽的埠
EXPOSE  8080
#啟動時執行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.27/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.27/bin/logs/catalina.out
---------------------Dockerfile-------------------------------




# 5.構建映象(在存放這些檔案的目錄下,圖2)
# 如果Dockerfile檔名稱就是Dockerfile,可以省略引數 -f /Dockerfile所在位置的書寫
docker build -t mytomcat9 .

# 6.檢視映象並執行映象( 圖3)
docker images
# 執行映象 (後臺啟動, 成功後如圖4)
docker run -d -p 8080:8080 --name myt9 -v /myuse/mydocker/tomcat9/test:/usr/local/apache-tomcat-9.0.27/webapps/test -v /myuse/mydocker/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.27/logs --privileged=true  mytomcat9

# 注意這裡配置了容器卷的對映,宿主機的test資料夾對映到tomcat的webapps目錄下的test檔案,且二者可以互通有無. 
docker -it 容器ID /bin/bash #進入容器根目錄 ,可以訪問相關頁面

# 7. 訪問成功後, 新增jsp檔案與web.xml檔案( a.jsp用於訪問測試 ,web.xml用於令jsp頁面可以編譯)
vim a.jsp
mkidr WEB-INF
vim /WEB-INF/web.xml
------------------------------------------a.jsp---------------------------
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
  </head>
  <body>

    -----------welcome------------
    <="i am in docker tomcat self "%>
    <br>
    <br>
    <% System.out.println("=============docker tomcat self");%>
  </body>
</html>
------------------------------------------a.jsp---------------------------



------------------------------------------web.xml-----------------------------------
<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0"
  metadata-complete="true">
</web-app>
------------------------------------------web.xml-----------------------------------

# 8. 重啟服務, 訪問a.jsp(圖5)
# 檢視當前容器id
docker ps (檢視當前容器ID)
docker ps -a (檢視所有執行過的容器ID)
# 重啟服務
docker restart 容器ID
# 訪問a.jsp頁面

圖1
在這裡插入圖片描述
圖2
在這裡插入圖片描述

圖3
在這裡插入圖片描述
圖4

在這裡插入圖片描述
圖5

在這裡插入圖片描述

第七章 通過Docker安裝軟體

mysql

# 1. 以安裝mysql5.6為例(不知道什麼原因5.7下不來)
docker pull mysql:5.6

# 2. 執行映象,啟動容器(埠3306,root使用者密碼:root,執行映象:mysql5.6)
docker run -p 3306:3306 --name mysql -v /datebase/mysql/conf:/etc/mysql/conf.d -v /datebase/mysql/logs:/logs -v /datebase/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.6

# 3. 進入msql內部測試登陸
docker ps
docker exec -it MySQL執行成功後的容器ID     /bin/bash

# 4.連線資料庫的圖形化介面

# 5. 備份資料庫資料,之後我們可以通過直接讀取這個sql檔案恢復資料
docker exec myql服務容器ID sh -c ' exec mysqldump --all-databases -uroot -p"root" ' > /datebase/all-databases.sql

redis

# 1.下載最新版redis映象
docker pull redis

# 2.執行映象(redis埠2333, -d後的redis不加引數預設為redis:latest)
# 注意本地資料卷與容器內資料卷目錄的對應
docker run -p 2333:6379 -v /myuse/myredis/data:/data -v /myuse/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf  -d redis redis-server /usr/local/etc/redis/redis.conf --appendonly yes

# 3.上傳redis.conf到本地資料卷所在目錄
本地資料卷坐在目錄 : /myuse/myredis/conf
檔案地址(太大了 ,這裡放不下) : https://download.csdn.net/download/qq_43371556/11889084



# 3. 執行redis的cil
docker exec -it 執行著Rediis服務的容器ID redis-cli

RabbitMQ

# 1.下載映象
docker pull rabbitmq:3.7.7-management

# 2.執行映象
docker run -d --name rabbitmq3.7.7 -p 5672:5672 -p 15672:15672 -v `pwd`/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=/ -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin df80af9ca0c9

-d 後臺執行容器;
--name 指定容器名;
-p 指定服務執行的埠(5672:應用訪問埠;15672:控制檯Web埠號);
-v 對映目錄或檔案;
--hostname  主機名(RabbitMQ的一個重要注意事項是它根據所謂的 “節點名稱” 儲存資料,預設為主機名);
-e 指定環境變數;(RABBITMQ_DEFAULT_VHOST:預設虛擬機器名;RABBITMQ_DEFAULT_USER:預設的使用者名稱;RABBITMQ_DEFAULT_PASS:預設使用者名稱的密碼)


# 3.訪問 (如下圖)
http://ip:15672
賬號 :admin
密碼: admin

在這裡插入圖片描述

第八章 釋出映象到阿里雲

步驟

# 1.登陸阿里雲, 進入容器映象服務(可以通過下方地址註冊登入跳轉到容器映象服務)
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories

# 2. 建立映象倉庫(圖1)
# 3. 在docker中登陸 ,根據圖2,圖3中的操作指南進行操作

# 5. 將正在執行的容器建立成一個映象(圖4)
docker commit 

OPTIONS說明:
-a :提交的映象作者;
-m :提交時的說明文字;

# 4.將映象推送到阿里雲的映象倉庫(最好是根據阿里雲上的操作指南)
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/timepause/mydocker:[映象版本號]
sudo docker push registry.cn-hangzhou.aliyuncs.com/timepause/mydocker:[映象版本號]

# 5. 搜尋映象 ,下載映象(圖5,圖6)
docker pull 複製的映象地址

圖1
在這裡插入圖片描述
圖2
在這裡插入圖片描述
圖3

在這裡插入圖片描述

圖4
在這裡插入圖片描述
圖5
在這裡插入圖片描述
圖6
在這裡插入圖片描述

點選本部落格相關學習視訊地址

相關文章