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

注:使用在線源安裝



四.Docker 鏡像操作
#搜索鏡像
格式:docker search 關鍵字
docker search nginx
#獲取鏡像
格式:docker pull 倉庫名稱[:標簽]
#如果下載鏡像時不指定標簽,則默認會下載倉庫中最新版本的鏡像,即選擇標簽為 latest 標簽,
docker pull nginx
#鏡像加速下載
瀏覽器訪問 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 獲取鏡像加速器配置
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
#查看鏡像資訊
鏡像下載后存放在 /var/lib/docker
#查看下載的鏡像檔案資訊
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
#為本地的鏡像添加新的標簽
格式:docker tag 名稱:[標簽] 新名稱:[新標簽]
docker tag nginx:latest nginx:web
docker images | grep nginx
#洗掉鏡像
格式:
docker rmi 倉庫名稱:標簽 #當一個鏡像有多個標簽時,只是洗掉其中指定的標簽
或者
docker rmi 鏡像ID號 #會徹底洗掉該鏡像
注意:如果該鏡像已經被容器使用,正確的做法是先洗掉依賴該鏡像的所有容器,再去洗掉鏡像,
docker rmi nginx:web
#存出鏡像:將鏡像保存成為本地檔案
格式:docker save -o 存盤檔案名 存盤的鏡像
docker save -o nginx nginx:latest #存出鏡像命名為nginx存在當前目錄下
ls -lh
#載入鏡像:將鏡像檔案匯入到鏡像庫中
格式:
docker load < 存出的檔案
或者
docker load -i 存出的檔案
docker load < nginx
#上傳鏡像
默認上傳到 docker Hub 官方公共倉庫,需要注冊使用公共倉庫的賬號,https://hub.docker.com
可以使用 docker login 命令來輸入用戶名、密碼和郵箱來完成注冊和登錄,
在上傳鏡像之前,還需要先對本地鏡像添加新的標簽,然后再使用 docker push 命令進行上傳,
docker tag nginx:latest nginx:web #添加新的標簽
docker login #登錄公共倉庫
Username:
password:
docker push wl/nginx:web #上傳鏡像



注:此步驟 往往也是排查鏡像問題的良方



五.Docker 容器操作
#容器創建:就是將鏡像加載到容器的程序,
新創建的容器默認處于停止狀態,不運行任何程式,需要在其中發起一個行程來啟動容器,
格式:docker create [選項] 鏡像
常用選項:
-i:讓容器的輸入保持打開
-t:讓 Docker 分配一個偽終端
docker create -it nginx:latest /bin/bash
#查看容器的運行狀態
docker ps -a #-a 選項可以顯示所有的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8b0a7be0ff58 nginx:latest "/docker-entrypoint.…" 57 seconds ago Created inspiring_swanson
容器的ID號 加載的鏡像 運行的程式 創建時間 當前的狀態 埠映射 名稱
#啟動容器
格式:docker start 容器的ID/名稱
docker start 8b0a7be0ff58
docker ps -a
#創建并啟動容器
可以直接執行 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 命令,之后就停止了
#在后臺持續運行 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
#終止容器運行
格式:docker stop 容器的ID/名稱
docker stop 2592d3fad0fb
docker ps -a
#容器的進入
需要進入容器進行命令操作時,可以使用 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 容器從一臺機器遷移到另一臺機器,在遷移程序中,可以使用docker export 命令將已經創建好的容器匯出為檔案,無論這個容器是處于運行狀態還是停止狀態均可匯出,可將匯出檔案傳輸到其他機器,通過相應的匯入命令實作容器的遷移,
#匯出格式:docker export 容器ID/名稱 > 檔案名
docker export 2592d3fad0fb > centos7tar
#匯入格式:cat 檔案名 | docker import – 鏡像名稱:標簽
cat centos7tar | docker import - centos7:test #匯入后會生成鏡像,但不會創建容器
#洗掉容器
格式: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 #批量洗掉鏡像








轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/289961.html
標籤:其他
