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 能力!🚀

相关推荐
cleble15 分钟前
(转)使用DockerCompose部署微服务
docker
朱杰jjj2 小时前
Docker容器中无法使用vim、vi命令处理
docker·容器·vim
东林牧之3 小时前
CICD[软件安装]:docker安装gitlab
docker·容器·gitlab
东林牧之3 小时前
CICD[导航]、docker+gitlab+harbor+jenkins从安装到部署
docker·gitlab·jenkins
cui_hao_nan12 小时前
Docker后端部署
运维·docker·容器
大苏打seven13 小时前
Docker学习笔记:Docker网络
笔记·学习·docker
小张是铁粉13 小时前
docker在Linux的安装遇到的问题
linux·docker·容器
没有名字的小羊15 小时前
8.Docker镜像讲解
运维·docker·容器·tomcat
企鹅侠客18 小时前
实践篇:14-构建 Node.js 应用程序镜像
docker·node.js·dockerfile
做一个AC梦18 小时前
Docker安装失败:Docker Desktop installation failed
运维·docker·容器