Docker 与虚拟化技术
1. Docker 基础操作
1.1 修改镜像 Tag 和名称
bash
# 修改镜像标签
docker tag <IMAGE_ID> <NEW_NAME>:<NEW_TAG>
# 示例
docker tag abc123 myapp:v2.0
1.2 Docker 容器重启策略
在运行容器时设置重启策略:
bash
docker run --restart=always <IMAGE_NAME>
重启策略选项:
no
:不自动重启(默认)on-failure
:仅在容器失败时重启always
:总是重启容器unless-stopped
:除非手动停止,否则总是重启
1.3 SQL Server Docker 部署
使用 Docker 快速部署 Microsoft SQL Server:
bash
# 拉取 SQL Server 2022 镜像
docker pull mcr.microsoft.com/mssql/server:2022-latest
# 运行 SQL Server 容器
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong@Passw0rd>" ^
-p 1433:1433 --name sql1 --hostname sql1 ^
--restart always ^
-d ^
mcr.microsoft.com/mssql/server:2022-latest
2. 虚拟化技术对比
2.1 Docker vs K8S vs KVM
- Docker:容器化技术,轻量级虚拟化
- Kubernetes (K8S):容器编排平台,管理大规模容器集群
- KVM:基于内核的虚拟机,完整的硬件虚拟化
参考:https://www.zhihu.com/question/307537564
2.2 容器化与虚拟机的区别
特性 | Docker 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
资源占用 | 低 | 高 |
隔离性 | 进程级 | 操作系统级 |
性能 | 接近原生 | 有性能损耗 |
3. box64 与 Wine
3.1 box64
box64 是一个 Linux 用户空间的 x86-64 模拟器,允许在 ARM64 Linux 系统上运行 x86-64 程序。
3.2 Wine
Wine(Wine Is Not an Emulator)是一个兼容层,能够在类 Unix 操作系统上运行 Windows 应用程序。
结合 box64 和 Wine,可以在 ARM 架构的 Linux 系统上运行 Windows x86-64 应用程序。
4. Docker Compose
4.1 多容器应用编排
使用 Docker Compose 定义和运行多容器 Docker 应用程序:
yaml
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
restart: always
db:
image: postgres:latest
environment:
POSTGRES_PASSWORD: example
volumes:
- pgdata:/var/lib/postgresql/data
restart: always
volumes:
pgdata:
运行命令:
bash
# 启动所有服务
docker-compose up -d
# 停止所有服务
docker-compose down
# 查看服务状态
docker-compose ps
5. Docker 网络
5.1 网络模式
Docker 提供多种网络模式:
- bridge:默认模式,容器间通过虚拟网桥通信
- host:容器使用主机网络栈
- none:容器无网络连接
- overlay:跨主机的容器网络(用于 Swarm)
5.2 创建自定义网络
bash
# 创建网络
docker network create my-network
# 运行容器并连接到网络
docker run -d --network my-network --name container1 nginx
# 查看网络
docker network ls
# 查看网络详情
docker network inspect my-network
6. Docker 数据管理
6.1 Volume vs Bind Mount
- Volume:Docker 管理的存储卷,推荐使用
- Bind Mount:直接挂载主机目录
bash
# 使用 Volume
docker run -v my-volume:/app/data nginx
# 使用 Bind Mount
docker run -v /host/path:/container/path nginx
6.2 数据备份与恢复
bash
# 备份 Volume
docker run --rm -v my-volume:/data -v $(pwd):/backup ubuntu tar czf /backup/backup.tar.gz /data
# 恢复 Volume
docker run --rm -v my-volume:/data -v $(pwd):/backup ubuntu tar xzf /backup/backup.tar.gz -C /
7. Docker 镜像优化
7.1 多阶段构建
使用多阶段构建减小镜像大小:
dockerfile
# 构建阶段
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 运行阶段
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/index.js"]
7.2 镜像层缓存优化
- 将不常变化的指令放在前面
- 合并 RUN 命令减少层数
- 使用
.dockerignore
排除不必要的文件
dockerfile
# .dockerignore
node_modules
*.log
.git
.vscode
8. Docker 安全
8.1 最佳实践
- 使用非 root 用户运行容器
- 限制容器资源使用
- 定期更新基础镜像
- 扫描镜像漏洞
dockerfile
# 创建非 root 用户
FROM node:18-alpine
RUN addgroup -g 1001 -S nodejs && adduser -S nodejs -u 1001
USER nodejs
8.2 资源限制
bash
# 限制 CPU 和内存
docker run -d \
--cpus=".5" \
--memory="512m" \
--name limited-container \
nginx
9. Kubernetes 入门
9.1 基本概念
- Pod:最小部署单元,包含一个或多个容器
- Service:为 Pod 提供稳定的网络访问
- Deployment:声明式地管理 Pod
- Namespace:资源隔离
9.2 kubectl 常用命令
bash
# 查看 Pod
kubectl get pods
# 创建 Deployment
kubectl create deployment nginx --image=nginx
# 暴露服务
kubectl expose deployment nginx --port=80 --type=LoadBalancer
# 查看服务
kubectl get services
# 查看日志
kubectl logs <pod-name>
# 进入容器
kubectl exec -it <pod-name> -- /bin/bash