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 的核心优势

  1. 环境一致性:消除“在我的机器上能运行”(It works on my machine)的问题。
  2. 快速部署:容器启动时间以秒计算,远快于传统虚拟机。
  3. 资源高效:多个容器共享宿主机操作系统内核,占用更少资源。
  4. 可扩展性:通过 Docker Compose 等工具管理多容器应用,支持微服务架构。

二、Docker 环境搭建与基础命令

2.1 安装 Docker

根据操作系统选择安装方式:

Windows/macOS

通过 Docker Desktop 安装:

  1. 访问 Docker 官网 下载对应版本。
  2. 安装完成后,打开终端验证安装:
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

  1. 拉取镜像

    docker pull nginx  
    
  2. 运行容器

    docker run -d -p 80:80 --name my_nginx nginx  
    
    • -d:后台运行容器
    • -p 80:80:将宿主机的 80 端口映射到容器的 80 端口
    • --name:指定容器名称
  3. 验证结果
    打开浏览器访问 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 官方的公共仓库,提供海量开源镜像。开发者可:

  1. 搜索镜像:访问 Docker Hub 官网 或通过命令:
    docker search nginx  
    
  2. 推送镜像:将自定义镜像上传至仓库:
    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 不仅能提升部署效率,还能更从容地应对复杂的应用场景。

下一步行动建议

  1. 通过实际项目练习,如部署个人博客或 API 服务。
  2. 学习 Kubernetes 等容器编排工具,进一步探索云原生生态。
  3. 参与开源项目或阅读 Docker 源码,深化对底层原理的理解。

通过本教程,你已掌握了 Docker 的核心概念和实践方法。记住,动手实践是学习 Docker 的最佳途径——尝试将你的第一个项目容器化,并与社区交流经验,你将在技术成长之路上走得更远!

最新发布