Docker 教程(千字长文)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
- 《从零手撸:仿小红书(微服务架构)》 已完结,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
前言:为什么需要 Docker 教程?
在现代软件开发中,开发者经常面临这样的挑战:代码在本地运行正常,但在其他环境或服务器上却出现兼容性问题。Docker 的出现,通过容器化技术解决了这一难题。它允许开发者将应用程序及其依赖打包成一个轻量级、可移植的容器,实现“一次构建,到处运行”。本教程将从零开始,以循序渐进的方式,帮助编程初学者和中级开发者掌握 Docker 的核心概念与实践技巧。
一、Docker 的基本概念与核心优势
1.1 什么是 Docker?
Docker 是一个开源的容器化平台,其核心思想是 “将应用程序与运行环境解耦”。你可以将 Docker 容器想象为一个微型虚拟机,但它比传统虚拟机更轻量、启动更快。Docker 通过以下方式实现这一目标:
- 镜像(Image):容器的模板,包含应用程序及其所有依赖。
- 容器(Container):基于镜像运行的实例,可独立运行且与其他容器隔离。
- 仓库(Repository):存储和共享镜像的中央仓库,如 Docker Hub。
比喻:Docker 镜像就像集装箱的模板,定义了集装箱的大小和内部结构;容器则是根据模板制造的实体集装箱,可以装载货物(应用程序)并被运输(部署到不同环境)。
1.2 Docker 的核心优势
- 环境一致性:消除“在我的机器上能运行”(It works on my machine)的问题。
- 快速部署:容器启动时间以秒计算,远快于传统虚拟机。
- 资源高效:多个容器共享宿主机操作系统内核,占用更少资源。
- 可扩展性:通过 Docker Compose 等工具管理多容器应用,支持微服务架构。
二、Docker 环境搭建与基础命令
2.1 安装 Docker
根据操作系统选择安装方式:
Windows/macOS
通过 Docker Desktop 安装:
- 访问 Docker 官网 下载对应版本。
- 安装完成后,打开终端验证安装:
docker --version
Linux
以 Ubuntu 为例:
sudo apt-get update
sudo apt-get install docker.io
sudo systemctl start docker
sudo docker --version
2.2 Docker 基础命令速览
以下是常用命令及其功能:
命令 | 描述 | 示例命令 |
---|---|---|
docker pull | 从仓库拉取镜像 | docker pull nginx |
docker run | 运行容器 | docker run -d -p 80:80 nginx |
docker ps | 列出正在运行的容器 | docker ps |
docker stop | 停止指定容器 | docker stop <container_id> |
docker build | 根据 Dockerfile 构建镜像 | docker build -t myapp . |
2.3 第一个 Docker 容器:运行 Nginx
-
拉取镜像:
docker pull nginx
-
运行容器:
docker run -d -p 80:80 --name my_nginx nginx
-d
:后台运行容器-p 80:80
:将宿主机的 80 端口映射到容器的 80 端口--name
:指定容器名称
-
验证结果:
打开浏览器访问http://localhost
,若看到 Nginx 默认页面,则说明容器运行成功。
三、Docker 核心概念详解
3.1 镜像(Image)与容器(Container)
镜像(Image)是容器的只读模板,包含构建环境所需的文件和配置。而容器(Container)是镜像的运行实例,具有读写层,可动态修改。
比喻:
- 镜像如同汽车的图纸,定义了车辆的结构和功能。
- 容器如同根据图纸制造的实体汽车,可以启动、停止,并在运行中产生状态变化。
3.2 Dockerfile:构建镜像的蓝图
Dockerfile 是一个文本文件,包含一系列指令,用于定义镜像的构建步骤。
示例:构建一个 Python 应用的镜像
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
构建与运行:
docker build -t my-python-app .
docker run -d -p 5000:5000 my-python-app
3.3 Docker Hub:镜像的集中仓库
Docker Hub 是 Docker 官方的公共仓库,提供海量开源镜像。开发者可:
- 搜索镜像:访问 Docker Hub 官网 或通过命令:
docker search nginx
- 推送镜像:将自定义镜像上传至仓库:
docker tag my-python-app username/my-python-app:1.0 docker push username/my-python-app:1.0
四、Docker 进阶实践:多容器与网络管理
4.1 Docker Compose:管理复杂应用
Docker Compose 允许通过 docker-compose.yml
文件定义多容器应用,简化部署流程。
案例:部署一个包含 Web 和数据库的微服务
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
操作步骤:
docker-compose up -d
docker-compose ps
4.2 网络与数据卷管理
网络配置
通过自定义网络实现容器间通信:
docker network create my_network
docker run -d --name db --network my_network postgres:13
docker run -d --name web --network my_network my-python-app
数据持久化:数据卷(Volume)
避免容器删除后数据丢失,使用数据卷存储持久化数据:
docker volume create my_volume
docker run -d \
--mount source=my_volume,target=/app/data \
my-python-app
五、常见问题与解决方案
5.1 端口冲突问题
现象:运行容器时提示端口已被占用。
解决方案:
- 修改映射端口:
docker run -p 8080:80 nginx
- 查找占用端口的进程并终止:
# Linux/macOS lsof -i :80 kill -9 <PID> # Windows netstat -ano | findstr :80 taskkill /PID <PID> /F
5.2 镜像体积过大问题
原因:Dockerfile 中未清理构建缓存或安装了不必要的依赖。
优化方法:
FROM python:3.9-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt --no-cache-dir
FROM python:3.9-slim
COPY --from=builder /app/.local .local
ENV PATH=/root/.local/bin:$PATH
COPY . .
结论:Docker 的未来与学习建议
Docker 已成为 DevOps 和云原生领域的核心技术,其轻量化、可移植的特性推动了微服务架构的普及。对于开发者而言,掌握 Docker 不仅能提升部署效率,还能更从容地应对复杂的应用场景。
下一步行动建议:
- 通过实际项目练习,如部署个人博客或 API 服务。
- 学习 Kubernetes 等容器编排工具,进一步探索云原生生态。
- 参与开源项目或阅读 Docker 源码,深化对底层原理的理解。
通过本教程,你已掌握了 Docker 的核心概念和实践方法。记住,动手实践是学习 Docker 的最佳途径——尝试将你的第一个项目容器化,并与社区交流经验,你将在技术成长之路上走得更远!