Docker 命令終極指南
一、引言
Docker徹底改變了我們開(kāi)發(fā)、交付和運(yùn)行應(yīng)用程序的方式。通過(guò)將軟件封裝在容器中,Docker確保應(yīng)用程序在從開(kāi)發(fā)者電腦到生產(chǎn)服務(wù)器的不同環(huán)境中無(wú)縫運(yùn)行。這種一致性消除了“在我機(jī)器上能運(yùn)行”的問(wèn)題,并簡(jiǎn)化了整個(gè)軟件開(kāi)發(fā)生命周期。
二、Docker 安裝
在開(kāi)始前先確保您已正確安裝和配置Docker。在Linux上安裝Docker:
curl -fsSL https://get.docker.com -o get-docker.sh && sudo sh get-docker.sh
對(duì)于其他操作系統(tǒng),請(qǐng)?jiān)L問(wèn)官方文檔。安裝完成后,驗(yàn)證Docker是否正常工作:
docker --version
docker run hello-world
要訪問(wèn)和推送鏡像到Docker Hub:
docker login
docker logout # 完成后登出
三、容器管理
運(yùn)行容器
- 以后臺(tái)運(yùn)行模式運(yùn)行容器
docker run -d --name mycontainer -p 8080:80 nginx
- 交互式運(yùn)行容器
docker run -it ubuntu /bin/bash
- 限制資源運(yùn)行容器
docker run -d --name mycontainer --cpus 0.5 --memory 512m nginx
列出容器
- 列出正在運(yùn)行的容器
docker ps
- 列出所有容器(包括已停止的)
docker ps -a
- 列出容器大小
docker ps -s
啟動(dòng)、停止和重啟容器
- 啟動(dòng)已停止的容器
docker start mycontainer
- 停止正在運(yùn)行的容器
docker stop mycontainer
- 重啟容器
docker restart mycontainer
- 暫停正在運(yùn)行的容器
docker pause mycontainer
- 恢復(fù)暫停的容器
docker unpause mycontainer
- 強(qiáng)制終止正在運(yùn)行的容器
docker kill mycontainer
刪除容器
- 刪除已停止的容器
docker rm mycontainer
- 強(qiáng)制刪除正在運(yùn)行的容器
docker rm -f mycontainer
- 刪除所有已停止的容器
docker container prune
- 刪除所有容器(包括正在運(yùn)行和已停止的)
docker rm -f $(docker ps -aq)
在容器中執(zhí)行命令
- 在運(yùn)行的容器中執(zhí)行命令
docker exec -it mycontainer /bin/bash
- 以root身份在運(yùn)行的容器中執(zhí)行命令
docker exec -it -u root mycontainer /bin/bash
- 在主機(jī)和容器之間復(fù)制文件
docker cp /host/path/file.txt mycontainer:/container/path/
docker cp mycontainer:/container/path/file.txt /host/path/
查看容器日志和信息
- 查看容器日志
docker logs mycontainer
- 跟蹤容器日志
docker logs -f mycontainer
- 查看容器日志的最后N行
docker logs --tail <number> mycontainer
- 查看容器資源使用統(tǒng)計(jì)信息
docker stats mycontainer
- 查看容器的正在運(yùn)行的進(jìn)程
docker top mycontainer
- 查看容器的詳細(xì)信息
docker inspect mycontainer
- 查看容器文件系統(tǒng)上文件或目錄的更改
docker diff mycontainer
四、鏡像管理
列出和拉取鏡像
- 列出本地鏡像
docker images
- 從Docker Hub拉取鏡像
docker pull nginx
構(gòu)建鏡像
- 從Dockerfile構(gòu)建鏡像
docker build -t myimage:latest.
- 使用特定的Dockerfile構(gòu)建
docker build -f Dockerfile.dev -t myimage:dev.
- 不使用緩存構(gòu)建
docker build --no-cache
標(biāo)記鏡像
對(duì)鏡像進(jìn)行版本管理和組織:
- 標(biāo)記鏡像
docker tag myimage:latest myrepo/myimage:v1.0
推送鏡像
- 將鏡像推送到Docker Hub
docker push myrepo/myimage:v1.0
刪除鏡像
- 刪除鏡像
docker rmi myimage:latest
- 刪除所有未使用的鏡像
docker image prune -a
- 刪除所有鏡像
docker rmi $(docker images -q)
獲取鏡像信息
- 查看容器的詳細(xì)信息
docker image inspect myimage:latest
- 查看鏡像的歷史記錄
docker history myimage:latest
保存和加載鏡像
在不使用鏡像倉(cāng)庫(kù)的情況下在系統(tǒng)之間傳輸鏡像:
- 將鏡像保存為tar歸檔文件
docker save myimage:latest > myimage.tar
- 從tar歸檔文件加載鏡像
docker load < myimage.tar
五、Docker網(wǎng)絡(luò):連接容器
列出和創(chuàng)建網(wǎng)絡(luò)
管理Docker網(wǎng)絡(luò)以實(shí)現(xiàn)容器通信:
- 列出網(wǎng)絡(luò)
docker network ls
- 創(chuàng)建網(wǎng)絡(luò)
docker network create mynetwork
連接和斷開(kāi)容器
管理容器網(wǎng)絡(luò)連接:
- 將容器連接到指定網(wǎng)絡(luò)
docker network connect mynetwork mycontainer
- 從網(wǎng)絡(luò)斷開(kāi)容器連接
docker network disconnect mynetwork mycontainer
檢查網(wǎng)絡(luò)
獲取Docker網(wǎng)絡(luò)的詳細(xì)信息:
- 檢查網(wǎng)絡(luò)
docker network inspect mynetwork
刪除網(wǎng)絡(luò)
清理未使用的網(wǎng)絡(luò):
- 刪除網(wǎng)絡(luò)
docker network rm mynetwork
六、卷管理:持久數(shù)據(jù)存儲(chǔ)
列出和創(chuàng)建卷
管理Docker卷以實(shí)現(xiàn)持久數(shù)據(jù)存儲(chǔ):
- 列出卷
docker volume ls
- 創(chuàng)建卷
docker volume create myvolume
使用卷與容器
演示如何在容器中使用卷:
- 運(yùn)行帶有卷的容器
docker run -d --name mycontainer -v myvolume:/app/data nginx
檢查卷
獲取卷的詳細(xì)信息:
- 檢查卷
docker volume inspect myvolume
刪除卷
清理未使用的卷:
- 刪除卷
docker volume rm myvolume
- 刪除所有未使用的卷
docker volume prune
七、Docker Compose
- 啟動(dòng)docker-compose.yml中定義的服務(wù)
docker-compose up -d
- 停止docker-compose.yml中定義的服務(wù)
docker-compose down
- 查看服務(wù)日志
docker-compose logs
- 擴(kuò)展服務(wù)
docker-compose up -d --scale web=3
- 重建服務(wù)
docker-compose build
- 列出由Compose管理的容器
docker-compose ps
- 在服務(wù)容器中運(yùn)行命令
docker-compose exec <service_name> <command>
九、資源管理與監(jiān)控
監(jiān)控和管理Docker環(huán)境中的資源使用情況:
- 查看Docker磁盤(pán)使用情況
docker system df
- 查看詳細(xì)的容器資源使用情況
docker stats
- 更新容器的資源限制
docker update --memory <limit> <container_name>
十、清理和修剪
通過(guò)定期清理維護(hù)健康的Docker環(huán)境:
- 刪除所有未使用的容器、網(wǎng)絡(luò)、鏡像和卷
docker system prune -a
- 刪除所有已停止的容器
docker container prune
- 刪除所有未使用的鏡像
docker image prune -a
- 刪除所有未使用的卷
docker volume prune
- 刪除所有未使用的網(wǎng)絡(luò)
docker network prune
十一、安全與掃描
識(shí)別和解決Docker鏡像中的安全漏洞:
- 掃描鏡像中的漏洞
docker scan myimage:latest
- 查看鏡像漏洞詳細(xì)信息
docker scout cves myimage:latest
- 比較兩個(gè)鏡像的漏洞
docker scout compare --to myimage:latest myimage:v2
十二、高級(jí)Docker技術(shù)
多階段構(gòu)建
使用多階段構(gòu)建創(chuàng)建更小、更高效的鏡像:
- 構(gòu)建階段
FROM node:14 AS build
WORKDIR /app
COPY package*.json./
RUN npm install
COPY..
RUN npm run build
- 生產(chǎn)階段
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
跨平臺(tái)構(gòu)建
為多個(gè)架構(gòu)構(gòu)建鏡像:
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:latest.
健康檢查
在Dockerfile中實(shí)現(xiàn)健康檢查以確保容器正確運(yùn)行:
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
使用Docker作為開(kāi)發(fā)環(huán)境
創(chuàng)建一個(gè)一次性的開(kāi)發(fā)環(huán)境:
docker run -it --rm -v $(pwd):/app -w /app node:14 bash
十三、故障排除與調(diào)試
用于解決Docker相關(guān)問(wèn)題的寶貴命令:
- 實(shí)時(shí)查看Docker事件
docker events
- 獲取容器退出代碼
docker wait <container>
- 運(yùn)行網(wǎng)絡(luò)故障排除工具包
docker run --net=host --privileged -it nicolaka/netshoot
- 調(diào)試容器文件系統(tǒng)
docker export <container> > container.tar
docker import container.tar
- 以調(diào)試模式運(yùn)行Docker守護(hù)進(jìn)程
dockerd --debug
十四、Docker最佳實(shí)踐
- 使用官方基礎(chǔ)鏡像
- 最小化Dockerfile中的層數(shù)
- 使用多階段構(gòu)建來(lái)減小鏡像大小
- 實(shí)施適當(dāng)?shù)臉?biāo)記策略
- 定期更新和修補(bǔ)鏡像
- 對(duì)多容器應(yīng)用程序使用Docker Compose
- 實(shí)施日志記錄和監(jiān)控解決方案
- 定期對(duì)鏡像進(jìn)行安全掃描
- 使用卷存儲(chǔ)持久數(shù)據(jù)
- 對(duì)容器實(shí)施資源限制