一、Docker核心概念解析
1. 基础定义
- 容器(Container):从镜像创建的轻量级运行实例,提供独立隔离的运行环境,支持跨环境一致运行。
- 镜像(Image):容器的模板,包含应用程序、依赖库、配置文件等所有运行所需资源。
- Dockerfile:定义镜像构建流程的脚本文件,通过指令描述镜像的生成逻辑。
- Docker Hub:全球最大的公共镜像仓库,用于存储、下载和分享镜像。
2. 架构组件
组件名称 |
功能描述 |
Docker Client |
用户交互入口,通过命令行或API向Docker Daemon发送操作请求。 |
Docker Daemon |
后台守护进程,负责处理容器、镜像、网络、存储等核心操作。 |
Docker Image |
只读的镜像文件,用于创建容器实例。 |
Docker Container |
镜像的运行实例,包含独立的文件系统、进程空间和资源限制。 |
Docker Registry |
镜像仓库,支持私有或公共存储(如Docker Hub、Harbor)。 |
Docker网络 |
管理容器间通信,支持桥接、主机、覆盖网络等多种模式。 |
Docker存储 |
提供数据持久化方案,包括Volume、Bind Mounts和tmpfs Mounts。 |
Docker Swarm |
容器编排工具,用于管理跨主机的容器集群。 |
二、Docker运行机制与隔离技术
1. 运行流程
- 用户通过
Docker Client
向Docker Daemon
发送请求(如创建容器)。
Docker Daemon
通过Docker Engine
解析请求,以Job形式执行具体任务。
- 若需镜像,从
Docker Registry
拉取并通过Graph Driver
存储为分层镜像。
Network Driver
配置容器网络(如桥接模式下的虚拟网桥)。
Exec Driver
负责容器资源限制(如CPU、内存)和指令执行。
2. 容器隔离技术
- 命名空间(Namespaces):隔离进程(PID)、网络(NET)、文件系统(MNT)等资源,确保容器间互不干扰。
- 控制组(cgroups):通过Linux内核功能限制容器的CPU、内存、I/O等资源使用上限。
- 文件系统隔离:基于UnionFS(如OverlayFS)实现镜像分层,容器层修改不影响基础镜像。
- 网络隔离:通过虚拟网桥、IPtables规则实现容器间网络隔离或通信。
- 安全机制:支持SELinux/AppArmor等安全策略,限制容器对宿主机的访问权限。
三、快速入门与核心操作
1. 安装与配置
- 下载地址:Docker官方下载页
- 镜像源配置(提升拉取速度):
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
],
"debug": true,
"experimental": false
}
2. 基础验证命令
docker run hello-world # 验证Docker安装是否成功
3. 系统管理命令
操作场景 |
命令示例 |
说明 |
查看系统信息 |
docker info |
显示Docker版本、镜像存储路径等 |
查看版本信息 |
docker version |
客户端与守护进程版本 |
监控资源使用 |
docker stats |
实时显示容器CPU、内存占用 |
清理无效资源 |
docker system prune -a --volumes |
删除停止容器、未使用镜像和卷 |
四、容器生命周期管理
1. 容器操作命令
操作场景 |
命令示例 |
说明 |
启动容器 |
docker run -itd --name my-nginx nginx:latest |
后台运行Nginx容器,命名为my-nginx |
列出运行中容器 |
docker ps |
-l 显示最新创建的容器 |
列出所有容器 |
docker ps -a |
包括已停止的容器 |
停止/重启容器 |
docker stop/restart <容器ID> |
-t 30 等待30秒强制停止 |
删除容器 |
docker rm <容器ID> |
-f 强制删除正在运行的容器 |
查看容器日志 |
docker logs -f <容器名> |
实时追踪日志输出 |
进入容器终端 |
docker exec -it <容器名> bash |
在容器内执行交互式Shell |
2. 数据管理
五、镜像操作指南
1. 镜像生命周期管理
操作场景 |
命令示例 |
说明 |
拉取镜像 |
docker pull ubuntu:22.04 |
拉取指定版本的Ubuntu镜像 |
查看本地镜像 |
docker images |
-q 仅显示镜像ID |
删除镜像 |
docker rmi -f <镜像ID> |
强制删除镜像 |
推送镜像到仓库 |
docker push my-repo/my-image:v1 |
需先登录私有仓库 |
搜索公共镜像 |
docker search --stars=3+ mysql |
查找评分≥3的MySQL镜像 |
2. Dockerfile最佳实践
# 基础镜像
FROM ubuntu:22.04
# 维护者信息
LABEL maintainer="admin@example.com"
# 安装依赖
RUN apt-get update && apt-get install -y curl
# 复制文件到镜像
COPY app/ /app/
# 设置工作目录
WORKDIR /app
# 定义启动命令
CMD ["python", "app.py"]
3. 多阶段构建(精简镜像体积)
# 构建阶段:使用Go环境编译应用
FROM golang:alpine AS builder
WORKDIR /src
COPY . .
RUN go build -o myapp
# 最终阶段:使用最小化镜像运行应用
FROM alpine
COPY --from=builder /src/myapp /app/
CMD ["/app/myapp"]
六、网络与端口配置
1. 网络模式
模式 |
特点 |
适用场景 |
bridge |
默认模式,容器通过虚拟网桥与宿主机通信,支持端口映射。 |
单主机多容器通信 |
host |
容器直接使用宿主机网络,无网络隔离。 |
高性能网络需求场景 |
none |
容器无网络连接,完全隔离。 |
安全敏感型应用 |
overlay |
跨主机集群网络,支持Docker Swarm集群内容器通信。 |
分布式应用部署 |
2. 端口映射
docker run -p 8080:80 -p 443:443 my-web-app # 映射宿主机8080→容器80,443→443
docker run -P my-app # 自动映射镜像中EXPOSE声明的所有端口
七、Docker Compose 实战
1. compose.yml示例
version: '3.8'
services:
web:
build: ./web # 基于./web目录的Dockerfile构建
ports:
- "8080:80" # 端口映射
depends_on:
- db # 确保db服务先启动
db:
image: mysql:5.7 # 使用官方MySQL镜像
environment:
MYSQL_ROOT_PASSWORD: secret # 设置环境变量
volumes:
- db-data:/var/lib/mysql # 挂载数据卷
volumes:
db-data: # 定义命名卷
networks:
app-net: # 定义自定义网络
driver: bridge
2. 常用命令
docker-compose up -d # 后台启动所有服务
docker-compose down --volumes # 停止并删除容器、网络和卷
docker-compose logs web # 查看web服务日志
八、数据持久化方案
1. 数据卷(Volumes)
docker volume create my-vol # 创建命名卷
docker run -v my-vol:/data app # 挂载卷到容器/data目录
2. 绑定挂载(Bind Mounts)
docker run -v /host/path:/container/path app # 挂载宿主机目录到容器
3. 内存挂载(tmpfs)
docker run -v tmpfs:/tmp app # 在容器/tmp目录使用内存存储(重启后数据丢失)
九、高级特性与安全建议
1. 镜像优化原则
- 避免使用
latest
标签,指定明确版本(如nginx:1.23.3
)。
- 合并
RUN
指令减少镜像层数(如RUN apt-get update && install -y curl
)。
- 清理临时文件(如
RUN rm -rf /var/lib/apt/lists/*
)。
2. 安全最佳实践
3. 镜像迁移建议
十、参考资源
文章评论