关于Docker的入门和理解

发布于:2025-04-11 ⋅ 阅读:(36) ⋅ 点赞:(0)

一、什么是 Docker?它是如何工作的?

📌 背景问题:传统环境的痛点

在微服务、云原生尚未普及前,开发部署往往面临这些挑战:

  • 程序在开发环境可以运行,在测试或生产环境却频繁出错(环境差异)

  • 构建、部署步骤复杂,文档难以维护

  • 虚拟机资源消耗高,部署缓慢,运行冗余服务

这时,Docker 的出现带来了根本性的转变。


🧠 Docker 的定义

Docker 是一个开源的容器化平台,它可以将应用及其所有依赖打包到一个轻量级、可移植的容器中,从而确保在任何地方都能一致地运行。

简单说,Docker = 快速部署应用的“打包机” + “运行平台”


⚙️ Docker 的底层原理

Docker 是基于 Linux 的两大核心技术:

  1. Namespace(命名空间): 进程隔离,让容器拥有“自己的世界”(PID、文件系统、网络等都彼此独立)

  2. Cgroups(控制组): 资源控制,限制容器的 CPU、内存、IO 等资源占用

除此之外,还有:

  • UnionFS(联合文件系统): 支持多层镜像组合,镜像可以继承并叠加,提高复用与构建效率

  • Containerd: 容器运行时,Docker 实际通过它来管理容器生命周期


🔍 容器 ≠ 虚拟机

在这里插入图片描述
与虚拟机不同,容器不需要单独的 Guest OS,而是共享宿主机内核,因此具有以下优势:

维度 虚拟机 容器
启动速度 慢(分钟) 快(秒级)
系统开销 高(完整OS) 低(进程级隔离)
可移植性
资源复用 优秀
安全隔离 中等(可加强)

二、Docker 架构与核心组件详解

Docker 架构包括以下几个关键组成:
在这里插入图片描述

  • Docker CLI: 命令行工具,用于与 Docker 守护进程通信

  • Docker Daemon(dockerd): 负责容器构建、运行、管理的后台服务

  • Registry: 镜像分发平台(如 Docker Hub)

  • Container Runtime: 实际运行容器的引擎(通常是 containerd)


三、核心对象详解

1. 镜像(Image)

  • 镜像是多层文件系统的叠加

  • 每一层对应 Dockerfile 的一条指令 (RUN, COPY, ADD)

  • 镜像不可变,可复用,可缓存

docker pull nginx
docker images

2. 容器(Container)

  • 镜像的运行实例,具有隔离的进程空间

  • 使用 cgroupsnamespaces 技术隔离资源

  • 可读写层是运行时生成的,容器删除则数据消失

docker run -d -p 80:80 nginx

3. Dockerfile(构建脚本)

关键指令说明:

指令 含义
FROM 指定基础镜像
RUN 执行构建命令
COPY / ADD 文件复制
EXPOSE 暴露端口
CMD / ENTRYPOINT 指定启动命令

4.数据卷(Volumes)

  • 容器中的持久化数据

  • 避免数据随着容器销毁而丢失

docker volume create mydata
docker run -v mydata:/data myapp

5. 网络(Networks)

三种模式:

  • bridge:默认,容器互通,主机隔离

  • host:容器共享宿主机网络(性能高)

  • none:完全隔离

docker network create --driver bridge mynet
docker run --network=mynet ...


四、实战:部署一个 Flask + Redis 微服务架构

项目结构

project/
├── web/
│   ├── app.py
│   └── requirements.txt
├── Dockerfile
├── docker-compose.yml

web/app.py

from flask import Flask
import redis

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

@app.route('/')
def hello():
    visits = cache.incr('counter')
    return f'访问次数: {visits}'

if __name__ == '__main__':
    app.run(host='0.0.0.0')

requirements.txt

flask
redis

Dockerfile

FROM python:3.10-slim

WORKDIR /app
COPY web/ .
RUN pip install -r requirements.txt

EXPOSE 5000
CMD ["python", "app.py"]

docker-compose.yml

version: '3.8'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    depends_on:
      - redis
  redis:
    image: redis:6-alpine

启动服务

docker-compose up --build


五、总结

Docker 不仅是一个开发工具,更是现代云原生的基石。掌握 Docker 能极大提升你在微服务架构、CI/CD 流水线、DevOps 流程中的工作效率。


网站公告

今日签到

点亮在社区的每一天
去签到