Docker與docker-compose完整部署指南:從安裝到實(shí)戰(zhàn))
1. 項(xiàng)目概述為什么要在Ubuntu上部署Docker生態(tài)如果你是一名開發(fā)者、運(yùn)維工程師或者正在學(xué)習(xí)云原生和微服務(wù)那么Docker幾乎是你繞不開的技術(shù)。它通過(guò)容器化技術(shù)將應(yīng)用及其所有依賴打包成一個(gè)標(biāo)準(zhǔn)化的單元實(shí)現(xiàn)了“一次構(gòu)建處處運(yùn)行”的夢(mèng)想。而Ubuntu作為最流行、社區(qū)支持最完善的Linux發(fā)行版之一自然成為了運(yùn)行Docker的首選平臺(tái)。今天要聊的就是在Ubuntu系統(tǒng)上從零開始完整部署Docker引擎及其黃金搭檔docker-compose的全過(guò)程。這不僅僅是一個(gè)安裝教程。我會(huì)帶你理解每一個(gè)命令背后的邏輯解釋不同安裝方式的選擇并分享我在生產(chǎn)環(huán)境和開發(fā)環(huán)境中反復(fù)折騰后總結(jié)出的實(shí)戰(zhàn)經(jīng)驗(yàn)與避坑指南。無(wú)論你是剛接觸Linux的新手還是想優(yōu)化現(xiàn)有部署流程的老手這篇詳盡的指南都能讓你在Ubuntu上搭建一個(gè)穩(wěn)定、高效的Docker工作環(huán)境避免那些令人頭疼的兼容性問(wèn)題和權(quán)限錯(cuò)誤。2. 核心思路與方案選型官方倉(cāng)庫(kù) vs 便捷腳本在Ubuntu上安裝Docker主流方法有兩種使用Docker官方提供的便捷安裝腳本或者通過(guò)添加Docker的APT軟件源來(lái)安裝。這兩種方式各有優(yōu)劣選擇哪一種取決于你的具體場(chǎng)景和對(duì)系統(tǒng)的控制需求。2.1 官方APT源安裝可控性與穩(wěn)定性的首選這是我個(gè)人最推薦也是生產(chǎn)環(huán)境部署的標(biāo)準(zhǔn)做法。它的核心思路是將Docker官方的軟件倉(cāng)庫(kù)地址添加到Ubuntu系統(tǒng)的APT源列表中然后像安裝其他系統(tǒng)軟件一樣通過(guò)apt命令進(jìn)行安裝和管理。為什么選擇這種方式版本可控你可以明確指定安裝Docker的版本例如docker-ce5:20.10.13~3-0~ubuntu-focal這對(duì)于需要環(huán)境一致性的CI/CD流水線或生產(chǎn)集群至關(guān)重要。易于升級(jí)與管理安裝后Docker會(huì)被集成到系統(tǒng)的包管理體系中。你可以使用apt update和apt upgrade來(lái)安全地更新Docker系統(tǒng)會(huì)處理好依賴關(guān)系。官方支持直接從Docker官方倉(cāng)庫(kù)獲取軟件包保證了組件的完整性和安全性后續(xù)獲取安全補(bǔ)丁也最直接??勺匪菟胁僮鞫际敲鞔_的命令行便于寫入自動(dòng)化腳本Ansible, Shell等和審計(jì)。當(dāng)然這種方式步驟稍多需要手動(dòng)添加倉(cāng)庫(kù)和GPG密鑰但對(duì)于追求穩(wěn)定和長(zhǎng)期維護(hù)的系統(tǒng)來(lái)說(shuō)多花的這幾分鐘是完全值得的。2.2 便捷安裝腳本快速體驗(yàn)與一次性環(huán)境Docker官方提供了一個(gè)名為get-docker.sh的Shell腳本。只需一行命令curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh腳本就會(huì)自動(dòng)檢測(cè)你的系統(tǒng)并完成所有安裝步驟。它的適用場(chǎng)景是什么快速體驗(yàn)在臨時(shí)測(cè)試機(jī)、學(xué)習(xí)環(huán)境或者快速搭建演示環(huán)境時(shí)它極其方便。不關(guān)心具體版本腳本通常安裝最新的穩(wěn)定版適合緊跟最新特性的場(chǎng)景。為什么不推薦在生產(chǎn)環(huán)境首選它“黑盒”操作腳本自動(dòng)執(zhí)行了大量后臺(tái)操作你無(wú)法精確控制它安裝了哪些組件、配置了什么參數(shù)。一旦出現(xiàn)問(wèn)題排查難度較大。升級(jí)路徑不清晰通過(guò)腳本安裝后如何升級(jí)是再次運(yùn)行腳本還是用包管理器這容易產(chǎn)生混淆??赡芨采w自定義配置腳本可能會(huì)覆蓋你系統(tǒng)中已有的Docker相關(guān)配置。結(jié)論對(duì)于學(xué)習(xí)和測(cè)試腳本很方便但對(duì)于需要嚴(yán)肅對(duì)待的開發(fā)機(jī)或服務(wù)器請(qǐng)務(wù)必使用APT源安裝。本指南將主要圍繞APT源安裝這一更優(yōu)方案展開并涵蓋docker-compose的獨(dú)立安裝。3. 前期準(zhǔn)備與系統(tǒng)檢查在開始安裝之前我們需要為Ubuntu系統(tǒng)做一些準(zhǔn)備工作并檢查一些關(guān)鍵的先決條件這能避免很多后續(xù)的報(bào)錯(cuò)。3.1 更新系統(tǒng)與安裝基礎(chǔ)工具首先確保你的系統(tǒng)軟件包列表是最新的并安裝一些可能用到的工具。sudo apt update sudo apt upgrade -y sudo apt install -y apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release命令解析apt update刷新本地軟件包索引從配置的源服務(wù)器獲取最新的軟件包列表。apt upgrade -y升級(jí)所有可升級(jí)的已安裝軟件包-y參數(shù)表示自動(dòng)確認(rèn)。apt-transport-https允許APT通過(guò)HTTPS協(xié)議下載軟件包Docker倉(cāng)庫(kù)需要它。ca-certificates使系統(tǒng)能夠識(shí)別和信任CA頒發(fā)的SSL證書。curl命令行工具用于從網(wǎng)絡(luò)下載數(shù)據(jù)如下載GPG密鑰。software-properties-common提供add-apt-repository等管理軟件源的工具。gnupg用于加密和數(shù)字簽名的工具這里用于管理APT源的GPG密鑰。lsb-release提供一個(gè)標(biāo)準(zhǔn)命令lsb_release -cs來(lái)獲取系統(tǒng)代號(hào)如focal、jammy方便我們動(dòng)態(tài)添加源。3.2 卸載舊版本Docker如有如果你的系統(tǒng)上存在舊版本或沖突的Docker如docker,docker-engine,docker.io最好先清理它們。sudo apt remove -y docker docker-engine docker.io containerd runc注意docker.io是Ubuntu官方倉(cāng)庫(kù)里一個(gè)較舊的Docker版本與我們即將安裝的docker-ce社區(qū)版沖突必須移除。3.3 驗(yàn)證內(nèi)核與虛擬化支持Docker運(yùn)行依賴于Linux內(nèi)核的特定功能。雖然Ubuntu桌面版通常已滿足但服務(wù)器版或某些最小化安裝可能需要檢查。檢查內(nèi)核版本uname -r建議內(nèi)核版本在3.10以上。Ubuntu 20.04/22.04默認(rèn)內(nèi)核都在5.x完全滿足。檢查cgroups和命名空間支持 這些是容器技術(shù)的基石現(xiàn)代Linux內(nèi)核默認(rèn)啟用。ls /sys/fs/cgroup/如果能看到cpu,memory等目錄說(shuō)明cgroups已掛載。針對(duì)物理機(jī)或虛擬機(jī)檢查虛擬化支持 這對(duì)于運(yùn)行非Linux容器如Windows容器或使用某些加速功能有益但對(duì)于標(biāo)準(zhǔn)的Linux容器不是必須條件。如果你在安裝Docker Desktop for Linux時(shí)遇到“virtualization support not detected”錯(cuò)誤才需要關(guān)注此項(xiàng)。對(duì)于純命令行安裝docker-ce通常無(wú)需此步。# 檢查CPU是否支持虛擬化AMD是svm Intel是vmx grep -E --color (vmx|svm) /proc/cpuinfo有輸出即表示CPU支持。如果是在VMware等虛擬機(jī)里安裝Ubuntu需要在虛擬機(jī)設(shè)置中開啟“虛擬化引擎”相關(guān)選項(xiàng)。4. 安裝Docker引擎docker-ce這是最核心的步驟。我們將采用添加Docker官方APT倉(cāng)庫(kù)的方式。4.1 添加Docker的官方GPG密鑰GPG密鑰用于驗(yàn)證從Docker倉(cāng)庫(kù)下載的軟件包的完整性和真實(shí)性確保軟件包未被篡改。sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod ar /etc/apt/keyrings/docker.gpg操作意圖創(chuàng)建目錄/etc/apt/keyrings并設(shè)置合適權(quán)限。使用curl下載Docker官方的GPG公鑰。使用gpg --dearmor將下載的密鑰轉(zhuǎn)換為APT可識(shí)別的格式。將轉(zhuǎn)換后的密鑰文件保存到指定位置并賦予可讀權(quán)限。4.2 添加Docker的APT軟件源接下來(lái)我們需要告訴APT系統(tǒng)從哪里可以找到Docker的軟件包。echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null命令拆解arch$(dpkg --print-architecture)動(dòng)態(tài)獲取當(dāng)前系統(tǒng)的架構(gòu)如amd64, arm64確保添加正確的倉(cāng)庫(kù)路徑。signed-by/etc/apt/keyrings/docker.gpg指定用于驗(yàn)證此倉(cāng)庫(kù)的GPG密鑰文件路徑。$(lsb_release -cs)動(dòng)態(tài)獲取當(dāng)前Ubuntu的版本代號(hào)例如Ubuntu 22.04是jammy20.04是focal。stable使用穩(wěn)定版?zhèn)}庫(kù)。Docker還提供test和nightly倉(cāng)庫(kù)但生產(chǎn)環(huán)境請(qǐng)務(wù)必使用stable。sudo tee ...將前面echo輸出的倉(cāng)庫(kù)配置字符串寫入到/etc/apt/sources.list.d/docker.list文件中。/etc/apt/sources.list.d/目錄下的文件會(huì)被APT自動(dòng)讀取。4.3 安裝Docker引擎及其組件添加倉(cāng)庫(kù)后更新APT緩存然后安裝Docker。sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin安裝包說(shuō)明docker-ceDocker社區(qū)版引擎核心。docker-ce-cliDocker命令行工具你用來(lái)執(zhí)行docker run等命令的程序。containerd.io行業(yè)標(biāo)準(zhǔn)的容器運(yùn)行時(shí)Docker引擎底層依賴它來(lái)管理容器的生命周期。docker-buildx-plugin支持Docker Buildx用于構(gòu)建多平臺(tái)鏡像如同時(shí)構(gòu)建amd64和arm64鏡像。docker-compose-pluginDocker官方推出的docker compose插件注意是docker compose一個(gè)單詞作為插件。但我們通常還是使用獨(dú)立的docker-compose帶橫線二進(jìn)制文件它更通用。這里安裝插件是為了功能互補(bǔ)。4.4 驗(yàn)證Docker安裝與基礎(chǔ)操作安裝完成后啟動(dòng)Docker服務(wù)并設(shè)置開機(jī)自啟然后運(yùn)行一個(gè)測(cè)試容器。# 啟動(dòng)Docker服務(wù) sudo systemctl start docker # 設(shè)置Docker服務(wù)開機(jī)自啟 sudo systemctl enable docker # 查看Docker服務(wù)狀態(tài) sudo systemctl status docker狀態(tài)顯示active (running)即表示服務(wù)已成功啟動(dòng)。運(yùn)行Hello World容器sudo docker run hello-world這個(gè)命令會(huì)從Docker Hub拉取一個(gè)極小的測(cè)試鏡像并運(yùn)行。如果看到“Hello from Docker!”等歡迎信息說(shuō)明Docker引擎安裝、運(yùn)行、拉取鏡像、創(chuàng)建容器整個(gè)流程全部成功。實(shí)操心得第一次docker run如果失敗常見(jiàn)原因是網(wǎng)絡(luò)問(wèn)題無(wú)法連接Docker Hub或權(quán)限問(wèn)題??梢韵葒L試sudo docker pull hello-world單獨(dú)拉取鏡像看網(wǎng)絡(luò)是否通暢。5. 管理用戶權(quán)限免sudo執(zhí)行docker命令默認(rèn)情況下只有root用戶和docker組的成員才有權(quán)限與Docker守護(hù)進(jìn)程通信即運(yùn)行docker命令。為了避免每次都要輸入sudo我們需要將當(dāng)前用戶加入docker組。# 將當(dāng)前登錄用戶添加到docker組 sudo usermod -aG docker $USER重要提示執(zhí)行此命令后組權(quán)限變更不會(huì)立即生效。它只修改了用戶所屬組的配置但當(dāng)前已登錄的會(huì)話并沒(méi)有更新這個(gè)信息。生效方法任選其一注銷并重新登錄最徹底的方式。開啟一個(gè)新的終端會(huì)話在新終端中用戶組信息會(huì)被重新讀取。使用newgrp命令臨時(shí)在當(dāng)前終端執(zhí)行newgrp docker但這只影響當(dāng)前shell。生效后你應(yīng)該就可以直接運(yùn)行docker version或docker run hello-world而不再需要sudo了。避坑指南將用戶加入docker組等同于賦予其root權(quán)限。因?yàn)镈ocker守護(hù)進(jìn)程以root身份運(yùn)行容器內(nèi)的root用戶幾乎擁有對(duì)主機(jī)內(nèi)核的完全訪問(wèn)權(quán)。因此切勿將不受信任的用戶加入docker組。在個(gè)人開發(fā)機(jī)上可以這樣做但在多用戶服務(wù)器上需謹(jǐn)慎評(píng)估。6. 安裝獨(dú)立版docker-compose雖然Docker官方推出了docker compose插件但社區(qū)中大量的教程、腳本和項(xiàng)目仍然使用獨(dú)立的docker-composev1版本。為了獲得最好的兼容性我建議安裝獨(dú)立的docker-compose二進(jìn)制文件。我們將從GitHub Releases頁(yè)面下載其穩(wěn)定版本。6.1 下載最新穩(wěn)定版的docker-compose首先訪問(wèn) docker-compose的GitHub Releases頁(yè)面 查看最新的穩(wěn)定版本號(hào)。例如假設(shè)最新版本是v2.24.5。在終端中使用curl命令下載對(duì)應(yīng)架構(gòu)的二進(jìn)制文件。請(qǐng)將下面命令中的v2.24.5替換為你在GitHub上看到的最新版本。# 下載docker-compose二進(jìn)制文件到/usr/local/bin目錄需要sudo權(quán)限 sudo curl -L https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose參數(shù)解析-L讓curl跟隨重定向GitHub的下載鏈接通常會(huì)重定向。$(uname -s)獲取系統(tǒng)內(nèi)核名稱Linux。$(uname -m)獲取機(jī)器硬件名稱x86_64, aarch64等。-o指定輸出文件路徑。我們將其下載到/usr/local/bin這是存放用戶安裝的軟件的標(biāo)準(zhǔn)目錄通常在系統(tǒng)的PATH環(huán)境變量中。6.2 賦予執(zhí)行權(quán)限下載的文件默認(rèn)沒(méi)有執(zhí)行權(quán)限需要手動(dòng)添加。sudo chmod x /usr/local/bin/docker-compose6.3 驗(yàn)證安裝安裝完成后檢查版本以確認(rèn)安裝成功。docker-compose --version # 或使用新版本的命令格式如果你也安裝了插件 docker compose version如果輸出類似Docker Compose version v2.24.5則表明安裝成功。注意事項(xiàng)獨(dú)立版docker-compose和Docker官方的docker compose插件可以共存。它們的命令略有不同前者是docker-compose后者是docker compose。在編寫docker-compose.yml文件時(shí)兩者語(yǔ)法基本兼容。我個(gè)人習(xí)慣使用獨(dú)立版因?yàn)樗诟鞣N自動(dòng)化腳本和文檔中出現(xiàn)頻率更高。7. 配置Docker引擎與鏡像加速默認(rèn)安裝的Docker可能需要一些優(yōu)化配置以提升在國(guó)內(nèi)的使用體驗(yàn)。7.1 配置國(guó)內(nèi)鏡像加速器從Docker Hub拉取鏡像速度可能較慢。我們可以配置國(guó)內(nèi)鏡像加速器如阿里云、騰訊云、中科大等提供的服務(wù)。編輯Docker守護(hù)進(jìn)程的配置文件/etc/docker/daemon.json。如果文件不存在則創(chuàng)建它。sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [ https://docker.mirrors.ustc.edu.cn, https://hub-mirror.c.163.com, https://mirror.baidubce.com ], exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 }, storage-driver: overlay2 } EOF配置項(xiàng)詳解registry-mirrors鏡像加速器地址列表??梢耘渲枚鄠€(gè)Docker會(huì)按順序嘗試。這里添加了中國(guó)科技大學(xué)、網(wǎng)易和百度的鏡像源。exec-opts:native.cgroupdriversystemd建議設(shè)置cgroup驅(qū)動(dòng)為systemd這與Ubuntu使用systemd初始化系統(tǒng)的特性更匹配能提高系統(tǒng)穩(wěn)定性。log-driver和log-opts配置Docker容器的日志驅(qū)動(dòng)為json-file并限制單個(gè)日志文件最大100MB最多保留3個(gè)文件防止日志占滿磁盤。storage-driver存儲(chǔ)驅(qū)動(dòng)設(shè)置為overlay2這是目前Linux內(nèi)核推薦且性能較好的存儲(chǔ)驅(qū)動(dòng)。7.2 重啟Docker服務(wù)使配置生效修改配置后必須重啟Docker服務(wù)。sudo systemctl daemon-reload sudo systemctl restart dockersystemctl daemon-reload重新加載systemd管理的所有單元文件確保systemd識(shí)別到docker.service的配置變更。systemctl restart docker重啟Docker服務(wù)。驗(yàn)證加速器是否生效docker info在輸出信息中查找Registry Mirrors部分應(yīng)該能看到你剛才配置的鏡像地址。8. docker-compose核心概念與快速上手docker-compose是一個(gè)用于定義和運(yùn)行多容器Docker應(yīng)用的工具。它通過(guò)一個(gè)YAML格式的配置文件docker-compose.yml來(lái)管理一組相關(guān)聯(lián)的容器解決了“多個(gè)容器如何協(xié)作”的問(wèn)題。8.1 docker-compose.yml文件結(jié)構(gòu)解析一個(gè)最簡(jiǎn)單的docker-compose.yml示例如下它定義了一個(gè)Web應(yīng)用包含應(yīng)用本身和Redis緩存version: 3.8 # 指定Compose文件格式的版本 services: # 定義所有需要運(yùn)行的容器服務(wù) web: # 第一個(gè)服務(wù)名為“web” build: . # 使用當(dāng)前目錄下的Dockerfile構(gòu)建鏡像 ports: - 5000:5000 # 端口映射主機(jī)端口:容器端口 volumes: - .:/code # 數(shù)據(jù)卷掛載將主機(jī)當(dāng)前目錄掛載到容器的/code depends_on: - redis # 依賴關(guān)系此服務(wù)啟動(dòng)前先啟動(dòng)redis服務(wù) environment: - REDIS_HOSTredis # 設(shè)置環(huán)境變量 redis: # 第二個(gè)服務(wù)名為“redis” image: redis:alpine # 直接使用Docker Hub上的redis:alpine鏡像 volumes: - redis-data:/data # 使用命名卷掛載持久化Redis數(shù)據(jù) volumes: # 在文件底部聲明所有用到的命名卷 redis-data: # 定義一個(gè)名為redis-data的卷關(guān)鍵指令說(shuō)明buildvsimagebuild指定構(gòu)建上下文和Dockerfile路徑來(lái)創(chuàng)建鏡像image指定從倉(cāng)庫(kù)拉取現(xiàn)成的鏡像。ports端口映射格式為HOST:CONTAINER。將容器內(nèi)部端口暴露給主機(jī)。volumes數(shù)據(jù)卷掛載用于持久化數(shù)據(jù)或與主機(jī)共享文件。可以是主機(jī)路徑/host/path:/container/path也可以是命名卷volume_name:/container/path。depends_on定義服務(wù)啟動(dòng)順序。web服務(wù)會(huì)等待redis服務(wù)進(jìn)入“健康”或“運(yùn)行”狀態(tài)后再啟動(dòng)。environment設(shè)置容器內(nèi)的環(huán)境變量。8.2 常用docker-compose命令掌握以下幾個(gè)命令就能應(yīng)對(duì)90%的日常場(chǎng)景啟動(dòng)所有服務(wù)后臺(tái)模式docker-compose up -d-d代表“detached”在后臺(tái)運(yùn)行。查看服務(wù)運(yùn)行狀態(tài)docker-compose ps查看服務(wù)日志可指定服務(wù)名docker-compose logs -f web # -f 表示跟隨日志輸出停止所有服務(wù)docker-compose down此命令會(huì)停止并移除所有容器、網(wǎng)絡(luò)默認(rèn)創(chuàng)建的網(wǎng)絡(luò)但不會(huì)移除數(shù)據(jù)卷和鏡像。如果想同時(shí)移除數(shù)據(jù)卷加-v參數(shù)docker-compose down -v。構(gòu)建或重新構(gòu)建服務(wù)鏡像docker-compose build當(dāng)修改了Dockerfile或構(gòu)建上下文后需要重新構(gòu)建鏡像。在運(yùn)行中的服務(wù)容器內(nèi)執(zhí)行命令docker-compose exec web bash # 在web服務(wù)容器內(nèi)啟動(dòng)一個(gè)bash shell docker-compose exec redis redis-cli # 在redis服務(wù)容器內(nèi)執(zhí)行redis-cli命令9. 實(shí)戰(zhàn)演練使用docker-compose部署WordPress讓我們通過(guò)一個(gè)經(jīng)典的例子——部署包含WordPress和MySQL的博客系統(tǒng)來(lái)串聯(lián)所有知識(shí)點(diǎn)。9.1 創(chuàng)建項(xiàng)目目錄與編寫docker-compose.yml首先創(chuàng)建一個(gè)項(xiàng)目目錄并進(jìn)入。mkdir my-wordpress cd my-wordpress然后創(chuàng)建docker-compose.yml文件nano docker-compose.yml將以下內(nèi)容粘貼進(jìn)去version: 3.8 services: db: image: mysql:8.0 # 在生產(chǎn)環(huán)境中應(yīng)使用 secrets 或環(huán)境變量文件來(lái)管理密碼此處僅為演示。 environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress volumes: - db_data:/var/lib/mysql restart: always # 為MySQL服務(wù)添加健康檢查確保WordPress啟動(dòng)時(shí)數(shù)據(jù)庫(kù)已就緒 healthcheck: test: [CMD, mysqladmin, ping, -h, localhost] timeout: 20s retries: 10 wordpress: depends_on: db: condition: service_healthy # 等待db服務(wù)健康狀態(tài)為healthy image: wordpress:latest ports: - 8080:80 # 將主機(jī)的8080端口映射到容器的80端口 environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress volumes: - wp_data:/var/www/html restart: always volumes: db_data: wp_data:9.2 啟動(dòng)WordPress棧在my-wordpress目錄下運(yùn)行docker-compose up -d你會(huì)看到Docker開始拉取mysql:8.0和wordpress:latest鏡像然后創(chuàng)建網(wǎng)絡(luò)、卷并啟動(dòng)兩個(gè)容器。使用docker-compose ps查看狀態(tài)兩個(gè)服務(wù)都應(yīng)為Up。9.3 訪問(wèn)與驗(yàn)證打開你的瀏覽器訪問(wèn)http://你的服務(wù)器IP:8080。你應(yīng)該能看到WordPress的著名“五分鐘安裝”頁(yè)面。按照提示設(shè)置站點(diǎn)標(biāo)題、管理員賬號(hào)密碼即可完成安裝。9.4 管理部署停止服務(wù)docker-compose down。由于我們?cè)赿ocker-compose.yml中定義了命名卷db_data和wp_data即使容器被刪除你的數(shù)據(jù)庫(kù)和WordPress文件主題、插件、上傳內(nèi)容也會(huì)被保留。下次docker-compose up -d時(shí)數(shù)據(jù)會(huì)恢復(fù)。更新WordPress只需修改docker-compose.yml中wordpress服務(wù)的鏡像標(biāo)簽如wordpress:6.4然后運(yùn)行docker-compose up -dCompose會(huì)自動(dòng)拉取新鏡像并重新創(chuàng)建容器數(shù)據(jù)卷保持不變。備份數(shù)據(jù)數(shù)據(jù)卷位于Docker管理的位置通常/var/lib/docker/volumes/下。更規(guī)范的備份方式是使用docker run --volumes-from或?qū)iT的備份容器。10. 常見(jiàn)問(wèn)題排查與優(yōu)化技巧即使按照步驟操作你也可能會(huì)遇到一些問(wèn)題。這里記錄了一些常見(jiàn)坑點(diǎn)及其解決方案。10.1 Docker服務(wù)啟動(dòng)失敗問(wèn)題現(xiàn)象執(zhí)行sudo systemctl status docker時(shí)狀態(tài)不是active (running)而是failed。排查思路查看詳細(xì)日志sudo journalctl -xu docker這是最關(guān)鍵的排查命令會(huì)輸出Docker服務(wù)的詳細(xì)啟動(dòng)日志。常見(jiàn)原因與解決存儲(chǔ)驅(qū)動(dòng)問(wèn)題舊系統(tǒng)或某些VPS可能不支持overlay2??梢試L試在/etc/docker/daemon.json中將其改為devicemapper或vfs性能差僅作測(cè)試然后重啟Docker。但建議優(yōu)先升級(jí)內(nèi)核。IP地址沖突Docker默認(rèn)使用的網(wǎng)段如172.17.0.0/16可能與公司內(nèi)網(wǎng)沖突。需要在daemon.json中配置bip網(wǎng)橋IP或default-address-pools。磁盤空間不足Docker鏡像和容器會(huì)占用空間。使用df -h和docker system df檢查。SELinux/AppArmor在某些嚴(yán)格的安全策略下可能需要調(diào)整策略或?qū)⑵湓O(shè)置為寬容模式僅用于測(cè)試。10.2 用戶加入docker組后仍需要sudo問(wèn)題執(zhí)行了usermod命令并重新登錄后運(yùn)行docker ps仍提示權(quán)限拒絕。解決確認(rèn)當(dāng)前用戶是否在docker組中g(shù)roups $USER查看輸出是否包含docker。如果包含可能是當(dāng)前Shell會(huì)話的組信息未刷新。最可靠的方法是注銷當(dāng)前用戶或斷開SSH連接然后重新登錄。也可以嘗試用sg docker -c “docker ps”來(lái)臨時(shí)以docker組身份執(zhí)行命令但這并非長(zhǎng)久之計(jì)。10.3 docker-compose命令未找到問(wèn)題執(zhí)行docker-compose --version提示command not found。解決檢查文件是否下載到正確位置且具有執(zhí)行權(quán)限ls -lh /usr/local/bin/docker-compose應(yīng)顯示類似-rwxr-xr-x的權(quán)限。檢查/usr/local/bin是否在你的PATH環(huán)境變量中echo $PATH通常默認(rèn)就在。如果不在可以手動(dòng)添加或在/usr/bin下創(chuàng)建一個(gè)軟鏈接sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose10.4 鏡像拉取速度慢或失敗問(wèn)題docker pull或docker-compose up時(shí)卡在拉取鏡像。解決確認(rèn)鏡像加速器配置已生效執(zhí)行docker info查看Registry Mirrors。嘗試不同的鏡像源修改/etc/docker/daemon.json中的registry-mirrors換成其他可用的國(guó)內(nèi)源然后重啟Docker。使用代理如果你有可用的HTTP/HTTPS代理可以在Docker服務(wù)配置中設(shè)置。創(chuàng)建或編輯/etc/systemd/system/docker.service.d/http-proxy.conf[Service] EnvironmentHTTP_PROXYhttp://proxy.example.com:8080 EnvironmentHTTPS_PROXYhttp://proxy.example.com:8080 EnvironmentNO_PROXYlocalhost,127.0.0.1,.internal然后執(zhí)行sudo systemctl daemon-reload sudo systemctl restart docker。10.5 容器時(shí)間與宿主機(jī)時(shí)間不一致問(wèn)題容器內(nèi)的時(shí)間不是東八區(qū)CST或與宿主機(jī)相差8小時(shí)。解決在運(yùn)行容器或編寫docker-compose.yml時(shí)將宿主機(jī)的時(shí)區(qū)文件掛載到容器內(nèi)。命令行docker run -v /etc/localtime:/etc/localtime:ro ...docker-compose.ymlservices: your-service: volumes: - /etc/localtime:/etc/localtime:ro:ro表示只讀掛載。10.6 磁盤空間管理Docker會(huì)占用大量磁盤空間尤其是鏡像、容器和構(gòu)建緩存。清理命令查看磁盤使用docker system df刪除所有已停止的容器、未使用的網(wǎng)絡(luò)、構(gòu)建緩存和懸空鏡像docker system prune -a警告-a參數(shù)會(huì)刪除所有未被容器使用的鏡像包括可能被其他鏡像依賴的中間層鏡像使用前請(qǐng)確認(rèn)。僅刪除懸空鏡像docker image prune清理數(shù)據(jù)卷謹(jǐn)慎會(huì)刪除數(shù)據(jù)docker volume prune建議將清理工作加入定時(shí)任務(wù)crontab定期清理。安裝和配置只是第一步真正發(fā)揮Docker和Compose威力的在于日常的使用模式。我個(gè)人習(xí)慣為每個(gè)獨(dú)立項(xiàng)目創(chuàng)建一個(gè)目錄里面包含docker-compose.yml、Dockerfile如果需要、.env環(huán)境變量文件以及項(xiàng)目代碼。通過(guò).env文件管理敏感配置如密碼并通過(guò)docker-compose config命令來(lái)驗(yàn)證Compose文件的最終渲染結(jié)果這是一個(gè)避免配置錯(cuò)誤的好習(xí)慣。當(dāng)項(xiàng)目復(fù)雜后可以考慮使用docker-compose.override.yml來(lái)為不同環(huán)境開發(fā)、測(cè)試提供差異化配置。記住容器應(yīng)該是無(wú)狀態(tài)的所有需要持久化的數(shù)據(jù)務(wù)必通過(guò)volumes映射到宿主機(jī)或使用外部存儲(chǔ)服務(wù)。