Skip to content

Docker 与虚拟化技术

1. Docker 基础操作

1.1 修改镜像 Tag 和名称

bash
# 修改镜像标签
docker tag <IMAGE_ID> <NEW_NAME>:<NEW_TAG>

# 示例
docker tag abc123 myapp:v2.0

参考:docker 修改tag和image名称

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

参考:使用 Docker 部署 SQL Server

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

10. 相关资源