docker笔记大全

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
# 1. Bind Mount(绑定挂载)— 指定宿主机路径
docker run -v /host/path:/container/path busybox
# 例: docker run -v /data/nginx:/var/www/html nginx

# 2. Docker Managed Volume(Docker管理的卷)— 由Docker创建
docker run -v xxx:/container/path busybox
# 例: docker run -v xxx:/data busybox
# 数据存储在 /var/lib/docker/volumes/ 下

Volume 共享方式:

1
2
3
4
5
6
7
# 方式1:多个容器挂载同一宿主机目录
docker run -v /docker/volumes/v1:/data --name c1 busybox
docker run -v /docker/volumes/v1:/data --name c2 busybox

# 方式2:--volumes-from 继承卷
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> # 绑定特定IP
-P # 暴露所有EXPOSE端口

# 示例
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:可被 docker run 命令覆盖
CMD ["nginx", "-g", "daemon off;"]
docker run nginx:latest "/bin/sh" # 覆盖CMD

# ENTRYPOINT:不会被 docker run 覆盖,参数追加
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

# 创建非root用户
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
# CPU限制
docker run --cpu-shares 512 nginx # CPU份额(相对权重)
docker run --cpus 2.5 nginx # 限制CPU核数
docker run --cpuset-cpus 0-2 nginx # 绑定CPU核心

# 内存限制
docker run -m 512m nginx # 内存限制512MB
docker run --memory-swappiness=0 nginx # 禁用swap

# 设备访问
docker run --device /dev/sda:/dev/xvdc nginx

# 共享内存
docker run --ipc=host nginx # 共享宿主机IPC命名空间

# 特权容器(谨慎使用)
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
# 启动私有Registry
docker run -d -p 5000:5000 --name registry -v /data/registry:/var/lib/registry registry:2

# 配置镜像仓库地址
# /etc/docker/daemon.json
{
"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