引言为什么需要 Docker在软件开发的世界里我们经常遇到这样的困扰“在我的电脑上明明可以运行为什么到服务器上就报错了”这个问题一直困扰着无数开发者。不同的操作系统、不同的依赖库版本、不同的环境配置……这些差异导致了开发和部署环境的不一致。而 Docker 的出现彻底改变了这一局面。它让应用程序及其依赖环境打包成一个轻量级的容器在任何支持 Docker 的平台上都能以相同的方式运行。这就是著名的一次构建到处运行Build Once, Run Anywhere。一、Docker 是什么容器技术的革命Docker 是一个开源的容器化平台它可以将应用程序及其依赖环境打包成一个独立的容器。与传统虚拟机相比Docker 容器更加轻量、快速、高效。传统虚拟机 vs Docker 容器Docker 的核心优势快速部署 — 容器启动只需几秒钟环境一致性 — 开发、测试、生产环境完全一致资源高效 — 相比虚拟机节省大量系统资源微服务架构 — 完美支持微服务部署持续集成/部署 — 简化 CI/CD 流程二、Docker 核心概念详解镜像Image镜像就像是应用程序的模板或蓝图。它是一个只读的文件包包含了运行应用程序所需的所有内容代码、运行时、系统工具、系统库和设置。镜像的三大特点分层存储 — 每一层都是只读的可复用 — 多个容器可以共享同一个镜像版本管理 — 通过标签tag管理不同版本常见镜像示例nginx:latest # 最新版本的 Nginxmysql:8.0 # MySQL 8.0ubuntu:20.04 # Ubuntu 20.04容器Container容器是镜像的运行实例。如果说镜像是类那么容器就是对象。你可以从一个镜像启动多个容器每个容器都是相互隔离的。容器的生命周期Created — 容器已创建但未启动Running — 容器正在运行Paused — 容器已暂停Stopped — 容器已停止Deleted — 容器已删除仓库Registry仓库是存放镜像的地方就像代码仓库存放代码一样。常见的 Docker 镜像仓库Docker Hub — 官方公共仓库hub.docker.com阿里云镜像仓库 — 国内访问速度快私有仓库 — 企业内部自建三、Docker 安装指南Windows 安装系统要求Windows 10/11 专业版或企业版启用 Hyper-V 和 WSL 2安装步骤访问 Docker 官网下载 Docker Desktop for Windows双击安装程序按照提示完成安装重启计算机启动 Docker Desktop验证安装docker--version docker run hello-worldLinux 安装以 Ubuntu 为例#1.更新包索引 sudo apt-get update #2.安装依赖包 sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release #3.添加Docker官方 GPG 密钥 sudo mkdir-p/etc/apt/keyrings curl-fsSL https://download.docker.com/linux/ubuntu/gpg|\ sudo gpg--dearmor-o/etc/apt/keyrings/docker.gpg #4.设置仓库 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#5.安装DockerEnginesudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io #6.验证安装 sudo docker run hello-world 配置用户组免 sudo sudo usermod-aG docker $USER newgrp docker四、Docker 实战演练第一个 Docker 容器让我们从最简单的例子开始运行一个 Nginx Web 服务器bash # 拉取Nginx镜像 docker pull nginx:latest # 运行Nginx容器 docker run-d-p8080:80--name my-nginx nginx:latest # 查看运行状态 docker ps # 访问测试 # 打开浏览器访问 http://localhost:8080参数说明-d— 后台运行-p 8080:80— 端口映射宿主机8080→容器80–name my-nginx— 指定容器名称部署 MySQL 数据库# 运行MySQL容器 docker run-d \--name mysql-server \-e MYSQL_ROOT_PASSWORDmy-secret-pw \-e MYSQL_DATABASEmydb \-p3306:3306\-v mysql-data:/var/lib/mysql \ mysql:8.0# 进入MySQL容器 docker exec-it mysql-server mysql-uroot-p # 查看MySQL日志 docker logs mysql-server参数说明-e— 设置环境变量-v— 数据持久化数据存储在命名卷中Docker Compose 多容器应用docker-compose.yml 示例version:3.8services:#Web应用 web:build:.ports:-5000:5000depends_on:-db environment:-DATABASE_URLmysql://root:my-secret-pwdb:3306/mydb networks:-app-network # 数据库 db:image:mysql:8.0environment:MYSQL_ROOT_PASSWORD:my-secret-pw MYSQL_DATABASE:mydb volumes:-mysql-data:/var/lib/mysql ports:-3306:3306networks:-app-network #Nginx反向代理 nginx:image:nginx:latest ports:-80:80volumes:-./nginx.conf:/etc/nginx/nginx.conf depends_on:-web networks:-app-network volumes:mysql-data:networks:app-network:driver:bridge启动服务# 启动所有服务 docker-compose up-d # 查看服务状态 docker-compose ps # 查看日志 docker-compose logs-f # 停止服务 docker-compose down五、Docker 常用命令大全镜像管理命令# 搜索镜像 docker search nginx # 拉取镜像 docker pull nginx:latest # 查看本地镜像 docker images # 删除镜像 docker rmi nginx:latest # 构建镜像 docker build-t myapp:1.0.# 导出镜像 docker save-o myapp.tar myapp:1.0# 导入镜像 docker load-i myapp.tar # 标记镜像 docker tag myapp:1.0myapp:latest容器管理命令# 运行容器 docker run[OPTIONS]IMAGE[COMMAND]docker run-d-p80:80--name web nginx # 查看运行中的容器 docker ps # 查看所有容器包括已停止 docker ps-a # 停止容器 docker stop web # 启动已停止的容器 docker start web # 重启容器 docker restart web # 删除容器 docker rm web # 强制删除运行中的容器 docker rm-f web # 查看容器详细信息 docker inspect web # 查看容器日志 docker logs web docker logs-f web # 实时查看 # 进入容器 docker exec-it web/bin/bash数据管理命令# 创建数据卷 docker volume create my-volume # 查看数据卷 docker volume ls # 查看数据卷详情 docker volume inspect my-volume # 删除数据卷 docker volume rm my-volume # 创建备份 docker run--rm--volumes-from db-container \-v $(pwd):/backup ubuntu \ tar cvf/backup/backup.tar/var/lib/mysql网络管理命令# 创建网络 docker network create my-network # 查看网络 docker network ls # 连接容器到网络 docker network connect my-network my-container # 断开网络连接 docker network disconnect my-network my-container # 删除网络 docker network rm my-network六、Docker 数据持久化数据卷Volume特点由 Docker 管理存储在 Docker 特定目录跨平台兼容性好适合生产环境# 创建命名卷 docker volume create my-data # 使用卷 docker run-d-v my-data:/data nginx # 查看卷信息 docker volume inspect my-data # 清理未使用的卷 docker volume prune挂载目录Bind Mount特点直接映射宿主机目录适合开发环境可以直接访问文件# 挂载当前目录 docker run-d-v $(pwd)/html:/usr/share/nginx/html nginx # 只读挂载 docker run-d-v $(pwd)/html:/usr/share/nginx/html:ro nginx七、Docker 网络模式网络模式类型网络配置示例# 创建自定义网络 docker network create--driver bridge my-network # 运行容器并连接到网络 docker run-d--name web1--network my-network nginx docker run-d--name web2--network my-network nginx # 容器可以通过容器名互相访问 docker exec web1 ping web2八、Docker 安全最佳实践镜像安全# 使用特定版本标签不使用 latest FROM python:3.9-slim # 使用非 root 用户 RUN useradd-m myuser USER myuser # 最小化安装 RUN apt-get updateapt-get install-y--no-install-recommends \ curl \rm-rf/var/lib/apt/lists/*运行时安全# 限制容器资源 docker run-d \--memory512m\--cpus1.0\--read-only \--security-optno-new-privileges \ nginx九、Docker 故障排查常见问题及解决方案问题 1容器无法启动# 查看容器日志 docker logscontainer-id# 查看容器详情 docker inspectcontainer-id# 尝试交互式运行 docker run-itimage/bin/bash问题 2端口冲突# 查看端口占用 netstat-tunlp|grepport# 更改端口映射 docker run-p8081:80nginx # 使用其他端口问题 3磁盘空间不足# 清理未使用的镜像 docker image prune-a # 清理未使用的容器 docker container prune # 清理未使用的卷 docker volume prune # 一键清理 docker system prune-a--volumes问题 4网络连接问题# 检查网络配置 docker network inspectnetwork-name# 重建网络 docker network rmnetwork-namedocker network createnetwork-name调试技巧# 查看容器资源使用情况 docker stats # 查看容器进程 docker topcontainer-id# 实时查看日志 docker logs-f--tail100container-id# 导出容器文件系统 docker exportcontainer-idcontainer.tar十、总结Docker 作为容器化技术的代表已经彻底改变了软件开发和部署的方式。通过本文的学习你已经掌握了Docker 的核心概念镜像、容器、仓库Docker 的安装方法常用命令的使用Dockerfile 的编写技巧数据持久化和网络配置实战项目部署经验