Docker基本概念
🎯 学习目标
- 深入理解Docker的核心概念
- 掌握镜像、容器、仓库的关系
- 学会使用基本的Docker命令
- 了解Docker的分层架构和存储原理
📚 核心概念详解
1. 镜像(Images)
Docker镜像是一个只读的模板,包含了运行应用程序所需的所有内容。
javascript
// 镜像概念解析
const dockerImage = {
definition: '只读的应用程序模板',
characteristics: {
layered: '分层存储结构',
immutable: '不可变性',
cacheable: '可缓存复用',
portable: '跨平台移植'
},
structure: {
baseLayer: '基础操作系统层',
appLayer: '应用程序层',
configLayer: '配置文件层',
metadataLayer: '元数据层'
},
naming: {
format: 'registry/namespace/repository:tag',
examples: [
'nginx:latest',
'node:16-alpine',
'mysql:8.0',
'ubuntu:20.04'
]
}
};
console.log('Docker镜像概念:', dockerImage);
镜像分层架构
bash
# 查看镜像层级结构
docker history nginx:latest
# 查看镜像详细信息
docker inspect nginx:latest
# 查看镜像大小
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
mermaid
graph TD
A[应用层] --> B[依赖层]
B --> C[运行时层]
C --> D[基础OS层]
D --> E[内核层]
style A fill:#ff9999
style B fill:#ffcc99
style C fill:#ffff99
style D fill:#ccffcc
style E fill:#ccccff
2. 容器(Containers)
容器是镜像的运行实例,提供了隔离的运行环境。
javascript
// 容器概念解析
const dockerContainer = {
definition: '镜像的可运行实例',
lifecycle: {
created: '容器已创建但未启动',
running: '容器正在运行',
paused: '容器已暂停',
stopped: '容器已停止',
deleted: '容器已删除'
},
features: {
isolation: '进程和文件系统隔离',
networking: '独立的网络栈',
storage: '可写的容器层',
resources: 'CPU和内存限制'
},
components: {
process: '主进程和子进程',
filesystem: '联合文件系统',
network: '虚拟网络接口',
metadata: '容器配置信息'
}
};
console.log('Docker容器概念:', dockerContainer);
容器生命周期管理
bash
# 创建容器(不启动)
docker create --name my-nginx nginx:latest
# 启动容器
docker start my-nginx
# 创建并启动容器
docker run --name web-server -d -p 8080:80 nginx:latest
# 查看容器状态
docker ps # 运行中的容器
docker ps -a # 所有容器
docker ps -q # 只显示容器ID
# 暂停和恢复容器
docker pause my-nginx
docker unpause my-nginx
# 停止容器
docker stop my-nginx # 优雅停止
docker kill my-nginx # 强制停止
# 重启容器
docker restart my-nginx
# 删除容器
docker rm my-nginx # 删除已停止的容器
docker rm -f my-nginx # 强制删除运行中的容器
3. 仓库(Registry)
Docker仓库是存储和分发镜像的服务。
javascript
// 仓库概念解析
const dockerRegistry = {
definition: '镜像存储和分发服务',
types: {
public: {
'Docker Hub': 'hub.docker.com - 官方公共仓库',
'Quay.io': 'quay.io - Red Hat的容器仓库',
'GitHub Container Registry': 'ghcr.io - GitHub容器仓库'
},
private: {
'Harbor': '企业级私有仓库',
'Nexus': 'Sonatype的制品仓库',
'AWS ECR': 'Amazon弹性容器仓库'
}
},
structure: {
namespace: '命名空间/组织',
repository: '镜像仓库',
tag: '版本标签',
manifest: '镜像清单'
},
operations: {
push: '推送镜像到仓库',
pull: '从仓库拉取镜像',
search: '搜索镜像',
login: '登录仓库认证'
}
};
console.log('Docker仓库概念:', dockerRegistry);
仓库操作示例
bash
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx:latest
docker pull nginx:1.21-alpine
# 查看本地镜像
docker images
docker images nginx
# 给镜像打标签
docker tag nginx:latest myregistry.com/nginx:v1.0
# 推送镜像到仓库
docker login myregistry.com
docker push myregistry.com/nginx:v1.0
# 删除本地镜像
docker rmi nginx:latest
docker rmi -f nginx:latest # 强制删除
🔧 基本Docker命令
信息查看命令
bash
# 系统信息
docker info # Docker系统信息
docker version # Docker版本信息
docker system df # 磁盘使用情况
docker system events # 实时事件流
# 帮助信息
docker --help # Docker帮助
docker run --help # 具体命令帮助
镜像管理命令
bash
# 镜像操作
docker images # 列出镜像
docker images -a # 显示所有镜像(包括中间层)
docker images --filter "dangling=true" # 显示悬空镜像
docker images --format "json" # JSON格式输出
# 镜像清理
docker image prune # 清理悬空镜像
docker image prune -a # 清理未使用的镜像
docker rmi $(docker images -q) # 删除所有镜像
容器管理命令
bash
# 容器运行
docker run nginx # 前台运行
docker run -d nginx # 后台运行
docker run -it ubuntu bash # 交互式运行
docker run --rm ubuntu echo "hello" # 运行后自动删除
# 容器操作
docker exec -it container_name bash # 进入运行中的容器
docker attach container_name # 附加到容器主进程
docker logs container_name # 查看容器日志
docker logs -f container_name # 实时查看日志
# 容器清理
docker container prune # 清理停止的容器
docker rm $(docker ps -aq) # 删除所有容器
网络和存储命令
bash
# 网络管理
docker network ls # 列出网络
docker network create my-network # 创建网络
docker network inspect bridge # 查看网络详情
docker network rm my-network # 删除网络
# 存储管理
docker volume ls # 列出数据卷
docker volume create my-volume # 创建数据卷
docker volume inspect my-volume # 查看数据卷详情
docker volume rm my-volume # 删除数据卷
🛠️ 实际操作示例
1. 运行Web服务器
bash
# 运行Nginx服务器
docker run -d \
--name web-server \
-p 8080:80 \
-v $(pwd)/html:/usr/share/nginx/html:ro \
nginx:alpine
# 创建测试页面
mkdir -p html
echo "<h1>Hello Docker!</h1>" > html/index.html
# 访问服务
curl http://localhost:8080
# 查看容器日志
docker logs web-server
# 进入容器
docker exec -it web-server sh
2. 运行数据库
bash
# 运行MySQL数据库
docker run -d \
--name mysql-db \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-e MYSQL_DATABASE=testdb \
-p 3306:3306 \
-v mysql-data:/var/lib/mysql \
mysql:8.0
# 连接数据库
docker exec -it mysql-db mysql -uroot -p
# 查看数据库容器资源使用
docker stats mysql-db
3. 多容器应用
bash
# 创建网络
docker network create app-network
# 运行数据库
docker run -d \
--name app-db \
--network app-network \
-e POSTGRES_DB=appdb \
-e POSTGRES_USER=appuser \
-e POSTGRES_PASSWORD=apppass \
postgres:13
# 运行应用
docker run -d \
--name app-server \
--network app-network \
-p 3000:3000 \
-e DATABASE_URL=postgresql://appuser:apppass@app-db:5432/appdb \
node:16-alpine \
sh -c "npm start"
# 查看网络连接
docker network inspect app-network
📊 Docker分层存储
联合文件系统(Union File System)
mermaid
graph TD
A[容器层 - 可写] --> B[镜像层4 - 只读]
B --> C[镜像层3 - 只读]
C --> D[镜像层2 - 只读]
D --> E[镜像层1 - 只读]
E --> F[基础层 - 只读]
style A fill:#ff9999
style B fill:#ffcc99
style C fill:#ffff99
style D fill:#ccffcc
style E fill:#ccccff
style F fill:#e6ccff
存储驱动程序
bash
# 查看存储驱动
docker info | grep "Storage Driver"
# 常见存储驱动
# overlay2 - 推荐的存储驱动
# aufs - 旧版Ubuntu默认
# devicemapper - CentOS/RHEL默认
# btrfs - SUSE默认
写时复制(Copy-on-Write)
javascript
// 写时复制机制
const copyOnWrite = {
principle: '只有在修改文件时才复制到容器层',
benefits: [
'节省存储空间',
'快速启动容器',
'高效镜像分享'
],
process: {
read: '直接从镜像层读取文件',
write: '复制文件到容器层再修改',
delete: '在容器层创建删除标记'
},
optimization: [
'使用.dockerignore减少构建上下文',
'合并RUN指令减少层数',
'使用多阶段构建优化镜像大小'
]
};
console.log('写时复制机制:', copyOnWrite);
🔍 容器监控和调试
容器状态监控
bash
# 实时监控容器资源使用
docker stats
# 监控特定容器
docker stats web-server mysql-db
# 查看容器进程
docker top web-server
# 查看容器文件系统变化
docker diff web-server
# 查看容器端口映射
docker port web-server
容器调试技巧
bash
# 查看容器启动命令
docker inspect web-server | grep -A 10 '"Cmd"'
# 查看容器环境变量
docker inspect web-server | grep -A 10 '"Env"'
# 查看容器挂载点
docker inspect web-server | grep -A 10 '"Mounts"'
# 进入容器调试
docker exec -it web-server /bin/bash
docker exec -it web-server /bin/sh
# 从容器复制文件
docker cp web-server:/etc/nginx/nginx.conf ./nginx.conf
docker cp ./index.html web-server:/usr/share/nginx/html/
日志管理
bash
# 查看容器日志
docker logs web-server
docker logs -f web-server # 实时查看
docker logs --tail 100 web-server # 查看最后100行
docker logs --since 2023-01-01 web-server # 查看指定时间后的日志
# 配置日志驱动
docker run -d \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx:alpine
🎯 最佳实践
1. 镜像最佳实践
bash
# 使用官方基础镜像
FROM node:16-alpine
# 使用特定版本标签
FROM nginx:1.21-alpine
# 多阶段构建
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
2. 容器最佳实践
bash
# 使用非root用户
docker run --user 1000:1000 nginx
# 限制资源使用
docker run -m 512m --cpus="1.5" nginx
# 设置重启策略
docker run --restart unless-stopped nginx
# 使用健康检查
docker run --health-cmd="curl -f http://localhost/ || exit 1" nginx
3. 安全最佳实践
bash
# 使用只读根文件系统
docker run --read-only nginx
# 删除不必要的能力
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE nginx
# 使用安全计算模式
docker run --security-opt seccomp=default.json nginx
📝 下一步
现在您已经掌握了Docker的基本概念,接下来学习:
- Docker镜像操作 - 深入学习镜像的构建和管理
- Docker容器操作 - 掌握容器的高级操作技巧
🎯 本章要点
- ✅ 镜像是只读模板,容器是镜像的运行实例
- ✅ Docker使用分层存储和写时复制机制
- ✅ 仓库用于存储和分发镜像
- ✅ 掌握基本的Docker命令操作
- ✅ 了解容器监控和调试方法
继续深入学习Docker技术!🐳