一、引言
Docker彻底改变了我们开发、交付和运行应用程序的方式。通过将软件封装在容器中,Docker确保应用程序在从开发者电脑到生产服务器的不同环境中无缝运行。这种一致性消除了“在我机器上能运行”的问题,并简化了整个软件开发生命周期。
二、Docker 安装
在开始前先确保您已正确安装和配置Docker。在Linux上安装Docker:
curl -fsSL https://get.docker.com -o get-docker.sh && sudo sh get-docker.sh
对于其他操作系统,请访问官方文档。安装完成后,验证Docker是否正常工作:
docker --version
docker run hello-world
要访问和推送镜像到Docker Hub:
docker login
docker logout # 完成后登出
三、容器管理
运行容器
- 以后台运行模式运行容器
docker run -d --name mycontainer -p 8080:80 nginx
- 交互式运行容器
docker run -it ubuntu /bin/bash
- 限制资源运行容器
docker run -d --name mycontainer --cpus 0.5 --memory 512m nginx
列出容器
- 列出正在运行的容器
docker ps
- 列出所有容器(包括已停止的)
docker ps -a
- 列出容器大小
docker ps -s
启动、停止和重启容器
- 启动已停止的容器
docker start mycontainer
- 停止正在运行的容器
docker stop mycontainer
- 重启容器
docker restart mycontainer
- 暂停正在运行的容器
docker pause mycontainer
- 恢复暂停的容器
docker unpause mycontainer
- 强制终止正在运行的容器
docker kill mycontainer
删除容器
- 删除已停止的容器
docker rm mycontainer
- 强制删除正在运行的容器
docker rm -f mycontainer
- 删除所有已停止的容器
docker container prune
- 删除所有容器(包括正在运行和已停止的)
docker rm -f $(docker ps -aq)
在容器中执行命令
- 在运行的容器中执行命令
docker exec -it mycontainer /bin/bash
- 以root身份在运行的容器中执行命令
docker exec -it -u root mycontainer /bin/bash
- 在主机和容器之间复制文件
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
- 查看容器资源使用统计信息
docker stats mycontainer
- 查看容器的正在运行的进程
docker top mycontainer
- 查看容器的详细信息
docker inspect mycontainer
- 查看容器文件系统上文件或目录的更改
docker diff mycontainer
四、镜像管理
列出和拉取镜像
- 列出本地镜像
docker images
- 从Docker Hub拉取镜像
docker pull nginx
构建镜像
- 从Dockerfile构建镜像
docker build -t myimage:latest.
- 使用特定的Dockerfile构建
docker build -f Dockerfile.dev -t myimage:dev.
- 不使用缓存构建
docker build --no-cache
标记镜像
对镜像进行版本管理和组织:
- 标记镜像
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)
获取镜像信息
- 查看容器的详细信息
docker image inspect myimage:latest
- 查看镜像的历史记录
docker history myimage:latest
保存和加载镜像
在不使用镜像仓库的情况下在系统之间传输镜像:
- 将镜像保存为tar归档文件
docker save myimage:latest > myimage.tar
- 从tar归档文件加载镜像
docker load < myimage.tar
五、Docker网络:连接容器
列出和创建网络
管理Docker网络以实现容器通信:
- 列出网络
docker network ls
- 创建网络
docker network create mynetwork
连接和断开容器
管理容器网络连接:
- 将容器连接到指定网络
docker network connect mynetwork mycontainer
- 从网络断开容器连接
docker network disconnect mynetwork mycontainer
检查网络
获取Docker网络的详细信息:
- 检查网络
docker network inspect mynetwork
删除网络
清理未使用的网络:
- 删除网络
docker network rm mynetwork
六、卷管理:持久数据存储
列出和创建卷
管理Docker卷以实现持久数据存储:
- 列出卷
docker volume ls
- 创建卷
docker volume create myvolume
使用卷与容器
演示如何在容器中使用卷:
- 运行带有卷的容器
docker run -d --name mycontainer -v myvolume:/app/data nginx
检查卷
获取卷的详细信息:
- 检查卷
docker volume inspect myvolume
删除卷
清理未使用的卷:
- 删除卷
docker volume rm myvolume
- 删除所有未使用的卷
docker volume prune
七、Docker Compose
- 启动docker-compose.yml中定义的服务
docker-compose up -d
- 停止docker-compose.yml中定义的服务
docker-compose down
- 查看服务日志
docker-compose logs
- 扩展服务
docker-compose up -d --scale web=3
- 重建服务
docker-compose build
- 列出由Compose管理的容器
docker-compose ps
- 在服务容器中运行命令
docker-compose exec <service_name> <command>
九、资源管理与监控
监控和管理Docker环境中的资源使用情况:
- 查看Docker磁盘使用情况
docker system df
- 查看详细的容器资源使用情况
docker stats
- 更新容器的资源限制
docker update --memory <limit> <container_name>
十、清理和修剪
通过定期清理维护健康的Docker环境:
- 删除所有未使用的容器、网络、镜像和卷
docker system prune -a
- 删除所有已停止的容器
docker container prune
- 删除所有未使用的镜像
docker image prune -a
- 删除所有未使用的卷
docker volume prune
- 删除所有未使用的网络
docker network prune
十一、安全与扫描
识别和解决Docker镜像中的安全漏洞:
- 扫描镜像中的漏洞
docker scan myimage:latest
- 查看镜像漏洞详细信息
docker scout cves myimage:latest
- 比较两个镜像的漏洞
docker scout compare --to myimage:latest myimage:v2
十二、高级Docker技术
多阶段构建
使用多阶段构建创建更小、更高效的镜像:
- 构建阶段
FROM node:14 AS build
WORKDIR /app
COPY package*.json./
RUN npm install
COPY..
RUN npm run build
- 生产阶段
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
跨平台构建
为多个架构构建镜像:
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:latest.
健康检查
在Dockerfile中实现健康检查以确保容器正确运行:
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
使用Docker作为开发环境
创建一个一次性的开发环境:
docker run -it --rm -v $(pwd):/app -w /app node:14 bash
十三、故障排除与调试
用于解决Docker相关问题的宝贵命令:
- 实时查看Docker事件
docker events
- 获取容器退出代码
docker wait <container>
- 运行网络故障排除工具包
docker run --net=host --privileged -it nicolaka/netshoot
- 调试容器文件系统
docker export <container> > container.tar
docker import container.tar
- 以调试模式运行Docker守护进程
dockerd --debug
十四、Docker最佳实践
- 使用官方基础镜像
- 最小化Dockerfile中的层数
- 使用多阶段构建来减小镜像大小
- 实施适当的标记策略
- 定期更新和修补镜像
- 对多容器应用程序使用Docker Compose
- 实施日志记录和监控解决方案
- 定期对镜像进行安全扫描
- 使用卷存储持久数据
- 对容器实施资源限制