一、docker基本管理和概念
1、概念?
docker:開源的應用容器引擎。基于go語言開發的。運行在Linux系統中的開源的輕量級的“虛擬機”
docker的容器技術可用在一臺主機上輕松到達為任何應用創建一個輕量級到的,可移植的,自給自足的容器
docker的宿主機是Linux系統。集裝箱可以理解為相互隔離的容器(組件、應用程序APP),每個容器都是一個獨立的應用程序
2、docker的設計宗旨:
build,ship and run,anywhere
build:封裝好的程序,只需要部署即可使用。一次封裝
ship and run:一次封裝完成之后的程序,可以在任何環境運行。
anywhere:任意宿主機
一次封裝,到處運行。
封裝——發布——部署——運行——維護——銷毀
可以以一整套的方式管理應用程序的生命周期
3、docker為什么受歡迎:
- 靈活:在復雜的程序也可以實現容器化
- 輕量級:小型的不完整的、最小化封裝的程序,與宿主機共享一個內核
- 可互換性:可以隨時的升級、更新。
- 便攜式:本地可以構建,在云平臺上也可以實現部署。在任何地方運行
- 可拓展:自動分發容器副本。
- 可堆疊:在一個宿主機上可以創建不同版本的同一容器,也可以是多個相同版本的同一容器
Linux的命名空間:namespace。是一種內核特性作用是允許將一組系統的資源隔離,在一個命名空間中的進程在系統當中可以擁有獨立的資源。
4、namespace的六項隔離
- UTS(命名空間),系統調用參數:CLONE_NEWUTS。隔離內容:隔離主機和域名,在UTS這個命名空間中創建進程,進程可以看到自己的主機名和域名,與其他進程分隔開
- IPC 系統調用的參數:CLONE_NEWIPC。隔離內容:隔離信號量、消息隊列、共性內存,在IPC這個命名空間中,進程可以擁有一個獨立的進程間通信資源
- PID ?系統調用參數:CLONE_NEWPID。隔離內容:每個進程都有自己獨立的進程號空間。
- network ?系統調用參數:CLONE_NEWNET 隔離內容:網絡棧,以及端口。每個進程都有自己獨立的網絡進程
- mount ?系統調用參數:CLONE_NEWNS。隔離內容:掛載點,在mount這個命名空間中,每個進程或者設備都有一個自己的文件系統掛載點,相互之間互不干擾。
- user ??系統調用參數:CLONE_NEWUSER。隔離不同的用戶和用戶組
基于這六個隔離項實現了容器和容器之間,以及容器和宿主機之間的資源隔離
https://hub.docker.com/
5、docker的核心組件:
鏡像:docker的基礎,也是docker的最小單位,類似于虛擬機的ISO文件,一個鏡像就是一個可執行的包,包中包含了運行這個程序的所有內容(代碼、配置文件、環境變量)
docker鏡像也可理解為一個壓縮包,但他不是一個解壓文件,他是環境部署的一個腳本,甚至包含了完整的操作系統。
容器:docker的容器就是基于鏡像運行起來的實例,可以啟動、停止、刪除。每一個容器都是相互隔離的,互不可見
倉庫:保存鏡像,所有的鏡像都是從倉庫中拉取。可以有公有倉庫,還可以是私有倉庫。鏡像都是從倉庫中拉取,鏡像也保存在倉庫當中。
下載到了本地:鏡像、容器、日志 /var/log/docker 宿主機
6、docker與虛擬機之間的區別:
特性:
docker | 虛擬機 | |
啟動速度 | 秒級 | 分鐘級 |
計算能力損耗 | 幾乎無 | 損耗50% |
性能 | 接近于原生系統 | 弱于原始系統 |
系統支持量 | 上千個 | 硬件系統來看(幾十個) |
隔離性 | 資源隔離 | 完全隔離 |
安全性 | 安全性差 | 安全性強 |
二、docker的安裝部署:
安裝 Docker
目前 Docker 只能支持 64 位系統。
systemctl stop firewalld.service
setenforce 0
#安裝依賴包
yum install -y yum-utils device-mapper-persistent-data lvm2
--------------------------------------------------------------------------------------------
yum-utils:提供了 yum-config-manager 工具。
device mapper: 是Linux內核中支持邏輯卷管理的通用設備映射機制,
它為實現用于存儲資源管理的塊設備驅動提供了一個高度模塊化的內核架構。
device mapper存儲驅動程序需要 device-mapper-persistent-data 和 lvm2。
--------------------------------------------------------------------------------------------
#設置阿里云鏡像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安裝 Docker-CE并設置為開機自動啟動
yum install -y docker-ce docker-ce-cli containerd.io
docker-ce(Docker Community Edition):這是 Docker 的社區版。
Docker 社區版是免費的,面向開發者、小型團隊和個人使用。它包含了 Docker Engine,
這是一個用于構建和運行容器的開源容器運行時。
docker-ce-cli(Docker Command Line Interface):這是 Docker 的命令行工具,
它允許用戶與 Docker Engine 交互,執行容器相關的操作。
通過 Docker CLI,用戶可以構建、運行、管理和發布容器。
containerd.io:它負責管理容器的生命周期,包括容器的創建、運行、暫停、繼續和銷毀等。
systemctl start docker.service
systemctl enable docker.service
docker-ce:docker的社區版,免費。面向開發者、小型團隊和個人使用
docker-ce-cli:提供docker的命令行工具
contarnerd.io:負載管理容器的生命周期,創建,運行,停止,繼續,銷毀
docker只能支持64位系統
啟動docker,開機自啟
安裝好的Docker系統有兩個程序,Docker服務端和Docker客戶端。其中Docker服務端是一個服務進程,
負責管理所有容器。
Docker客戶端則扮演著Docker服務端的遠程控制器,
可以用來控制Docker的服務端進程。
大部分情況下Docker服務端和客戶端運行在一臺機器上。
docker的操作命令
查看 docker 版本信息
docker version
docker 信息查看
docker info ?
overlay2:docker使用的文件系統的驅動
overlayFS:overlay file system:聯合文件系統,用于適配宿主機的文件系統,可以自動適配。
LowerDir:底層目錄。是一個或者多個鏡像文件的根文件系統
UpperDir:可寫層。可以在容器運行時,在容器內進行寫操作。實現容器的可寫性
MergeDir:合并目錄。lowerdir和upperdir合并起來。就是容器的文件系統,用戶看到的也就是這個合并的視圖
WorkDir:工作目錄。處理文件系統變更,當在容器內進行寫操作時,overlayfs使用workdir來追蹤文件系統的變更。
三、docker鏡像進行操作:
docker search 鏡像名稱
docker search nginx
docker search nginx
NAME ?? DESCRIPTION ???? ??STARS ???OFFICIAL ??AUTOMATED
nginx ????Official build of Nginx. ??19311 ??????[OK] ??????
NAME: 列出了 Docker 鏡像的名稱,這里是 "nginx"。
DESCRIPTION: 顯示了關于該鏡像的簡要描述。在這里,是 Nginx 的官方構建。
STARS: 顯示了該鏡像在 Docker Hub 上的星級評價。在這里,有 19311 顆星表示該鏡像相當受歡迎。
OFFICIAL: 指示該鏡像是否是官方構建。在這里,"[OK]" 表示它是官方構建。
AUTOMATED: 顯示了該鏡像是否是自動化構建的。在這里沒有顯示具體的信息。
1、獲取鏡像
格式:docker pull 鏡像名稱[:標簽]
如果下載鏡像時不指定標簽,則默認會下載倉庫中最新版本的鏡像,即選擇標簽為 latest 標簽。
docker pull nginx
2、鏡像加速下載
瀏覽器訪問 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 獲取鏡像加速器配置
3、查看鏡像信息
鏡像下載后存放在 /var/lib/docker 。
Docker 相關的本地資源存放在 /var/lib/docker/ 目錄下,其中 containers 目錄存放容器信息,
image 目錄存放鏡像信息,overlay2 目錄下存放具體的鏡像底層文件。
一個鏡像若有多個標簽,刪除時,只是刪除標簽。只有一個標簽,則刪除的是鏡像本身。
如果鏡像已經被容器使用,要先停容器,再刪除容器,最后再刪除鏡像
查看下載的鏡像文件信息
cat /var/lib/docker/image/overlay2/repositories.json
查看下載到本地的所有鏡像
docker images
REPOSITORY ??TAG ??????IMAGE ID ??????CREATED ?????SIZE
nginx ???????latest ???ae2feff98a0c ??9 days ago ??133MB
REPOSITORY:鏡像屬于的倉庫;
TAG:鏡像的標簽信息,標記同一個倉庫中的不同鏡像;
IMAGE ID:鏡像的唯一ID 號,唯一標識一個鏡像;
CREATED:鏡像創建時間;
VIRTUAL SIZE:鏡像大小;
根據鏡像的唯一標識 ID 號,獲取鏡像詳細信息
格式:docker inspect 鏡像ID號
docker inspect ae2feff98a0c
OverlayFS(Overlay File System)是一種聯合文件系統,常用于 Docker 等容器技術中。
它允許將多個文件系統層疊在一起,以創建一個統一的文件系統視圖。
在 OverlayFS 中,有幾個重要的概念:LowerDir、UpperDir、MergedDir 和 WorkDir。
4、為本地的鏡像添加新的標簽
格式:docker tag 名稱:[標簽] 新名稱:[新標簽]
docker tag nginx:latest nginx:web
docker images | grep nginx
5、刪除鏡像
格式:
docker rmi 倉庫名稱:標簽 #當一個鏡像有多個標簽時,只是刪除其中指定的標簽
或者
docker rmi 鏡像ID號 #會徹底刪除該鏡像
注意:如果該鏡像已經被容器使用,正確的做法是先刪除依賴該鏡像的所有容器,再去刪除鏡像。
docker rmi nginx:web
6、存出鏡像:將鏡像保存成為本地文件
格式:docker save -o 存儲文件名 存儲的鏡像
docker save -o nginx nginx:latest #存出鏡像命名為nginx存在當前目錄下
docker save -o /opt/nginx.tar nginx:latest ?#指定路勁保存docker的鏡像。
ls -lh
7、載入鏡像:將鏡像文件導入到鏡像庫中
格式:
docker load < 存出的文件
或者
docker load -i 存出的文件
docker load -i /opt/nginx.tar
8、上傳鏡像:到docker Hub官方公共倉庫中
默認上傳到 docker Hub 官方公共倉庫,需要注冊使用公共倉庫的賬號。https://hub.docker.com
可以使用 docker login 命令來輸入用戶名、密碼和郵箱來完成注冊和登錄。
在上傳鏡像之前,還需要先對本地鏡像添加新的標簽,然后再使用 docker push 命令進行上傳。
docker tag nginx:latest koedaa/nginx:web #添加新的標簽時必須在前面加上自己的dockerhub的username
docker login #登錄docker hub倉庫
Username:koedaa
password:ecydhrk123
docker push koedaa/nginx:web #上傳鏡像
四、Docker 容器操作
1、容器創建:
就是將鏡像加載到容器的過程。
新創建的容器默認處于停止狀態,不運行任何程序,需要在其中發起一個進程來啟動容器。
格式:docker create [選項] 鏡像
常用選項:
-i:讓容器開啟標準輸入接受用戶輸入命令
-t:讓 Docker 分配一個偽終端 tty
-it :合起來實現和容器交互的作用,運行一個交互式會話 shell
docker create -it nginx:latest /bin/bash
2、查看容器的運行狀態
docker ps 查看正在運行的容器
docker ps -a 查看所有容器,包括運行和沒有運行的
3、啟動容器
格式:docker start 容器的ID/名稱
docker start 8b0a7be0ff58
docker ps -a
4、創建并啟動容器
可以直接執行 docker run?命令, 等同于先執行 docker create 命令,再執行 docker start 命令。
注意:容器是一個與其中運行的 shell 命令/進程共存亡的終端,命令/進程運行容器運行, 命令/進程結束容器退出。
docker 容器默認會把容器內部第一個進程,也就是 pid=1 的程序作為docker容器是否正在運行的依據,
如果docker容器中 pid = 1 的進程掛了,那么docker容器便會直接退出,也就是說Docker容器中必須有一個前臺進程,否則認為容器已經掛掉。
當利用 docker run 來創建容器時, Docker 在后臺的標準運行過程是:
(1)檢查本地是否存在指定的鏡像。當鏡像不存在時,會從公有倉庫下載;
(2)利用鏡像創建并啟動一個容器;
(3)分配一個文件系統給容器,在只讀的鏡像層外面掛載一層可讀寫層;
(4)從宿主主機配置的網橋接口中橋接一個虛擬機接口到容器中;
(5)分配一個地址池中的 IP 地址給容器;
(6)執行用戶指定的應用程序,執行完畢后容器被終止運行。
docker run centos:7 /usr/bin/bash -c ls /
docker ps -a #會發現創建了一個新容器并啟動執行一條 shell 命令,之后就停止了
5、在后臺持續運行 docker run 創建的容器
需要在 docker run 命令之后添加 -d 選項讓 Docker 容器以守護形式在后臺運行。并且容器所運行的程序不能結束。
docker run -itd --name test1 centos:7 /bin/bash ??#創建容器并持續運行容器
-d:可以讓創建的容器以守護進程在后臺運行,容器所運行的程序不會結束
docker run -itd --name test1 nginx:1.22.0 /bin/bash
1、沒有鏡像能不能直接run
2、運行的程序是什么。
1、沒有鏡像可以自動拉去
2、-d 結合,給容器持續運行的命令,后臺沒有指令,容器沒有可運行的程序,將會直接退出
-it 形成交互式會話
d 后臺運行 /bin/bash
--name 給容器命名
nginx:1.22.0:鏡像名稱和標簽,如果本地沒有。可以自動下載
6、終止容器運行
格式:docker stop 容器的ID/名稱
docker stop 2592d3fad0fb
docker ps -a
7、容器的進入
需要進入容器進行命令操作時,可以使用 docker exec 命令進入運行著的容器。
格式:docker exec -it 容器ID/名稱 /bin/bash
-i 選項表示讓容器的輸入保持打開;
-t 選項表示讓 Docker 分配一個偽終端。
docker start 2592d3fad0fb #進入容器前,確保容器正在運行
docker exec -it 2592d3fad0fb /bin/bash
ls
exit #退出容器后,容器仍在運行
docker ps -a
docker run -it centos:7 bash ?????#不加 -d 選項會創建容器后直接進入容器進行交互,但是退出容器,容器也會停止
8、復制到容器中
echo abc123 > ~/test.txt
docker cp ~/test.txt 2592d3fad0fb:/opt/
docker exec -it test1 /bin/bash
9、從容器復制文件到主機
docker cp 2592d3fad0fb:/opt/test.txt ~/abc123.txt
10、容器的導出與導入
用戶可以將任何一個 Docker 容器從一臺機器遷移到另一臺機器。在遷移過程中,可以使用docker export 命令將已經創建好的容器導出為容器快照文件,無論這個容器是處于運行狀態還是停止狀態均可導出。可將導出文件傳輸到其他機器,通過相應的導入命令實現容器的遷移。
導出格式:docker export 容器ID/名稱 > 文件名
docker export 2592d3fad0fb > centos7.tar
docker export -o centos7.tar 2592d3fad0fb
導入格式:cat 文件名 | docker import – 鏡像名稱:標簽
cat centos7.tar | docker import - centos7:test #導入后會生成鏡像,但不會創建容器
docker import centos7.tar -- centos7:test
導入鏡像標簽名不能和已有的一樣,要做區分
導入的容器還是一個鏡像,必須要run或者create才能成為容器
已經配置好的導入的容器鏡像,可以直接使用(我們都是用的開發已經設置,配置好的容器鏡像)
docker的特性:即使在創建過程中報錯,容器還是會被創建,但是這個容器不可用
導入鏡像或者容器鏡像,如果和已有標簽重復,導入鏡像或者容器鏡像,tag這一項就會變成none
11、刪除容器
格式:docker rm [-f] 容器ID/名稱
docker stop 2592d3fad0fb
docker rm 2592d3fad0fb #刪除已經終止狀態的容器
docker rm -f 2592d3fad0fb #強制刪除正在運行的容器
docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash #批量停止容器
docker ps -a | awk 'NR>=2{print $1}'| xargs docker stop
docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash #批量刪除所有容器
docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm
docker images | awk 'NR>=2{print "docker rmi "$3}' | bash #批量刪除鏡像
docker images | grep none | awk '{print $3}' | xargs docker rmi #刪除none鏡像
docker rm $(docker ps -a -q) #批量清理后臺停止的容器
五、總結:
docker:輕量級的虛擬機,宿主機是Linux
docker的核心:
鏡像:有鏡像才有容器
容器
倉庫
docker命令:
docker search 搜索
docker pull nginx:1.22.0 獲取鏡像
docker images 查看系統中鏡像
docker rmi -f 強制刪除鏡像(刪除了正在運行的鏡像,對容器會有影響?)
docker tag nginx:1.22.0(在鏡像中已有的標簽) nginx:test(給他新的標簽),標簽相當于硬連接,復制了源鏡像
docker save -o /opt/nginx.tar(一般用xxx.tar格式) nginx:1.22.0(這個鏡像要已存在)
docker load -i xxx.tar 導入鏡像
docker push koedaa/nginx:test
koedaa:dockerhup的用戶名 后接的是鏡像名稱和標簽
docker容器:容器都是基于鏡像創建的
-itd:表示后臺運行指定程序,而且創建一個交互式的shell,用戶可以輸出操作命令
docker run -itd --name test1?nginx:1.22.0 /bin/bash
如果容器中沒有可執行命令/bin/bash,容器創建完成之后會立即退出
docker exec -it 容器名/容器id
docker ps 只顯示正在運行的容器
docker ps -a 顯示所有容器,包括沒有運行的容器
docker export -o test.tar 容器名/容器id 如何導出容器
docker import test.tar --nginx:test2(盡量不要重復標簽名,會變none)
導入導出容器配置文件:
docker cp 容器名/容器id:/etc/nginx/nginx.conf /opt/
docker cp /opt/nginx.conf 容器名/容器id:/etc/nginx/
docker rm 刪除容器
正在運行的容器:
docker rm -f 強制刪除
docker stop 先關閉
docker rm 再刪除