一:docker概述
因為 Docker 輕便、快速的特性,可以使應用達到快速迭代的目的。每次小的變更,馬上就可以看到效果,而不用將若干個小變更積攢到一定程度再變更。每次變更一小部分其實是一種非常安全的方式,在開發環境中能夠快速提高工作效率。
Docker容器能夠幫助開發人員、系統管理員、質量管理和版本控制工程師在一個生產環節中一起協同工作。制定一套容器標準能夠使系統管理員更改容器的時候,程序員不需要關心容器的變化,而更專注自己的應用程序代碼。從而隔離開了開發和管理,簡化了開發和部署的成本。
1.什么是Docker
如果要方便的創建運行在云平臺上的應用,必須要脫離底層的硬件,同時還需要任何時間地點可獲取這些資源,這正是 Docker 所能提供的。Docker 的容器技術可以在一臺主機上輕松為任何應用創建一個輕量級的、可移植的、自給自足的容器。通過這種容器打包應用程序,意味著簡化了重新部署、調試這些瑣碎的重復工作,極大的提高了工作效率。
docker 是目前較為主流的容器技術。容器技術是一種輕量級的虛擬化技術,它可以讓應用程序及其依賴項打包在一個獨立的單元中運行,從而實現應用的隔離、可移植性和資源的高效利用。以下從概念、原理、與傳統虛擬化技術的對比、優勢、應用場景等方面詳細介紹容器技術。
容器就像是一個獨立的“盒子”,這個“盒子”里裝著運行某個應用所需要的所有東西,包括代碼、運行時環境、系統工具、系統庫等。不同的容器之間相互隔離,每個容器都有自己獨立的文件系統、進程空間、網絡接口等,就好像它們是在不同的機器上運行一樣,但實際上它們是共享宿主機的操作系統內核。
2:Docker 的優勢
Docker 容器運行速度很快,啟動和停止可以在秒級實現,比傳統虛擬機要快很多;Docker 核心解決的問題是利用容器來實現類似虛擬機的功能,從而利用更加節省的硬件資源提供給用戶更多的計算資源因此,Docker 容器除了運行其中的應用之外,基本不消耗額外的系統資源,在保證應用性能的同時,又減小了系統開銷,使得一臺主機上同時運行數千個Docker 容器成為可能。
傳統虛擬化技術(如 Vware、VirtualBox 等)是通過虛擬機管理程序(Hypervisor)在物理服務器上創建多個虛擬機(V),每個虛擬機都包含完整的操作系統。而容器技術是在操作系統層面進行虛擬化,多個容器共享宿主機的操作系統內核。
容器技術和傳統虛擬化的主要區別在于:
資源占用:傳統虛擬機需要為每個虛擬機分配獨立的操作系統,這會占用大量的系統資源》而容器共享宿主機的內核,只包含應用及其依賴項,資源占用相對較少,啟動速度也更快
隔離性:虛擬機提供了更高程度的隔離,因為每個虛擬機都有自己獨立的操作系統;容器的隔離性相對較弱,但對于大多數應用場景來說已經足夠,并且可以通過合理的配置和管理來增強隔離性。
性能:由于虛擬機存在額外的虛擬化層,會帶來一定的性能開銷;容器直接運行在宿主機的內核上,性能損耗較小,更接近原生應用的性能
Docker 操作方便,可以通過 Dockerfile 配置文件支持靈活的自動化創建和部署。表1將 Docker容器技術與傳統虛擬機的特性進行了比較。
特性 | docker容器 | 虛擬機 |
啟動速度 | 秒級 | 分鐘級 |
計算能力損耗 | 幾乎無 | 損耗50%左右 |
性能 | 接近原生 | 弱于 |
系統支持量(單機) | 上千個 | 幾十個 |
隔離性 | 資源限制 | 完全隔離 |
容器技術的優勢主要體現在以下幾個方面:
隔離性:不同的容器之間相互隔離,一個容器的故障或異常不會影響其他容器的運行,提高
了應用的穩定性和安全性。
可移植性:容器將應用及其依賴項打包成一個獨立的單元,使得應用可以在不同的環境中(如開發環境、測試環境、生產環境)無縫遷移和運行,避免了“在我的機器上能運行,但在你的機器上不行” 的問題。
資源高效利用:容器共享宿主機的操作系統內核,不需要為每個應用運行獨立的操作系統,大大減少了資源的浪費,提高了服務器的利用率。
快速部署和擴展:容器的啟動速度非常快,通常只需要幾秒鐘,而且可以根據需要快速創建和銷毀容器,方便進行應用的快速部署和彈性擴展。
Docker之所以擁有眾多優勢,與操作系統虛擬化自身的特點是分不開的。傳統虛擬機需要有額外的虛擬機管理程序和虛擬機操作系統層,而 Docker 容器則是直接在操作系統層面之上實現的虛擬化。圖 2是 Docker 與傳統虛擬機架構。
3:docker的應用場景
開發環境管理:開發人員可以使用容器來創建一致的開發環境,確保團隊成員之間的環境一致性,提高開發效率。
持續集成和持續部署(CI/CD):在CI/CD流程中,容器可以幫助實現應用的快速打包、測試和部署,實現自動化的軟件開發流程。
微服務架構:容器技術非常適合微服務架構,每個微服務可以打包成一個獨立的容器,獨立開發、測試和部署,提高系統的可伸縮性和容錯性。
云計算:云服務提供商可以利用容器技術為用戶提供更高效、靈活的計算資源,用戶可以根據自己的需求快速創建和管理容器化的應用。
4:Docker 核心概念
(1)鏡像
鏡像、容器、倉庫是 Docker 的三大核心概念。其中 Docker 的鏡像是創建容器的基礎,類似虛擬機的快照,可以理解為一個面向 Docker 容器引擎的只讀模板。例如:一個鏡像可以是一個完整的 cent05 操作系統環境,稱為一個 centos 鏡像;也可以是一個安裝了 MySQL 的應用程序,稱之為一個 MySQL鏡像等等。
Docker 提供了簡單的機制來創建和更新現有的鏡像,用戶也可以從網上下載已經創建好的鏡像直接使用。
(2)容器
Docker 的容器是從鏡像創建的運行實例,它可以被啟動、停止和刪除。所創建的每一個容器都是相互隔離、互不可見,以保證安全性的平臺。可以將容器看作是一個簡易版的 Linux 環境,Docker 利用容器來運行和隔離應用。
(3)倉庫
Docker 倉庫是用來集中保存鏡像的地方,當創建了自己的鏡像之后,可以使用 push 命令將它上傳到公有倉庫(Public)或者私有倉庫(Private)。當下次要在另外一臺機器上使用這個鏡像時,只需從倉庫獲取。
倉庫注冊服務器(Registry)是存放倉庫的地方,其中包含了多個倉庫。每個倉庫集中存放某一類鏡像,并且使用不同的標簽(tag)來區分它們。目前最大的公共倉庫是 docker Hub,存放了數量龐大的鏡像供用戶下載使用。
二:docker安裝
Docker 支持在主流的操作系統平臺上進行使用,包括 windows 系統、Linux 系統、以及 Macos 系統等。目前最新的 RHEL、Centos 以及 ubuntu 系統官方軟件源中都已經默認自帶了 Docker 包,可直接安裝使用,也可以用 Docker 自己的 YUM 源進行配置。
Centos 系統下安裝 Docker 可以有兩種方式:一種是使用 CURL 獲得 Docker 的安裝腳本進行安裝,另一種是使用 YUM 倉庫來安裝 Docker。注意:目前 Docker 只能支持 64 位系統。
1.本安裝方式使用阿里的軟件倉庫
(1)關閉系統防火墻
systemctl stop firewalld
setenforce 0
(2)下載docker的repo文件
cd /etc/yum.repos.d/
瀏覽器:阿里云鏡像站:容器——docker-ce/linux/centos/docker-ce.repo?? 將文件保存至桌面,再拉取到yum.repos.d目錄下
(3)替換倉庫地址
sed -i 's/$releasever/8/g' docker-ce.repo
sed -i 's/$basearch/x86_64/g' docker-ce.repo
(4)更新索引文件并安裝docker
dnf clean all
dnf makecache
dnf – y install docker-ce
(5)添加國內鏡像站
cd /etc/docker/
vi daemon.json
{
“exec-opts”: [“native.cgroupdriver=systemd”],
“registry-mirrors”: [
"https://docker.m.daocloud.io",
"https://docker.imgdb.de",
"https://docker-0.unsee.tech",
"https://docker.hlmirror.com",
]
}
(6)開啟docker服務
systemctl daemon-reload
systemctl start docker
systemctl enable docker
docker version
(7)優化內核參數
vi /etc/sysctl.conf
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1?????????? //添加
net.bridge.bridge-nf-call-ip6tables=1
sysctl -p
三.docker鏡像操作
1.獲取鏡像
1. 拉取鏡像(pull)
? 命令:docker pull [倉庫名]/[鏡像名]:[標簽]
? 參數:
? 倉庫名:鏡像倉庫地址(如 Docker Hub 的 library 或私有倉庫)。
? 鏡像名:鏡像名稱(如 nginx、python)。
? 標簽:鏡像版本(如 latest、3.9),默認拉取 latest。
2. 查看本地鏡像(images)
? 命令:docker images
? 參數:
? -q:僅顯示鏡像 ID。
? --filter:按條件篩選(如 dangling=true 查看無標簽鏡像)。
3. 創建鏡像(build)
? 命令:docker build -t [鏡像名:標簽] [Dockerfile路徑]
? 參數:
? -t:指定鏡像名稱和標簽。
? --build-arg:傳遞構建時變量(如 --build-arg HTTP_PROXY=xxx)。
? -f:指定 Dockerfile 路徑(默認當前目錄)。
4. 推送鏡像(push)
? 命令:docker push [倉庫名]/[鏡像名]:[標簽]
? 參數:同拉取鏡像,需先登錄倉庫(docker login)。
5. 刪除鏡像(rmi)
? 命令:docker rmi [鏡像ID/名稱:標簽]
? 參數:
? -f:強制刪除(即使有容器依賴)。
? 批量刪除:docker rmi $(docker images -q -f dangling=true)(刪除無依賴鏡像)。
四.容器(Container)操作
1. 運行容器(run)
? 命令:docker run [參數] [鏡像名:標簽] [命令]
? 核心參數:
? -d:后臺運行(守護進程模式)。
? -p:端口映射(如 -p 8080:80,主機端口:容器端口)。
? -v:掛載目錄(如 -v /主機路徑:/容器路徑)。
? -e:設置環境變量(如 -e MYSQL_ROOT_PASSWORD=123)。
? --name:指定容器名稱。
? --rm:容器退出后自動刪除。
? --network:指定網絡模式(如 bridge、host)。
2. 查看容器(ps)
? 命令:docker ps [參數]
? 參數:
? -a:顯示所有容器(包括已停止的)。
? -q:僅顯示容器 ID。
? -l:顯示最近創建的容器。
3. 啟動/停止容器(start/stop)
? 命令:
? 啟動:docker start [容器ID/名稱]
? 停止:docker stop [容器ID/名稱]
? 參數:
? stop 默等待 10 秒,-t 可指定超時時間(如 -t 30)。
4. 進入容器(exec/attach)
? 命令:
? docker exec -it [容器ID/名稱] /bin/bash(推薦,不中斷容器進程)
? docker attach [容器ID/名稱](直接連接 stdin/out,中斷可能停止容器)
? 參數:
? -i:保持標準輸入打開。
? -t:分配偽終端。
5. 刪除容器(rm)
? 命令:docker rm [容器ID/名稱]
? 參數:
? -f:強制刪除(即使正在運行)。
? 批量刪除:docker rm $(docker ps -aq -f status=exited)(刪除已退出容器)。
6. 查看容器日志(logs)
? 命令:docker logs [容器ID/名稱]
? 參數:
? -f:實時跟蹤日志(類似 tail -f)。
? --tail:顯示最近 N 行日志(如 --tail 100)。
三、常用組合操作
? 創建并運行容器:
docker run -d --name nginx -p 80:80 nginx(后臺運行 Nginx,映射 80 端口)。
? 基于容器創建鏡像:
docker commit [容器ID] [新鏡像名:標簽](慎用,推薦通過 Dockerfile 構建)