引言:为什么需要 Docker?
在软件开发的世界里,我们经常遇到这样的困扰:“在我的电脑上明明可以运行,为什么到服务器上就报错了?”
这个问题一直困扰着无数开发者。不同的操作系统、不同的依赖库版本、不同的环境配置……这些差异导致了开发和部署环境的不一致。
而 Docker 的出现,彻底改变了这一局面。它让应用程序及其依赖环境打包成一个轻量级的"容器",在任何支持 Docker 的平台上都能以相同的方式运行。这就是著名的一次构建,到处运行(Build Once, Run Anywhere)。
一、Docker 是什么?
容器技术的革命
Docker 是一个开源的容器化平台,它可以将应用程序及其依赖环境打包成一个独立的容器。与传统虚拟机相比,Docker 容器更加轻量、快速、高效。
传统虚拟机 vs Docker 容器:
Docker 的核心优势
快速部署 — 容器启动只需几秒钟
环境一致性 — 开发、测试、生产环境完全一致
资源高效 — 相比虚拟机节省大量系统资源
微服务架构 — 完美支持微服务部署
持续集成/部署 — 简化 CI/CD 流程
二、Docker 核心概念详解
镜像(Image)
镜像就像是应用程序的"模板"或"蓝图"。它是一个只读的文件包,包含了运行应用程序所需的所有内容:代码、运行时、系统工具、系统库和设置。
镜像的三大特点:
分层存储 — 每一层都是只读的
可复用 — 多个容器可以共享同一个镜像
版本管理 — 通过标签(tag)管理不同版本
常见镜像示例:
nginx:latest # 最新版本的 Nginx
mysql:8.0 # MySQL 8.0
ubuntu: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_PASSWORD=my-secret-pw \-e MYSQL_DATABASE=mydb \-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.8'services:#Web应用 web:build:.ports:-"5000:5000"depends_on:-db environment:-DATABASE_URL=mysql://root:my-secret-pw@db: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:3306"networks:-app-network #Nginx反向代理 nginx:image:nginx:latest ports:-"80:80"volumes:-./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 update&&apt-get install-y--no-install-recommends \ curl \&&rm-rf/var/lib/apt/lists/*运行时安全
# 限制容器资源 docker run-d \--memory="512m"\--cpus="1.0"\--read-only \--security-opt=no-new-privileges \ nginx九、Docker 故障排查
常见问题及解决方案
问题 1:容器无法启动
# 查看容器日志 docker logs<container-id># 查看容器详情 docker inspect<container-id># 尝试交互式运行 docker run-it<image>/bin/bash问题 2:端口冲突
# 查看端口占用 netstat-tunlp|grep<port># 更改端口映射 docker run-p8081:80nginx # 使用其他端口问题 3:磁盘空间不足
# 清理未使用的镜像 docker image prune-a # 清理未使用的容器 docker container prune # 清理未使用的卷 docker volume prune # 一键清理 docker system prune-a--volumes问题 4:网络连接问题
# 检查网络配置 docker network inspect<network-name># 重建网络 docker network rm<network-name>docker network create<network-name>调试技巧
# 查看容器资源使用情况 docker stats # 查看容器进程 docker top<container-id># 实时查看日志 docker logs-f--tail100<container-id># 导出容器文件系统 docker export<container-id>>container.tar十、总结
Docker 作为容器化技术的代表,已经彻底改变了软件开发和部署的方式。通过本文的学习,你已经掌握了:
Docker 的核心概念(镜像、容器、仓库)
Docker 的安装方法
常用命令的使用
Dockerfile 的编写技巧
数据持久化和网络配置
实战项目部署经验