news 2026/6/7 14:27:17

Docker 入门实战教程:从零开始掌握容器化技术

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Docker 入门实战教程:从零开始掌握容器化技术

引言:为什么需要 Docker?

在软件开发的世界里,我们经常遇到这样的困扰:"在我的电脑上明明可以运行,为什么到服务器上就报错了?"

这个问题一直困扰着无数开发者。不同的操作系统、不同的依赖库版本、不同的环境配置……这些差异导致了开发和部署环境的不一致。

而 Docker 的出现,彻底改变了这一局面。它让应用程序及其依赖环境打包成一个轻量级的"容器",在任何支持 Docker 的平台上都能以相同的方式运行。这就是著名的一次构建,到处运行(Build Once, Run Anywhere)。

一、Docker 是什么?

容器技术的革命

Docker 是一个开源的容器化平台,它可以将应用程序及其依赖环境打包成一个独立的容器。与传统虚拟机相比,Docker 容器更加轻量、快速、高效。

传统虚拟机 vs Docker 容器:

对比维度虚拟机Docker 容器
启动速度分钟级秒级 ⚡
磁盘占用GB 级别MB 级别 💾
性能表现接近原生接近原生
隔离程度完全隔离进程级隔离
可移植性较差优秀 ✨

虚拟机 vs Docker容器

Docker 的核心优势

快速部署— 容器启动只需几秒钟

环境一致性— 开发、测试、生产环境完全一致

资源高效— 相比虚拟机节省大量系统资源

微服务架构— 完美支持微服务部署

持续集成/部署— 简化 CI/CD 流程

二、Docker 核心概念详解

镜像(Image)

镜像就像是应用程序的"模板"或"蓝图"。它是一个只读的文件包,包含了运行应用程序所需的所有内容:代码、运行时、系统工具、系统库和设置。

镜像的三大特点:

🔹分层存储— 每一层都是只读的

🔹可复用— 多个容器可以共享同一个镜像

🔹版本管理— 通过标签(tag)管理不同版本

常见镜像示例:

nginx:latest # 最新版本的 Nginx mysql:8.0 # MySQL 8.0 ubuntu:20.04 # Ubuntu 20.04

Docker镜像分层结构

容器(Container)

容器是镜像的运行实例。如果说镜像是"类",那么容器就是"对象"。你可以从一个镜像启动多个容器,每个容器都是相互隔离的。

容器的生命周期:

1️⃣ Created — 容器已创建但未启动 2️⃣ Running — 容器正在运行 3️⃣ Paused — 容器已暂停 4️⃣ Stopped — 容器已停止 5️⃣ Deleted — 容器已删除

Docker容器生命周期

🏪 仓库(Registry)

仓库是存放镜像的地方,就像代码仓库存放代码一样。

常见的 Docker 镜像仓库:

🌐 Docker Hub — 官方公共仓库(hub.docker.com) 阿里云镜像仓库 — 国内访问速度快 🏢 私有仓库 — 企业内部自建

Docker系统架构图

三、Docker 安装指南

💻Windows 安装

系统要求:

  • Windows 10/11 专业版或企业版
  • 启用 Hyper-V 和 WSL 2

安装步骤:

  1. 访问 Docker 官网下载 Docker Desktop for Windows
  2. 双击安装程序,按照提示完成安装
  3. 重启计算机
  4. 启动 Docker Desktop
  5. 验证安装:
docker --version docker run hello-world

🐧 Linux 安装(以 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. 安装 Docker Engine sudo 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 -p 8080: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 \ -p 3306: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.0 environment: 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.0 myapp:latest

📦 容器管理命令

# 运行容器 docker run [OPTIONS] IMAGE [COMMAND] docker run -d -p 80: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 网络模式

🌐 网络模式类型

模式说明使用场景
bridge默认模式,容器通过虚拟网桥通信单机多容器通信
host共享宿主机网络高性能需求
none无网络配置离线处理任务
container共享其他容器网络容器间协作

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 -p 8081:80 nginx # 使用其他端口

问题 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 --tail 100 <container-id> # 导出容器文件系统 docker export <container-id> > container.tar

十、总结

Docker 作为容器化技术的代表,已经彻底改变了软件开发和部署的方式。通过本文的学习,你已经掌握了:

✅ Docker 的核心概念(镜像、容器、仓库) ✅ Docker 的安装方法 ✅ 常用命令的使用 ✅ Dockerfile 的编写技巧 ✅ 数据持久化和网络配置 ✅ 实战项目部署经验
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/31 13:33:30

无人机射频模块技术要点解析

无人机射频模块是其通信系统的核心&#xff0c;它负责在无人机、遥控器和地面站之间建立并维持一条稳定、高效、可靠的无线数据链路。其技术设计直接决定了无人机的控制距离、图像传输质量、抗干扰能力和整体可靠性。为了快速建立整体认知&#xff0c;下表汇总了当前主流及前沿…

作者头像 李华
网站建设 2026/5/30 7:57:41

无需编程基础!手把手教你用GLM-TTS webUI实现语音克隆

无需编程基础&#xff01;手把手教你用GLM-TTS webUI实现语音克隆 在短视频、播客和虚拟人内容爆发的今天&#xff0c;个性化语音正在成为数字表达的新入口。你是否想过&#xff0c;只用一段几秒钟的录音&#xff0c;就能让AI“说”出你想说的话&#xff1f;而且全程不写一行代…

作者头像 李华
网站建设 2026/6/5 15:03:46

【Java毕设全套源码+文档】基于springboot的儿童游乐园管理系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/6 10:33:15

PHP WebSocket性能调优实战(百万级并发优化秘籍)

第一章&#xff1a;PHP WebSocket性能调优的核心挑战 在构建实时Web应用时&#xff0c;PHP结合WebSocket技术能够实现服务器与客户端之间的双向通信。然而&#xff0c;由于PHP本身的设计特性&#xff0c;其在长连接处理、内存管理和并发支持方面面临显著挑战&#xff0c;成为性…

作者头像 李华
网站建设 2026/6/5 22:52:48

开题报告“智能救星”:宏智树AI如何用3步破解论文选题困局?

对许多学生来说&#xff0c;写开题报告是论文写作的“第一道坎”——选题太宽泛被导师批“空泛”&#xff0c;选题太冷门被质疑“没价值”&#xff0c;文献综述像流水账&#xff0c;研究方法写成“工具清单”……更痛苦的是&#xff0c;很多人明明查了几十篇文献&#xff0c;却…

作者头像 李华