一、Docker 概述
1、Docker的概念
• Docker是一個開源的應用容器引擎,基於go語言開發並遵循了apache2.0協議開源
• Docker是在Linux容器里運行應用的開源工具,是一種輕量級的“虛擬機”
• Docker 的容器技術可以在一台主機上輕松為任何應用創建一個輕量級的、可移植的、自給自足的容器
Docker的Logo設計為藍色鯨魚,拖着許多集裝箱
鯨魚可看作為宿主機,集裝箱可理解為相互隔離的容器,每個集裝箱中都包含自己的應用程序
Docker的設計宗旨:Build,Ship and Run Any App,Anywhere,
即通過對應用組件的封裝、發布、部署、運行等生命周期的管理,達到應用組件級別的“一次封裝,到處運行”的目的。這里的組件,既可以是一個應用,也可以是一套服務,甚至是一個完整的操作系統
2、容器的優點
容器化越來越受歡迎,因為容器是:
- 靈活:即使是最復雜的應用也可以集裝箱化。
- 輕量級:容器利用並共享主機內核。
- 可互換:可以即時部署更新和升級。
- 便攜式:可以在本地構建,部署到雲,並在任何地方運行。
- 可擴展:可以增加並自動分發容器副本。
- 可堆疊:可以垂直和即時堆疊服務。
3、容器與虛擬機的區別
容器是在linux上本機運行,並與其他容器共享主機的內核,它運行的是一個獨立的進程,不占用其他任何可執行文件的內存,非常輕量。
虛擬機運行的是一個完成的操作系統,通過虛擬機管理程序對主機資源進行虛擬訪問,相比之下需要的資源更多。
| 特性 | Docker容器 | 虛擬機 |
|---|---|---|
| 啟動速度 | 秒級 | 分鍾級 |
| 計算能力損耗 | 幾乎無 | 損耗 50%左右 |
| 性能 | 接近原生 | 弱於 |
| 系統支持量(單機) | 上千個 | 幾十個 |
| 隔離性 | 資源隔離/限制 | 完全隔離 |
4、容器在內核中支持2種重要技術
docker本質就是宿主機的一個進程,docker是通過namespace實現資源隔離,通過cgroup實現資源限制,通過寫時復制技術(copy-on-write)實現了高效的文件操作(類似虛擬機的磁盤比如分配500g並不是實際占用物理磁盤500g)。
5、Docker核心概念
1)鏡像
Docker的鏡像是創建容器的基礎,類似虛擬機的快照,可以理解為一個面向 Docker 容器引擎的只讀模板。
通過鏡像啟動一個容器,一個鏡像是一個可執行的包,其中包括運行應用程序所需要的所有內容包含代碼,運行時間,庫、環境變量、和配置文件。
2)容器
Docker的容器是從鏡像創建的運行實例,它可以被啟動、停止和刪除。所創建的每一個容器都是相互隔離、互不可見,以保證平台的安全性。
可以把容器看做是要給簡易版的linux環境(包括root用戶權限、鏡像空間、用戶空間和網絡空間等)和運行在其中的應用程序。
3)倉庫
Docker倉庫是用來集中保存鏡像的地方,當創建了自己的鏡像之后,可以使用push命令將它上傳到公有倉庫(Public)或者私有倉庫(Private)。當下次要在另外一台機器上使用這個鏡像時,只需從倉庫獲取。
Docker 的鏡像、容器、日志等內容全部都默認存儲在 /var/lib/docker 目錄下。
二、Docker的安裝
1、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
systemctl start docker.service
systemctl enable docker.service
#查看 docker 版本信息
docker version
2、實例操作:安裝docker
2.1 關閉防火牆

2.2 安裝依賴包

2.3 設置阿里雲鏡像源並安裝 Docker-CE並設置為開機自動啟動(使用在線源安裝)


2.4 查看 docker 版本信息

三、Docker 鏡像操作
1、搜索鏡像
格式:docker search 關鍵字 docker search nginx
2、獲取鏡像
格式:docker pull 倉庫名稱[:標簽] #如果下載鏡像時不指定標簽,則默認會下載倉庫中最新版本的鏡像,即選擇標簽為 latest 標簽。 docker pull nginx
3、鏡像加速下載
瀏覽器訪問 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 獲取鏡像加速器配置
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://1fam3t0i.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

4、查看鏡像信息
鏡像下載后存放在 /var/lib/docker
4.1 查看下載的鏡像文件信息
cat /var/lib/docker/image/overlay2/repositories.json
4.2 查看下載到本地的所有鏡像
docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest ae2feff98a0c 9 days ago 133MB -------------------------------------------------------------------------------------------- REPOSITORY:鏡像屬於的倉庫; TAG:鏡像的標簽信息,標記同一個倉庫中的不同鏡像; IMAGE ID:鏡像的唯一ID 號,唯一標識一個鏡像; CREATED:鏡像創建時間; VIRTUAL SIZE:鏡像大小; ---------------------------------------------------------------------------------------
5、根據鏡像的唯一標識 ID 號,獲取鏡像詳細信息
格式:docker inspect 鏡像ID號 docker inspect ae2feff98a0c
6、為本地的鏡像添加新的標簽
格式:docker tag 名稱:[標簽] 新名稱:[新標簽] docker tag nginx:latest nginx:web docker images | grep nginx
7、刪除鏡像
格式: docker rmi 倉庫名稱:標簽 #當一個鏡像有多個標簽時,只是刪除其中指定的標簽 或者 docker rmi 鏡像ID號 #會徹底刪除該鏡像 注意:如果該鏡像已經被容器使用,正確的做法是先刪除依賴該鏡像的所有容器,再去刪除鏡像。 docker rmi nginx:web
8、存出鏡像:將鏡像保存成為本地文件
格式:docker save -o 存儲文件名 存儲的鏡像 docker save -o nginx nginx:latest #存出鏡像命名為nginx存在當前目錄下 ls -lh
9、載入鏡像:將鏡像文件導入到鏡像庫中
格式: docker load < 存出的文件 或者 docker load -i 存出的文件 docker load < nginx
10、上傳鏡像
默認上傳到 docker Hub 官方公共倉庫,需要注冊使用公共倉庫的賬號。https://hub.docker.com
可以使用 docker login 命令來輸入用戶名、密碼和郵箱來完成注冊和登錄。
在上傳鏡像之前,還需要先對本地鏡像添加新的標簽,然后再使用 docker push 命令進行上傳。
docker tag nginx:web ly08/nginx:web #添加新的標簽 docker login #登錄公共倉庫 Username: password: docker push ly08/nginx:web #上傳鏡像


四、Docker 容器操作
1、容器創建:就是將鏡像加載到容器的過程
新創建的容器默認處於停止狀態,不運行任何程序,需要在其中發起一個進程來啟動容器
docker create命令能夠基於鏡像創建容器。
該命令執行的效果類似於docker run -d,即創建一個將在系統后台運行的容器。
但是與docker run -d不同的是,docker create創建的容器並未實際啟動,還需要執行docker start命令或docker run命令以啟動容器。
事實上,docker create命令常用於在啟動容器之前進行必要的設置。
格式:docker create [選項] 鏡像 常用選項: -i:讓容器的輸入保持打開 -t:讓 Docker 分配一個偽終端 docker create -it nginx:latest /bin/bash
注釋:
-it就等於-i和-t,這兩個參數的作用是,為該docker創建一個偽終端,這樣就可以進入到容器的交互模式(也就是直接進入到容器里面)
后面的/bin/bash的作用是表示載入容器后運行bash ,docker中必須要保持一個進程的運行,要不然整個容器啟動后就會馬上kill itself,這個/bin/bash就表示啟動容器后啟動bash
2、查看容器的運行狀態
docker ps -a #-a 選項可以顯示所有的容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8b0a7be0ff58 nginx:latest "/docker-entrypoint.…" 57 seconds ago Created inspiring_swanson 容器的ID號 加載的鏡像 運行的程序 創建時間 當前的狀態 端口映射 名稱
3、啟動容器
格式:docker start 容器的ID/名稱 docker start 8b0a7be0ff58 docker ps -a
4、創建並啟動容器
可以直接執行 docker run 命令, 等同於先執行 docker create 命令,再執行 docker start 命令。
注意:容器是一個與其中運行的 shell 命令共存亡的終端,命令運行容器運行, 命令結束容器退出。
當利用 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 -d centos:7 /usr/bin/bash -c "while true;do echo hello;done" docker ps -a #可以看出容器始終處於 UP,運行狀態 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2592d3fad0fb centos:7 "/usr/bin/bash -c 'w…" 2 seconds ago Up 2 seconds peaceful_chatelet docker run -itd --name test1 centos:7 /bin/bash #給容器重命名,並以守護形式在后台運行
6、終止容器運行
格式: docker stop/kill 容器ID/名稱
stop: 停止容器,可以給容器一個等待時間,以防止數據的丟失。
kill: 立即強行停止一個容器(相當於linux命令 kill -9) ,不會給容器反應時間,可能會造成數據丟失
格式: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
8 、從宿主機上將文件導入到容器中
docker ps -a #先獲取需要導入到的容器ID,然后重新開一個終端 另一個終端上操作 echo "this is test file" >> 123.txt #創建測試文件 docker cp 123.txt cef59022a4dd:/opt #將測試文件導入到容器內后到容器內的/opt目錄下查看

9、容器的導出與導入
用戶可以將任何一個 Docker 容器從一台機器遷移到另一台機器。在遷移過程中,可以使用docker export 命令將已經創建好的容器導出為文件,無論這個容器是處於運行狀態還是停止狀態均可導出。可將導出文件傳輸到其他機器,通過相應的導入命令實現容器的遷移。
#導出格式:docker export 容器ID/名稱 > 文件名 docker export 2592d3fad0fb > centos7.tar #導入格式:cat 文件名 | docker import – 鏡像名稱:標簽 cat centos7.tar | docker import - centos7:test #導入后會生成鏡像,但不會創建容器

10、刪除容器
格式: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 "docker rm "$1}' | bash #批量刪除所有容器
docker images | awk 'NR>=2{print "docker rmi "$3}' | bash #批量刪除鏡像
10.1 刪除容器和強制刪除容器


10.2 批量停止和刪除容器



