Docker基礎用法

2022-08-07 18:01:24

Docker基礎用法

1、Docker為什麼會出現?

一款軟體產品必須經過:開發 -> 上線

開發人員負責將應用程式開發製作出來。
運維人員負責上線,設定應用程式。

在這裡存在一個問題:開發環境和上線環境不一致;可能會導致,開發人員在自己的電腦上可以正常執行程式碼,運維人員將服務程式上線到伺服器後,由於環境不一致可能會導致執行失敗,服務不可用。

如何解決上述問題?

  • 對上線的伺服器系統進行環境設定,但環境設定十分麻煩特別是叢集部署時,叢集中的每一臺機器都需要部署環境。
  • 將開發環境和程式程式碼一起打包到伺服器中執行。

Docker就是將開發環境和程式程式碼一起打包到伺服器中執行的技術。

java語言 --> apk程式 --> 釋出到應用商店 --> 客戶下載apk --> 安裝使用(必須要有環境才能安裝成功)

java語言 --> jar環境 --> 打包專案和環境(映象) --> 上傳到docker倉庫(商店) --> 下載倉庫中的映象 --> 執行使用

2、Docker介紹

Docker是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的映象中,然後釋出到任何流行的Linux或Windows機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。

Docker的核心思想就是來自集裝箱;集裝箱的概念是隔離貨物,所以docker的核心就是隔離機制。同時docker使用可移植映象所以部署以及運維極其方便快捷。

2.1 Docker發展史

2010年,幾個熱愛IT的年輕人,在美國成立了一家公司叫做dotCloud,主要做一些Paas的雲端計算服務和LXC有關的容器技術賺錢盈利,他們將自己的容器技術命名為Docker!

Docker剛剛誕生的時候,並沒有引起行業的注意!這個時候 dotCloud公司難以在行業中存活,所以這幾個年輕人選擇開放Docker原始碼來引起注意!

2013年,Docker開源!越來越多的人發現docker的優點,救火了,docker每個月都會更新一個版本!

2014年4月9日,Docker1.0釋出!

Docker為什麼這麼火?十分的輕巧

在容器技術出來之前,我們都是使用虛擬機器器技術!
虛擬機器器:在window中裝一個Vmware,通過這個軟體我們可以虛擬出來一臺或者多臺電腦!(很笨重)
虛擬機器器也是屬於虛擬化技術,Docker容器技術,也是一種虛擬化技術!

vm:隔離,需要開啟多個虛擬機器器!linux centos原生映象(一個電腦!)需要幾個G記憶體空間,開啟需要幾分鐘!
docker:隔離,映象(最核心的環境4m記憶體)十分的小巧,執行映象就可以了!小巧!幾個M或KB的記憶體空間,秒級啟動!

2.2 容器和虛擬機器器的區別

虛擬機器器:通過虛擬化技術模擬真實的硬體從而建立出來的一臺擁有完整功能的邏輯計算機。

Docker容器:docker容器也是一種虛擬化技術,和傳統虛擬化不一樣的是docker只模擬一個程式最核心的執行環境,所以十分小巧,啟動更快。

Docker虛擬化技術和傳統虛擬化技術架構對比:

對比 特點
虛擬機器器 完整的系統功能,隔離性更好,佔用空間大(通常以G為單位),執行佔用資源較多,啟動慢(分鐘級啟動)
容器 只有程式執行的核心環境,不需要安裝直接執行映象即可,隔離性一般,十分小巧佔用空間極小(一般以M為單位),啟動快(秒級啟動)

2.3 Docker引擎架構

Docker 引擎(Docker Engine)是目前主流的容器引擎;Docker 引擎是一個包含以下元件的客戶/伺服器 架構的應用程式,如圖所示:

Docker引擎組成:

  • 伺服器:即Docker守護行程(Daemon),這是 Docker 的後臺應用程式,可使用 dockerd 命令 進行管理。Docker守護行程監聽來自Docker API的請求,可用於建立和管理 Docker物件,如鏡 像、容器、網路和卷。一臺主機執行一個 Docker守護行程。
  • REST API:定義程式與 Docker守護行程互動的介面,便於程式設計操作 Docker 平臺和容器。REST API是一套目前比較成熟的Internet 應用程式 API架構
  • 使用者端:即命令列介面(Command-Line Interface,CLI),可使用 docker 命令進行操作。命令 行介面又稱命令列介面,可以通過命令或指令碼使用 Docker 的REST API 介面來控制Docker守護進 程,或者與Docker守護行程進行互動。當用戶使用 docker run 這樣的命令時,使用者端將這些命令 傳送到Docker守護行程來執行。Docker使用者端可以與多個 Docker守護行程進行通訊。許 多 D o c k e r 應 用程式都會使用底層的 API和命令列介面。

2.4 Docker 架構

Docker執行架構:

  • Docker使用者端與 Docker守護行程通訊,而Docker守護行程相當於Docker伺服器,負責構建、運 行和分發容器的繁重任務。Docker使用者端與守護行程可以在同一個系統上執行,也可以讓 Docker 使用者端連線到遠端主機上的 Docker守護行程。Docker使用者端和守護行程使用REST API通過UNIX 通訊端(Socket)或網路介面進行通訊。D o c k e r守護行程和 Docker使用者端屬於 Docker 引擎的 一部分。
  • Docker 註冊中心用於儲存和分發 Docker 映象。Docker Hub和 Docker Cloud 是任何人都可以使 用的公開註冊中心,預設情況下,Docker守護行程會到Docker Hub中查詢映象。除此之外,使用者 還可以執行自己的私有註冊中心。

2.5 Docker底層技術

  • 名稱空間(Namespace):又 稱名稱空間,Linux 的名稱空間機制提供了一種資源隔離的解決方 案。Docker 通過名稱空間機制為容器提供隔離的工作空間,執行容器時,Docker會為該容器建立 一系列的名稱空間
  • 控制組(Control Group):Linux 可以通過控制組設定程序使用 CPU、記憶體和I/O資源的限額, Linux 上的 Docker 引擎正是依賴這種底層技術來限制容器使用的資源
  • 聯合檔案系統(Union File System,UnionFS):這是為 Linux、FreeBSD 和NetBSD 作業系統設 計的一種檔案系統,可以將其他檔案系統合併到一個聯合掛載點。作為輕量級的高效能分層檔案系 統,聯合檔案系統支援將檔案系統中的變更資訊進行提交。聯合檔案系統是實現 Docker 映象的 技術基礎,Docker 映象可以通過分層來實現繼承
  • 容器格式(Container Format):Docker 引擎將名稱空間、控制組和聯合檔案系統打包到一起所 使用的就是容器格式。預設的容器格式是 Libcontainer。Docker 將來還可能會通過整合FreeBSD Jails或Solaris Zones 來支援其他的容器格式

2.6 Docker優勢

Docker優勢:

  • 應用程式快速、一致地交付
    • 開發人員在本地編寫應用程式程式碼,通過Docker與同事進行共用。
    • 通過Docker將應用程式推播到測試環境中,執行自動測試和手動測試。
    • 開發人員發現程式錯誤時,可以在開發環境中進行修復,然後重新部署到測試環境來進行測試和驗證。
    • 完成應用程式測試之後,向客戶提供修補程式程式非常簡單,只需將更新後的映象推播到生產環境中。
  • 響應式部署和伸縮應用程式
  • 更簡單的系統運維
    • 在容器化之後,我們的開發,測試環境都是高度一致的!
  • 更高效的計算資源利用
    • Docker是核心級別的虛擬化,可以再一個物理機上可以執行很多的容器範例!

2.7 Docker 名詞解釋

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

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

倉庫(repository):
倉庫就是存放映象的地方!
倉庫分為公有倉庫和私有倉庫!

2.8 Docker中的容器

  • lxc --> libcontainer --> runC

OCI&OCF

OCI

Open Container-initiative

  • 由Linux基金會主導於2015年6月創立
  • 旨在圍繞容器格式和執行時制定一個開放的工業化標準
  • 包含兩個規格
    • 執行規範(runtime-spec)
    • 映象規格(image-spec)

OCF

Open Container Format

runC是一個命令列工具,用於根據OCI規範生成和執行容器

  • 容器作為runC的子程序啟動,並且可以嵌入到各種其他系統中,而無需執行守護行程
  • runC是建立在libcontainer之上的,libcontainer是一種支援數百萬Docker引擎安裝的容器技術

docker提供了一個專門容納容器映象的站點:https://hub.docker.com

3、Docker環境部署

# 1.首先設定yum倉庫
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

# 2.解除安裝舊的版本
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
                  

# 3.設定映象的倉庫
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo # 預設是從國外的。
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 推薦使用阿里雲的。
    
# 4.安裝容器相關的。docker-ce(社群版)docker-ee(企業版)
yum install docker-ce 

# 5.啟動docker服務並設定開機自啟
systemctl start docker
systemctl enable docker
# 6.使用docker version檢視是否安裝成功
docker version

# 7.測試hello-world
docker run hello-world

# 8.檢視一下,下載的這個hello-world映象

docker加速

docker-ce的組態檔是/etc/docker/daemon.json,此檔案預設不存在,需要我們手動建立並進行設定,而docker的加速就是通過設定此檔案來實現的。

docker的加速有多種方式:

  • docker cn
  • 中國科技大學加速器
  • 阿里雲加速器

阿里雲加速器使用方法

開啟瀏覽器,存取阿里雲官網

登入之後點選右上角控制檯,在點選左上角產品與服務

彈性計算裡找到容器映象服務

在/etc/docker目錄下新建檔案daemon.json將加速器地址寫入

mkdir -p /etc/docker
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://此處地址為自己阿里雲映象加速地址.mirror.aliyuncs.com"]
}

重啟服務

systemctl daemon-reload
systemctl restart docker

瞭解:解除安裝docker

# 1.解除安裝依賴
yum remove docker-ce 

# 2.刪除資源
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

# /var/lib/docker  docker的預設工作路徑

4、Docker的常用命令

4.1 幫助命令

docker version         # 顯示docker的版本資訊
docker info           # 顯示docker的系統資訊,包括映象和容器的數量
docker 命令 --help      # 幫助命令

4.2 映象命令

docker images 檢視所有原生的主機上的映象

[root@localhost ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    feb5d9fea6a5   10 months ago   13.3kB
# 解釋
REPOSITORY     //映象的倉庫源
TAG          //映象的標籤
IMAGE ID       //映象的id
CREATED        //映象的建立時間
SIZE          //映象的大小
# 命令引數可選項
 -a, --all         # 顯示所有映象 (docker images -a)
 --digests 		      #顯示映象的摘要資訊(docker images --digests)
 -q, --quiet        # 僅顯示映象id (docker images -q)

docker search 搜尋映象

[root@localhost ~]# docker search mysql
NAME      DESCRIPTION                            STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   12966     [OK]       
......
# 解釋
NAME			   //映象倉庫源的名稱
DESCRIPTION		//表示該映象的功能
STARS			   //表示下載熱度
OFFICIAL		  //是否docker官方釋出
AUTOMATED		  //自動構建
# 命令引數可選項 (通過搜尋來過濾)
--filter=STARS=3000     # 搜尋出來的映象就是stars大於3000的
[root@localhost ~]# docker search mysql --filter=STARS=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…             12966      [OK]       
mariadb   MariaDB Server is a high performing open sou…              4966      [OK]       

docker pull 下載映象

# 下載映象:docker pull 映象名[:tag]
[root@localhost ~]# docker pull mysql
Using default tag: latest						#如果不寫tag,預設就是latest,最新的版本
latest: Pulling from library/mysql
32c1bf40aba1: Pull complete 				 # 分層下載,docker image的核心,聯合檔案下載
3ac22f3a638d: Pull complete 
b1e7273ed05e: Pull complete 
20be45a0c6ab: Pull complete 
410a229693ff: Pull complete 
1ce71e3a9b88: Pull complete 
c93c823af05b: Pull complete 
c6752c4d09c7: Pull complete 
d7f2cfe3efcb: Pull complete 
916f32cb0394: Pull complete 
0d62a5f9a14f: Pull complete 
Digest: sha256:ce2ae3bd3e9f001435c4671cf073d1d5ae55d138b16927268474fc54ba09ed79
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest			# 真實地址

# 指定版本下載
[root@localhost ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Already exists        # 聯合檔案下載,已經存在的資源可以共用
93619dbc5b36: Already exists
99da31dd6142: Already exists
626033c43d70: Already exists
37d5d7efb64e: Already exists
ac563158d721: Already exists
d2ba16033dad: Already exists
0ceb82207cd7: Pull complete
37f2405cae96: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

docker rmi 刪除映象

[root@localhost ~]# docker rmi -f 映象id              # 刪除指定的映象
[root@localhost ~]# docker rmi -f 映象id 映象id 映象id    # 刪除多個映象(空格分隔)
[root@localhost ~]# docker rmi -f $(docker images -aq)    # 刪除全部的映象

docker inspect 獲取映象的詳細資訊

[root@localhost ~]# docker inspect 映象名:標籤

docker tag 新增映象別名,類似於別名

[root@localhost ~]# docker tag 映象名:標籤 新映象名:新標籤

# 範例:
[root@localhost ~]# docker tag mysql:5.7 mysql:alone
[root@localhost ~]# docker images 
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mysql        5.7      3147495b3a5c   8 days ago      431MB
mysql        alone     3147495b3a5c   8 days ago      431MB

4.3 容器命令

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

docker pull centos

容器建立命令

docker create 建立新容器

[root@localhost ~]# docker create 映象名

# 範例:
[root@localhost ~]# docker create centos
1f8c0d836c2751fd39b46922d256505626925a7519154e2d0b811ede561bb097
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS    PORTS     NAMES
1f8c0d836c27   centos    "/bin/bash"   10 seconds ago   Created             jovial_chaum

docker run 容器建立並執行

docker run [可選引數] image
# 引數說明
--name="name"        容器名字:用來區分容器
-d                    後臺方式執行:相當於nohup
-it                    使用互動式執行:進入容器檢視內容
-p                    指定容器的埠(四種方式)小寫字母p
    -p ip:主機埠:容器埠
    -p 主機埠:容器埠
    -p 容器埠
    容器埠
-P                     隨機指定埠(大寫字母P)

#使用centos映象啟動一個名為centos0的容器
[root@localhost ~]# docker run --name centos0 centos

# 使用centos映象啟動容器並分配一個bash shell的終端進入容器
[root@localhost ~]# docker run -it centos /bin/bash
[root@6c39cc898c6c /]# ls		 # 檢視容器內的centos(基礎版本,很多命令都是不完善的)
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@6c39cc898c6c /]# exit
exit
# 注意:
1.指定-it選項為容器分配shell後,啟動容器時執行的命令將會被shell替代
2.不加-d選項的容器一旦使用exit退出容器shell,容器就終止執行;ctrl+p+q可以退出shell,容器仍將繼續執行

# 使用 mysql映象啟動一個名為 mysql1的容器並在後臺執行
[root@localhost ~]# docker run --name mysql1 -d mysql
867c0734a5f21ae1fb607f5cdf2eb03bb4494eb5dc1056caa164689d0a2dc76f

#使用 mysql映象啟動一個名為 mysql2的容器,該容器在後臺執行,存取宿主機的8080埠可以存取到容器的80埠
[root@localhost ~]# docker run --name mysql2 -d -p 8080:80 mysql
c07b515d0041fbb6905990c9377971fd0353cdb63e1adb80f5f05648d850baf8

容器檢視命令

docker ps 檢視容器執行狀態

# 選項:
-a 			//顯示所有的容器,包括未執行的
-q			//只顯示容器id
-l			//顯示最近建立的容器。
-f "篩選條件"		//根據條件過濾顯示的內容

# 範例:
範例:
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE        COMMAND    CREATED          STATUS           PORTS     NAMES
c8af463c6e52   hello-world   "/hello"   14 seconds ago  Exited (0) 13 seconds ago     strange_cartwright

# 解釋
CONTAINER ID		 //容器 ID
IMAGE			     //使用的映象
COMMAND			   //啟動容器時執行的命令
CREATED			   //容器的建立時間
STATUS			  //容器狀態
# 容器狀態有7種:
	created(已建立)
	restarting(重啟中)
	running(執行中)
	removing(遷移中)
	paused(暫停)
	exited(停止)
	dead(死亡)
PORTS			//容器的埠資訊和使用的連線型別(tcp\udp)。
NAMES			//容器名稱

docker inspect 檢視容器詳細資訊

# 範例:
[root@localhost ~]# docker inspect test
......略........

容器刪除命令

docker rm 刪除容器

docker rm 容器名			//刪除容器,無法刪除執行狀態下的容器
選項:
-f				//強制,可以刪除執行狀態下的容器

# 範例:
//刪除mysql1容器
[root@localhost ~]# docker rm nginx01
mysql1

//批次刪除所有容器
[root@localhost ~]# docker rm $(docker ps -qa)
9b2fa686b4ae
a4f41fb35ac3

容器生命週期管理命令

docker start   容器名	//開啟容器
docker stop    容器名	//停止容器
docker kill    容器名	//殺死容器
docker restart  容器名	 //重啟容器
docker pause   容器名	//暫停容器中所有的程序
docker unpause  容器名	 //恢復容器中所有的程序

容器佔用資源檢視命令

docker stats  容器名	//檢視容器使用資源資訊
docker top    容器名	//檢視容器中執行的程序資訊,支援ps命令引數
docker port   容器名	//檢視宿主機埠和容器埠之間的埠對映

容器紀錄檔檢視命令

# 當容器建立失敗時,因為容器沒有啟動成功則無法看到錯誤紀錄檔,無法判斷問題所在,下面命令可以檢視紀錄檔,不管容器時候啟動成功

docker logs   容器名	//獲取容器的紀錄檔資訊
選項:
-f			//跟隨列印最新的紀錄檔追加在最後面
-t			//顯示紀錄檔列印的時間戳
--tail 數量		//只顯示最新的指定數量的幾條紀錄檔資訊

容器內程序連線和命令執行

docker attach 連線到正在執行的容器程序中,預設連線到容器啟動時啟動的程序

# 連線到httpd03容器中的nginx程序,此時可以看到httpd03工作紀錄檔
[root@localhost ~]# docker attach httpd03
172.17.0.1 - - [04/Aug/2022:09:06:29 +0000] "GET / HTTP/1.1" 304 -
# 注意:使用attach連線到容器容器程序,一旦終止容器內的程序,容器就終止執行

# 如果容器啟動時執行的命令是shell程序,則連線shell終端
[root@localhost ~]# docker attach httpd04
root@6b830320e24a:/usr/local/apache2# exit
exit

docker exec 不進入容器執行容器中的命令

# docker exec 容器名 執行命令	
選項:
-d				//後臺執行,不顯示結果
-it				//為容器分配一個始終執行的偽終端,需要指定shell;-i保持執行狀態,-t是分配偽終端

# 範例:
#不進入容器執行容器中的ls命令
[root@localhost ~]# docker exec httpd04 ls			
bin
build
cgi-bin
......

# 使用docker exec命令開啟一個shell進入到容器中,使用exit退出shell,容器也不會終止執行
[root@localhost ~]# docker run --name httpd05 -it -d httpd /bin/bash	
1b656ba8a5b5689c0b2e688537358779964a9e43f174ce3ab5ff7196dac4e402
[root@localhost ~]# docker exec -it httpd05 /bin/bash
root@1b656ba8a5b5:/usr/local/apache2# exit
exit

注意:

# docker exex # 進入容器後開啟一個新的終端,可以再裡面操作(常用)

# docker attach # 進入容器正在執行的終端,不會啟動新的程序。

5、docker event state