Docker 与 Kubernetes(K8s)初探

在现代软件开发中,DockerKubernetes(K8s) 已成为构建、部署和管理容器化应用的标准技术。Docker 使应用程序容器化,而 Kubernetes 提供了一个强大、可扩展的平台来管理这些容器。本篇文章将介绍 Docker 与 Kubernetes 的基本概念、它们的关系,以及如何使用它们来部署和管理应用程序。


1. 什么是 Docker?

Docker 是一个开源的容器化平台,它允许开发者将应用程序及其所有依赖打包成 轻量级的、可移植的容器。这些容器可以在不同的环境中一致地运行,从开发到测试再到生产环境。

1.1 Docker 的主要特点

  • 轻量级:共享宿主机内核,避免虚拟机的额外开销。
  • 可移植性:一次构建,随处运行(Run Anywhere)。
  • 快速部署:启动容器的速度比虚拟机快得多。
  • 环境一致性:确保开发、测试、生产环境的一致性,避免"在我电脑上能跑"的问题。

1.2 Docker 的核心概念

  1. 镜像(Image):Docker 镜像是一个只读的模板,包含运行应用程序所需的所有依赖。
  2. 容器(Container):容器是镜像的运行实例,每个容器都是相互隔离的。
  3. Dockerfile:定义如何构建 Docker 镜像的文件。
  4. Docker Compose:用于定义和运行多容器应用的工具。

1.3 Docker 快速示例

1. 安装 Docker

在 Linux(Ubuntu)上安装 Docker:

bash 复制代码
sudo apt update
sudo apt install docker.io -y

在 macOS 或 Windows 上,可以通过 Docker Desktop 进行安装。

2. 运行 Hello World
bash 复制代码
docker run hello-world

这将拉取 hello-world 镜像并在容器中运行它。

3. 运行一个 Nginx 容器
bash 复制代码
docker run -d -p 8080:80 nginx

这将运行一个 Nginx 服务器,并将宿主机的 8080 端口 映射到容器的 80 端口


2. 什么是 Kubernetes?

Kubernetes(K8s) 是一个用于 自动化部署、扩展和管理容器化应用 的开源平台。它提供了容器编排(Container Orchestration),可以自动处理容器的运行、负载均衡、健康检查、滚动更新等功能。

2.1 Kubernetes 的主要特点

  • 自动化部署和扩展:Kubernetes 可以自动部署应用,并根据流量需求自动扩展或缩减容器数量。
  • 负载均衡:K8s 可以自动分配流量,确保应用的高可用性。
  • 自愈能力:如果某个容器崩溃,K8s 会自动重启它。
  • 滚动更新和回滚:可以逐步更新应用,而不会中断服务,并支持回滚。

2.2 Kubernetes 的核心概念

  1. Pod:Kubernetes 中的最小部署单元,通常包含一个或多个容器。
  2. Deployment:管理 Pod 的部署和更新。
  3. Service:提供负载均衡和网络访问。
  4. ConfigMap 和 Secret:用于存储配置信息和敏感数据。
  5. Ingress:管理外部流量访问 K8s 集群中的服务。

3. Docker 与 Kubernetes 的关系

Docker 主要用于 构建和运行容器 ,而 Kubernetes 主要用于 管理这些容器。它们的关系如下:

  • Docker 负责创建和运行单个容器。
  • Kubernetes 负责调度和管理多个容器的运行,确保它们能够高效工作。

换句话说,Docker 解决了 "如何创建和打包应用" 的问题,而 Kubernetes 解决了 "如何大规模运行和管理应用" 的问题。

Docker vs Kubernetes

特性 Docker Kubernetes
作用 容器化技术,用于打包和运行应用 容器编排系统,用于管理和扩展容器
主要功能 构建、分发和运行容器 自动化调度、扩展、负载均衡、自愈
适用场景 适用于开发和小规模部署 适用于生产环境、大规模集群管理

4. 使用 Kubernetes 部署 Docker 容器

4.1 安装 Kubernetes(minikube)

Kubernetes 的完整安装较为复杂,因此推荐使用 Minikube 进行本地测试。

1. 安装 Minikube
bash 复制代码
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
chmod +x minikube
sudo mv minikube /usr/local/bin/
2. 启动 Minikube
bash 复制代码
minikube start

Minikube 会启动一个单节点 Kubernetes 集群。

3. 检查 Kubernetes 状态
bash 复制代码
kubectl get nodes

这将显示 Minikube 创建的 Kubernetes 节点。

4.2 创建 Kubernetes Deployment

使用 Kubernetes 部署一个基于 Docker 的应用。

1. 创建 Deployment
yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: mydockerhubusername/myapp:latest
        ports:
        - containerPort: 8080
2. 部署到 Kubernetes
bash 复制代码
kubectl apply -f deployment.yaml
3. 查看部署状态
bash 复制代码
kubectl get deployments
kubectl get pods

4.3 创建 Kubernetes Service

为了让外部访问我们的应用,我们需要创建一个 Service

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer

部署 Service:

bash 复制代码
kubectl apply -f service.yaml
kubectl get svc

如果你在 Minikube 上运行,可以使用:

bash 复制代码
minikube service myapp-service

来打开服务的访问 URL。


5. Docker 与 Kubernetes 的最佳实践

  1. 使用 CI/CD 自动化构建和部署

    • 使用 JenkinsGitLab CI/CD,自动化构建 Docker 镜像,并部署到 Kubernetes。
  2. 优化 Docker 镜像

    • 使用 多阶段构建(Multi-stage Builds),减少镜像大小,提高安全性。
  3. 监控与日志管理

    • 使用 Prometheus + Grafana 监控 Kubernetes 集群。
    • 使用 ELK(Elasticsearch + Logstash + Kibana) 进行日志管理。
  4. 安全性

    • 使用 RBAC(基于角色的访问控制) 限制 Kubernetes 权限。
    • 定期使用 TrivyAnchore 扫描 Docker 镜像安全漏洞。

6. 总结

  • Docker 负责构建和运行容器 ,而 Kubernetes 负责管理和编排容器
  • Kubernetes 提供了自动化部署、扩展和负载均衡,适用于大规模生产环境。
  • 通过 Minikube 可以在本地快速体验 Kubernetes。
  • CI/CD 集成 可以帮助自动化构建、测试和部署 Docker 容器到 Kubernetes。

随着容器化技术的普及,Docker + Kubernetes 已成为云原生应用的标准架构。熟练掌握这两者的使用,将极大提升你的 DevOps 能力!🚀

相关推荐
Libby博仙21 分钟前
docker 改了镜像源为阿里云,还是下载失败
阿里云·docker·容器
百锦再1 小时前
在Linux上创建一个Docker容器并在其中执行Python脚本
linux·python·docker
钗头风1 小时前
3.Docker常用命令
运维·docker·容器
圣心4 小时前
Ollama Docker 镜像部署
运维·docker·容器
转身後 默落4 小时前
06.Docker 镜像制作和管理
java·docker·容器
_院长大人_14 小时前
Docker Mysql 数据迁移
mysql·adb·docker
ccmjga1 天前
升级 SpringBoot3 全项目讲解 — Spring Boot 3 中如何发Http请求?
java·spring boot·后端·docker·gradle·springboot·spring security
曹天骄1 天前
Docker Compose Installation on CentOS 7.9
docker·eureka·centos
wgslucky1 天前
docker 安装jenkins
docker·容器·jenkins