【學習筆記】學習Docker,看完這篇超詳細的教學就足夠了

2020-10-07 11:00:44

本文為觀看B站狂神的視訊學習Docker時所整理的筆記,中間加了一些自己的理解,如果對大家有所幫助,還希望點贊支援一下,後續我會繼續將自己遇到的Docker問題以及學習的新的知識全部整理新增到本文後面或者整理髮布新的文章,如果感興趣可以關注一波。

Docker的概述

在這裡插入圖片描述
Docker 是一個開源的應用容器引擎,基於 Go 語言 並遵從 Apache2.0 協定開源。
Docker的官網地址https://www.docker.com/
檔案地址https://docs.docker.com/
倉庫地址https://hub.docker.com/

為什麼需要Docker?

傳統的開發問題

  • 環境(切換/設定)麻煩
    在開發一個產品的途中,時常會出現的問題就是:「在我的電腦上可以執行,而到了另外一個開發人員的電腦上就不能使用的問題」,或者是因為版本更新導致服務不可用等等,這對於運維人員來說,壓力十分大,而環境設定是一個非常頭疼的問題,每一個機器都需要部署環境(Redis叢集、ES…)十分麻煩且費時費力,並且設定的環境不能跨平臺,非常不方便。
  • 應用之間的衝突(隔離性)
    假如我們將開發的兩個應用部署到同一個伺服器上,如果一個應用出了問題,導致CPU出問題上升到了100%,那麼第二個應用也會受到關聯;並且如果兩個應用分別使用不同的語言或者技術棧,當安裝在同一個伺服器上的時候可能就會造成各種衝突/無法相容,到時候偵錯就非常頭疼。如下圖所示:

Docker的出現解決以上問題

  • 關於環境問題解決方案
    Docker可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。將環境構建打包成一個映象釋出到網上,想要用這個環境的時候就直接拉取一份就OK了。

  • 解決應用之間隔離問題
    Docker核心思想就是使用容器化技術,打包裝箱,每個箱子是互相隔離的。容器是完全使用沙箱機制,相互之間不會有任何介面(類似 iPhone 的 app),更重要的是容器效能開銷極低。如下圖所示:
    在這裡插入圖片描述

簡述虛擬機器器和Docker容器的區別

這裡參照知乎上大佬的說法:https://www.zhihu.com/question/48174633
伺服器虛擬化解決的核心問題是資源調配,而容器解決的核心問題是應用開發、測試和部署。

  • 使用Docker容器和使用虛擬機器器在執行多個相互隔離的應用時對比,Docker要簡潔很多;
  • Docker守護行程可以直接與主作業系統進行通訊,為各個Docker容器分配資源;它還可以將容器與主作業系統隔離,並將各個容器互相隔離。
  • 虛擬機器器啟動需要數分鐘,而Docker容器可以在數毫秒內啟動。由於沒有臃腫的從作業系統,Docker可以節省大量的磁碟空間以及其他系統資源。
  • 虛擬機器器更擅長於徹底隔離整個執行環境。例如,雲服務提供商通常採用虛擬機器器技術隔離不同的使用者。而Docker通常用於隔離不同的應用,例如前端,後端以及資料庫。
  • 傳統的虛擬機器器,首先是虛擬出一條硬體,執行一個完整的作業系統,然後在這個系統上安裝和執行軟體;
  • Docker容器內的應用直接執行在宿主機的內容,容器是沒有自己的核心的,也沒有虛擬我們的硬體,所以就輕巧了很多;

Docker中的DevOps(開發、運維)

(1)應用更快速的交付和部署

  • 傳統:一堆的幫助檔案和安裝程式
  • Docker:打包映象釋出測試,一鍵執行

(2)更快捷的升級和擴縮容

  • 使用了Docker以後我們部署應用就像搭積木一樣;
  • 專案打包成一個映象

(3)更簡單的系統運維

  • 在容器話之後我們的開發、測試環境都是高度一致的

(4)更高效的計算資源利用

  • Docker是核心級別的虛擬化,可以再一個物理機上可以執行很多的容器範例!伺服器的效能可以被壓榨到極致。

Docker的基本組成

在這裡插入圖片描述

  • 映象(image):docker映象就好比是一個模板,可以通過這個模板來建立容器服務,tomcat映象—>run---->tomcat01容器(提供服務),通過這個映象可以建立多個容器(最終服務執行或者專案執行就是在容器中執行的)。

  • 容器(container):docker利用容器技術,獨立執行一個或者一組應用,通過映象來建立的,啟動、停止、刪除、基本命令,目前就可以把這個容器理解為就是一個簡易的Linux系統。

  • 倉庫(repository):倉庫就是存放映象的地方,倉庫分為公有倉庫和私有倉庫,Docker Hub(預設是國外的)、阿里雲…都有容器伺服器(設定映象加速)

Docker的安裝

前期準備(看看即可)

不一樣的話也行,主要是看Centos的版本
執行環境:阿里雲伺服器 Centos 7
連線工具:XShell 5
需要掌握Linux的基本命令
由於這裡的執行環境是Centos 7,與Centos 6的命令還是有一些區別的,但是區別不大,後面我會將命令詳細的介紹。

檢視環境

  • 系統核心是3.10以上的
[root@oldou ~]#  uname -r
3.10.0-957.21.3.el7.x86_64
  • 檢視系統的版本:
    cat /etc/os-release
    在這裡插入圖片描述

開始安裝

這裡可以參考官網的幫助檔案進行安裝
在這裡插入圖片描述
在這裡插入圖片描述
地址:https://docs.docker.com/engine/install/centos/

第一步:解除安裝舊版本(執行以下程式碼即可)

 yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

在這裡插入圖片描述
第二步:安裝yum工具包
命令:yum install -y yum-utils

第三步:設定映象倉庫

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   
    # 這是阿里雲的docker映象地址,建議使用這個 

在這裡插入圖片描述
更新一下yum索引:
命令:yum makecache fast
在這裡插入圖片描述
第四步:安裝Docker
docker-ce:社群版 ee:企業版
命令:yum install docker-ce docker-ce-cli containerd.io
在這裡插入圖片描述
注意:以上是安裝Docker最新的版本,如果想要安裝指定的版本,就需要進行以下命令:
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
這裡的<VERSION_STRING>表示版本。
在這裡插入圖片描述
第五步:啟動Docker
命令:systemctl start docker
注意:Centos6使用的是service,而Centos7使用的都變成了systemctl

第六步:檢視Docker是否安裝成功
命令:docker version
在這裡插入圖片描述
檢視Docker的狀態: systemctl status docker
在這裡插入圖片描述
第七步:測試hello-word
命令:docker run hello-world
在這裡插入圖片描述
第八步:檢視一下剛剛下載的hello-word的這個映象
命令:docker images
在這裡插入圖片描述

如何解除安裝Docker(瞭解即可)

官網中有介紹,下面我給出來:
第一步:解除安裝依賴
命令:yum remove docker-ce docker-ce-cli containerd.io

第二步:刪除資源 安裝的資源都在/var/lib/docker目錄下
命令:rm -rf /var/lib/docker

這樣就OK了。

設定阿里雲映象加速

由於我們拉取映象的時候,使用國外的下載太慢了,當然我們這裡是使用國內阿里雲的,所以肯定比國外的存取和下載快,這個時候再配個加速器就美滋滋。

第一步:登入我們的阿里雲控制檯,然後找到容器映象服務
在這裡插入圖片描述
第二步:找到映象加速器---->映象加速地址
在這裡插入圖片描述
第三步:設定使用(直接複製命令執行即可)

(1)在伺服器中建立一個目錄sudo mkdir -p /etc/docker

(2)編輯組態檔

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://7ih0bv9h.mirror.aliyuncs.com"]
}
EOF

在這裡插入圖片描述
(3)將服務重新啟動:sudo systemctl daemon-reload

(4)啟動docker:sudo systemctl restart docker

這樣就設定完成了。

Run的流程以及Docker原理

回顧hello-word的流程
在這裡插入圖片描述
就拿我們執行hello-word來說,一開始我們執行hello-word的時候,Docker會在本機中尋找映象,而本機中沒有這個映象,所以就回去我們設定的Hub上去下載映象,如果找到了就將映象下載到本地執行,如果沒有就返回錯誤。如下所示:
在這裡插入圖片描述
底層原理

(1)Docker是怎麼工作的?

  • Docker是一個Client-Server結構的系統,Docker的守護行程執行在本機上(執行在後臺,和mysql一樣),通過Socket從使用者端存取。
  • DockerServer接收到Docker-Client的指令,就會執行這個命令。
    在這裡插入圖片描述
    (2)Docker為什麼比虛擬機器器(VM)快?
    在這裡插入圖片描述
  • Docker利用的是宿主機的核心,VM需要的是Guest OS
    所以說,新建一個容器的時候,Docker不需要像虛擬機器器那樣重新載入一個作業系統核心,避免引導,虛擬機器器是載入Guest OS,是分鐘級別的,而Docker利用的是宿主機的作業系統,省略了這個複雜的過程。
    在這裡插入圖片描述

Docker的常用命令

官方幫助檔案:https://docs.docker.com/engine/reference/run/

檢視資訊和幫助命令

命令:docker version # 檢視docker的版本資訊
在這裡插入圖片描述
命令:docker info # 顯示Docker的系統資訊,包括映象和容器的數量

命令:docker xxx --help #幫助命令,可以顯示docker的所有命令

映象命令

檢視映象
命令:docker images # 檢視所有原生的主機上的映象
在這裡插入圖片描述

REPOSITORY  :映象的倉庫源
TAG					 :映象的標籤
IMAGE ID		 :映象的ID
CERATED		 :映象的建立時間
SIZE				 :映象的大小

docker  images  [可選項]
-a    , --all        # 列出所有映象
-q	   , --quiet    # 只顯示映象的ID

搜尋映象
命令:docker search 映象名 # 搜尋映象

可選項,通過搜過過濾
 --filter-STARS=3000   #搜尋出來的映象修飾STARS大於3000的

在這裡插入圖片描述
下載映象
命令:docker pull 映象名 [:tag]# 下載映象,預設是下載最新版 latest 。
在這裡插入圖片描述
如果是下載指定版本的映象,那麼就需要指定:版本號,如下所示:
docker pull mysql:5.7 # 指定版本下載 下載mysql5.7

刪除映象

# 刪除映象  -f就是全部刪除,後面的條件是根據什麼來刪除,這裡是根據容器的id進行刪除
docker  rmi -f  容器id   

# 刪除多個映象
docker  rmi -f  容器id  容器id 容器id    

# 刪除所有的映象 
docker  rmi -f $(docker images -aq)  

容器命令

說明:我們有了映象才可以去建立容器,Linux,下載一個centos映象來進行學習。

下載centos映象
命令:docker pull centos

新建容器並啟動
命令:docker run [可選引數] image

引數說明:
--name="Name" : 容器名字 ,tomcat01、tomcat02,用來區分容器
-d :後臺方式執行                                
-it:使用互動方式執行,進入容器檢視內容
-p :指定容器的埠   -p  8080:8080  
        -p     ip:主機埠:容器埠                                
        -p     主機埠:容器埠(常用方式)
        -p     容器埠                                                     
        容器埠                                                             
-p: 隨機指定埠     

測試,啟動並進入容器
命令:docker run -it centos /bin/bash #啟動容器
命令: ls # 檢視容器內的centos,基礎版本,很多命令都是不完善的
命令:exit # 從容器中退回到主機

列出所有執行中的容器
命令:docker ps [可選引數] # 列出當前正在執行的程式

-a             #列出當前正在執行的容器+帶出歷史執行過的容器
-n=?      #顯示最近建立的容器  
-p            #只顯示容器的編號

在這裡插入圖片描述

退出容器
命令:

exit                     # 直接停止容器並退出
Ctrl + P + Q             # 容器不停止退出

刪除容器

docker rm  容器id        # 刪除指定的容器,不能刪除正在執行的容器
docker rm -f $(docker ps -aq)       # 刪除所有的容器   
docker ps -a -q|xargs docker rm     # 刪除所有的容器

啟動和容器的操作

docker start 容器id                  # 啟動容器
docker restart 容器id                # 重新啟動容器
docker stop 容器id                   # 停止正在執行的容器
docker kill 容器id                   # 強制停止當前正在執行的容器 

常用的其他命令

後臺啟動容器

命令:docker run -d 映象名

docker run -d centos            # 後臺啟動centos
  • 問題:使用docker ps檢視,發現 centos停止了

  • 常見的坑:docker容器使用後臺執行的時候就必須要一個前臺執行緒,不然docker發現沒有應用就會自動停止

  • 例如:nginx容器啟動後,發現自己沒有提供服務就會立刻停止,就是沒有程式了。

檢視系統CPU狀態

命令:docker stats [容器id]
在這裡插入圖片描述

檢視紀錄檔

命令:docker logs -tf --tail 容器,沒有紀錄檔

  • 編寫一段shell指令碼
docker run -d centos /bin/sh -c "while true; do echo oldouTest;sleep 1;done"
  • 使用docker ps去檢視
  • 顯示紀錄檔 :docker logs -tf --tail number 容器id
-tf                  #顯示紀錄檔
--tail number        #要顯示紀錄檔條數 

例如:docker logs -tf --tail 10 容器id

檢視容器中程序資訊

命令:docker top 容器id

檢視映象中的後設資料

命令:docker inspect 容器id

進入當前正在執行的容器

我們的容器通常都是使用後臺方式執行的,需要進入容器,修改一些設定
方式一:
命令:docker exec -it 容器id bashShell
例如:docker exec -it bb6ddb943ea5 /bin/bash
在這裡插入圖片描述
方式二:
命令:docker attach 容器id
在這裡插入圖片描述
兩種方式的對比

  • docker exec: 進入容器後開啟一個新的終端,可以在裡面操作(常用)
  • docker attach:進入容器正在執行的終端,不會啟動新的程序

從容器中拷貝檔案到主機上

在這裡插入圖片描述

# 進入到容器內:
[root@oldou home]# docker exec -it bb6ddb943ea5 /bin/bash  
[root@bb6ddb943ea5 /]# cd home
[root@bb6ddb943ea5 home]# ls

# 建立一個java檔案
[root@bb6ddb943ea5 home]# touch Test.java 
[root@bb6ddb943ea5 home]# ls
Test.java

# 退出容器回到主機
[root@bb6ddb943ea5 home]# exit
exit

#檢視當前執行的容器
[root@oldou home]# docker ps

# 將容器內/home目錄下的Test.java檔案拷貝到主機的home目錄下
[root@oldou home]# docker cp bb6ddb943ea5:/home/Test.java /home
[root@oldou home]# ls
Test.java

拷貝只是一個手動的過程,後面學習了 -v 卷的技術時,可以實現同步資料

常用命令小結

在這裡插入圖片描述

命令英文描述中文意思
attachAttach to a running container當前shell下attach連線指定執行映象
buildBuild an image from a Dockerfile通過Dockerfile客製化映象
commitCreate a new image from a container changes提交當前容器為新的境像
cpcopy files/folders from the containers filesystem to the host path從容器中拷貝指定檔案或者目錄到宿主機中
createCreate a new container建立一個新的容器,同run.但不啟動容器
diffInspect changes on a container’s filesystem檢視docker容器變化
eventsGet real time events from the server從docker服務中獲取容器實時事件
exportStream the contents of a container as a tar archive匯出容器的內容流作為一個 tar歸檔檔案[對應import]
historyShow the history of an image展示一個境像形成歷史
imagesList images列出系統當前所有映象
importCreate a new filesystem image from the contents of a tarball從tar包中的內容建立一個新的檔案系統映像[對應export]
infoDisplay system-wide information顯示系統相關資訊
inspectReturn low-level information on a container檢視容器詳細資訊
killKill a running containerkill指定docker容器
loadLoad an image from a tar archive從—個 tar包中載入一個映象[對應save]
loginRegister or Login to the docker registry server註冊或者登陸一個docker源伺服器
logoutLog out from a Docker registry server從當前Docker registry退出
logsFetch the logs of a container輸出當前容器紀錄檔資訊
portLookup the public-facing port which is NAT-ed to PRIVATE_PORT檢視對映埠對應的容器內部源端
pausePause all processes within a container暫停容器
psList containers列出容器列表
pullPull an image or a repository from the docker registry server從docker映象伺服器中拉取指定映象或者庫映象
pushpush an image or a repository to the docker registry server推播指定映象或者庫映象至docker源伺服器
restartRestart a running container重新啟動執行的容器
rmRemove one or more containers移除—個或者多個容器
rmiRemove one or more images移除一個或多個境像[無容器使用該映象才可刪除,否則需刪除相關容器才可能繼續或者 -f 強制刪除
runRun a command in a new container建立—個新的容器並執行一個命令
saveSave an image to a tar arehive儲存一個映象為—個tar包「對應load]
searchSearch for an image on the Docker Hub在docker hub中搜尋映象
startstart a stopped containers啟動容器
stopstop a stopped containers停止容器
tagTag an image into a repository給源中映象打標籤
topLookup the running processes of a container檢視容器中執行的程序資訊
unpauseUnpause a paused container取消暫停容器
versionshow the docker version information檢視docker版本號
waitBlock until a container stops,then print its exit code擷取容器停止時的退出狀態值

練習

練習一:使用Docker安裝Nginx

官網:https://hub.docker.com/_/nginx

第一步:搜尋映象(這裡建議去docker Hub上查詢一下版本資訊,上面還有幫助檔案介紹)
命令:docker search nginx

第二步:下載映象
命令:docker pull nginx

第三步:檢視映象並且啟動
命令:docker images # 檢視所有映象

**命令:docker run -d --name nginx01 -p 3344:80 nginx

-d 表示後臺執行,--name 表示給容器起名字,而nginx01表示起的名字,
-p 宿主機埠 :容器內部埠

後面的3344表示主機開發的3344埠,80表示容器內部的埠,這裡表示將80埠對映到外部的3344,
可以通過公網的3344存取到docker裡面的80埠,後面的nginx表示的是映象名字。

在這裡插入圖片描述
第四步:檢視容器並且執行測試
命令:docker ps #檢視是否啟動
命令:curl localhost:3344
在這裡插入圖片描述
關閉防火牆systemctl stop firewalld

到這一步的時候我們就可以使用 公網ip:3344 在瀏覽器存取了
在這裡插入圖片描述
第五步:進入Nginx容器
命令:docker exec -it nginx01 /bin/bash #進入容器

命令:whereis nginx

命令:cd /etc/nginx

命令:ls檢視

命令:exit #退出

命令:docker stop 容器id #停止Nginx容器
在這裡插入圖片描述
埠暴露的概念:
在這裡插入圖片描述
思考問題:我們每次改動nginx組態檔,都需要進入容器內部?十分的麻煩,我要是可以在容器外部提供一個對映路徑,達到在容器修改檔名,容器內部就可以自動修改?
使用 -v資料卷。

練習二:使用Docker部署Tomcat

官網:https://hub.docker.com/_/tomcat

方式一:

  • 官方給出的命令:
    docker run -it --rm tomcat:9.0 # 下載並啟動
    上面介紹Nginx的啟動都是後臺啟動,停止了容器以後,容器還是可以查到,並且佔用著設定的埠。
    使用官方給出的 docker run -it --rm tomcat:9.0 ,一般用於測試,用完停止就刪除

方式二:
還是使用之前的方式。

  • 第一步:搜尋映象(這裡建議去docker Hub上查詢一下版本資訊,上面還有幫助檔案介紹)
    命令:docker search tomcat

  • 第二步:下載映象
    命令:docker pull tomcat # 這是下載最新版的tomcat
    命令: docker pull tomcat:7.0 # 指定版本號

  • 第三步:檢視映象並且啟動
    命令:docker images # 檢視所有映象
    命令:docker run -d --name tomcat01 -p 3355:8080 tomcat:7.0

-d 表示後臺執行,--name 表示給容器起名字,而tomcat01表示起的名字,
-p 宿主機埠 :容器內部埠

後面的3355表示主機開發的3355埠,8080表示容器內部的埠,這裡表示將8080埠對映到外部的3355,
可以通過公網的3355存取到docker裡面的8080埠,後面的tomcat表示的是映象名字。

我們這個時候去瀏覽器存取發現,報了404異常,那我們進入到tomcat容器內部檢視一下原因.

  • 第四步:進入容器檢視原因
    命令:docker exec -it tomcat01 /bin/bash
    當我們使用ll命令時竟然不能使用,只能使用ls命令檢視,同時進入到webapps目錄下發現這個目錄竟然是空的。

發現問題:
1、Linux的命令少了;
2、webapps目錄下沒有檔案;

原因:
阿里雲的映象預設是最小的映象,它把所有不必要的都剔除掉了。保證最小可執行的環境。

解決辦法:
在tomcat目錄下有一個webapps.dist目錄,這個目錄下有我們所需要的檔案,也就是webapps目錄所需要的檔案,我們將這個檔案中的內容全部拷貝到webapps下。

  • 第五步:拷貝資源
    命令:cp -r webapps.dist/* webapps

這樣我們再去瀏覽器中去存取就可以存取到了。

思考問題:我們以後要部署專案,如果每次都要進入容器是不是十分麻煩?要是可以在容器外部提供一個對映路徑,webapps ,我們在外部放置專案,就自動同步到內部就好了!

練習三:使用Docker部署Elasticsearch、Kibana

由於暫時沒有學過Elasticsearch,所以暫時沒有做這個部分的筆記,只是暫時看了一遍,後續補上…

後續筆記待更新中…