1.Docker架构
┌─────────────────────────────────────────────────────────────────────
│ Docker 架构图
├─────────────────────────────────────────────────────────────────────
│
│ ┌──────────────┐
│ │ Docker Client│ ← docker run, docker ps, docker build
│ │ (CLI) │
│ └──────┬───────┘
│ │ REST API
│ ┌──────▼───────┐
│ │ Docker Daemon │ ← dockerd(守护进程)
│ │ (daemon) │ 管理镜像、容器、网络、卷
│ └──────┬───────┘
│ │
│ ┌──────▼──────────────────────────────────────────────┐
│ │ Storage Driver │
│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ │ AUFS │ │Overlay2│ │Devicemapper│ │ VFS │ │
│ │ └────────┘ └────────┘ └────────┘ └────────┘ │
│ └─────────────────────────────────────────────────────┘
│ │
│ ┌──────▼───────┐ ┌──────────────────┐
│ │ Containerd │ → │ runc │ ← OCI运行时标准
│ └──────────────┘ └──────────────────┘
│
│ ┌──────────────┐ ┌──────────────────┐
│ │ Docker Hub │ ↔ │ Private Registry │
│ │ (公共仓库) │ │ (私有仓库) │
│ └──────────────┘ └──────────────────┘
│
└─────────────────────────────────────────────────────────────────────
2.Docker核心概念
2.1 镜像(Image)
┌─────────────────────────────────────────────────────────────────────
│ Docker镜像分层结构
├─────────────────────────────────────────────────────────────────────
│
│ ┌─────────────────────────────────────────┐
│ │ 可读写层(Container Layer) │ ← 容器运行时修改
│ ├─────────────────────────────────────────┤
│ │ 只读层 N │ ← ADD/COPY/RUN
│ ├─────────────────────────────────────────┤
│ │ 只读层 N-1 │
│ ├─────────────────────────────────────────┤
│ │ ... │
│ ├─────────────────────────────────────────┤
│ │ 只读层 1 │
│ ├─────────────────────────────────────────┤
│ │ Base Image(基础镜像) │ ← FROM 指定
│ └─────────────────────────────────────────┘
│
│ ★ 联合挂载(Union Mount)技术:多层只读叠加,顶部可写
│ ★ 写时复制(COW):修改文件时从只读层复制到可写层
└─────────────────────────────────────────────────────────────────────
存储驱动对比:
┌──────────────┬──────────────────────────────────────────────────────
│ 存储驱动 │ 特点 ├──────────────┼──────────────────────────────────────────────────────
│ overlay2 │ CentOS7默认性能最佳,推荐使用
│ aufs │ Ubuntu默认,较老版本支持
│ devicemapper│ 基于LVM逻辑卷,性能较差
│ vfs │ 最慢,仅用于测试
└──────────────┴──────────────────────────────────────────────────────
2.2 容器(Container)
┌─────────────────────────────────────────────────────────────────────
│ 容器 vs 虚拟机对比
├──────────────────┬─────────────────────┬────────────────────────────
│ 对比项 │ 容器 │ 虚拟机
├──────────────────┼─────────────────────┼────────────────────────────
│ 启动时间 │ 秒级 │ 分钟级
│ 资源占用 │ 轻量(MB级) │ 重量(GB级)
│ 隔离级别 │ 进程级 │ 硬件级
│ 性能损耗 │ 几乎无 │ 较高
│ 镜像大小 │ MB级 │ GB级
│ 适用场景 │ 微服务、CI/CD │ 完整操作系统隔离
└──────────────────┴─────────────────────┴────────────────────────────
2.3 仓库(Registry)
┌─────────────────────────────────────────────────────────────────────
│ Registry 分类
├──────────────────┬──────────────────────────────────────────────────
│ 类型 │ 说明
├──────────────────┼──────────────────────────────────────────────────
│ Sponsor Registry │ Docker Hub 等第三方公共仓库
│ Mirror Registry │ 仅客户使用的镜像仓库
│ Vendor Registry │ 软件厂商提供的仓库(如CentOS、Ubuntu)
│ Private Registry │ 企业自建私有仓库(带防火墙+安全层)
└──────────────────┴──────────────────────────────────────────────────
仓库结构:
Repository = 镜像的所有版本集合
├── magedu/nginx
│ ├── tag: 1.12-alpine
│ ├── tag: latest
│ └── tag: stable
└── magedu/mysql
└── tag: 5.7
3.Volume 数据管理
┌─────────────────────────────────────────────────────────────────────
│ 为什么需要 Volume
├─────────────────────────────────────────────────────────────────────
│ 问题1: 容器删除后数据丢失
│ 问题2: 容器间数据共享不便
│ 问题3: 宿主机访问容器数据困难
│
│ 解决方案: Volume(卷)
│ • 绕过联合文件系统,直接绑定宿主机目录
│ • 独立于容器生命周期,删除容器数据不丢失
│ • 支持多容器共享
└─────────────────────────────────────────────────────────────────────
两种Volume 类型:
1 2 3 4 5 6 7 8
| docker run -v /host/path:/container/path busybox
docker run -v xxx:/container/path busybox
|
Volume 共享方式:
1 2 3 4 5 6 7
| docker run -v /docker/volumes/v1:/data --name c1 busybox docker run -v /docker/volumes/v1:/data --name c2 busybox
docker run -v /data --name c1 busybox docker run --volumes-from c1 --name c2 busybox
|
4.Docker网络模型
┌─────────────────────────────────────────────────────────────────────
│ 四种网络模式
├──────────────────┬──────────────────────────────────────────────────
│ 模式 │ 说明
├──────────────────┼──────────────────────────────────────────────────
│ bridge │ 桥接模式(默认),容器通过docker0桥访问外部
│ │ 使用 -p 端口映射暴露服务
├──────────────────┼──────────────────────────────────────────────────
│ host │ 开放模式,容器共享宿主机网络命名空间
│ │ 性能最好,但端口易冲突
├──────────────────┼──────────────────────────────────────────────────
│ none │ 关闭模式,容器仅有lo接口
│ │ 适用于离线任务、备份
├──────────────────┼──────────────────────────────────────────────────
│ container │ 联盟模式,共享另一个容器的网络命名空间
│ │ 用于调试、日志收集等
└──────────────────┴──────────────────────────────────────────────────
端口映射:
1 2 3 4 5 6 7 8 9 10
| -p <containerPort> -p <hostPort>:<containerPort> -p <ip>:<hostPort>:<containerPort> -P
docker run -p 80:80 nginx docker run -p 8080:80 nginx docker run -p 127.0.0.1:8080:80 nginx
|
5.Dockerfile指令详解
┌─────────────────────────────────────────────────────────────────────
│ Dockerfile 常用指令
├──────────────┬──────────────────────────────────────────────────────
│ 指令 │ 说明
├──────────────┼──────────────────────────────────────────────────────
│ FROM │ 指定基础镜像(必须为首个非注释指令)
│ MAINTAINER │ 镜像作者信息(已废弃,用LABEL替代)
│ LABEL │ 添加元数据标签
│ RUN │ 构建镜像时执行的命令(每个RUN生成一层)
│ CMD │ 容器启动时的默认命令(仅最后一个生效)
│ ENTRYPOINT │ 容器启动时运行的程序(不会被docker run覆盖)
│ COPY │ 复制宿主机文件到镜像
│ ADD │ 同COPY,支持tar自动解压和URL下载
│ WORKDIR │ 设置工作目录
│ VOLUME │ 创建挂载点(绑定Volume)
│ EXPOSE │ 声明容器监听的端口
│ ENV │ 设置环境变量
│ USER │ 指定运行用户
│ ARG │ 构建时参数(可在docker build --build-arg指定)
│ HEALTHCHECK │ 定义健康检查
│ ONBUILD │ 定义触发器(被继承时触发)
│ STOPSIGNAL │ 容器停止时发送的信号
└─────────────────────────────────────────────────────────────────────
CMD vs ENTRYPOINT 对比:
1 2 3 4 5 6 7
| CMD ["nginx", "-g", "daemon off;"] docker run nginx:latest "/bin/sh"
ENTRYPOINT ["nginx"] docker run nginx:latest "-g daemon off;"
|
RUN vs CMD 对比:
RUN → 镜像构建时执行,每行产生一层
CMD → 容器启动时执行,仅最后一个生效
ENTRYPOINT → 启动时执行,始终运行
6.生产级Dockerfile示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| FROM nginx:1.25-alpine
LABEL maintainer="magedu <mage@magedu.com>" LABEL version="1.0" LABEL description="Nginx production image"
WORKDIR /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf COPY conf.d/ /etc/nginx/conf.d/ COPY html/ /usr/share/nginx/html/
ENV TZ=Asia/Shanghai ENV NGINX_HOST=www.magedu.org
RUN addgroup -g 1000 -S nginx && \ adduser -u 1000 -S nginx -G nginx && \ chown -R nginx:nginx /usr/share/nginx/html
EXPOSE 80 443
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f http://localhost/ || exit 1
ENTRYPOINT ["nginx"] CMD ["-g", "daemon off;"]
|
6.资源限制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| docker run --cpu-shares 512 nginx docker run --cpus 2.5 nginx docker run --cpuset-cpus 0-2 nginx
docker run -m 512m nginx docker run --memory-swappiness=0 nginx
docker run --device /dev/sda:/dev/xvdc nginx
docker run --ipc=host nginx
docker run --privileged nginx
|
7.docker常用命令速查
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| docker images docker pull nginx:latest docker save -o nginx.tar nginx docker load -i nginx.tar docker rmi nginx:latest docker tag nginx:latest magedu/nginx:v1
docker ps docker ps -a docker run -d -p 80:80 nginx docker stop/start/rm <container> docker exec -it <container> bash docker logs <container>
docker network ls docker network create mynet docker network connect mynet container1
docker volume ls docker volume create myvol docker volume rm myvol
docker build -t myapp:v1 . docker build --build-arg VER=1.0 -t myapp:v1 .
docker commit container_id magedu/nginx:v1 docker push magedu/nginx:v1
|
8.Registry私有仓库搭建
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| docker run -d -p 5000:5000 --name registry -v /data/registry:/var/lib/registry registry:2
{ "registry-mirrors": ["https://mirror.baidubce.com"], "insecure-registries": ["10.0.0.7:5000"] }
docker tag nginx:latest 10.0.0.7:5000/nginx:latest docker push 10.0.0.7:5000/nginx:latest docker pull 10.0.0.7:5000/nginx:latest
|