Docker 和 Kubernetes 是现代应用开发和部署的基石。这个入门指南将用最直观的方式带你快速理解它们是什么,以及如何开始使用。

第一部分:Docker 入门 - “集装箱”的革命

可以把 Docker 理解为软件行业的集装箱。在集装箱出现之前,货物运输(软件开发)形状各异、依赖复杂,容易损坏。集装箱出现后,所有货物都被打包进标准容器,高效地在船、火车、卡车间流转。


Docker 核心概念
  1. 镜像:一个只读的模板,包含了运行应用所需的全部内容:代码、运行时、库、环境变量和配置文件。它就像是集装箱的设计图纸

    • 例如:一个 nginx:latest 镜像就包含了 Nginx 服务器及其运行环境。

  2. 容器:是镜像的一个运行实例。它就像是根据图纸造出来的、正在海上运输的真实集装箱

    • 容器与宿主机是隔离的,拥有自己的文件系统、网络和进程空间。

    • 你可以启动、停止、删除或移动一个容器。

  3. Dockerfile:一个文本文件,里面包含了一系列用于构建镜像的指令。它就像是编写设计图纸的说明书

Docker 快速上手四步走

第一步:安装 Docker

访问 Docker 官网,下载并安装适合你操作系统的 Docker Desktop。它包含了运行 Docker 所需的一切。

安装后,在终端验证:

bash

docker --version

第二步:运行你的第一个容器

让我们运行一个 Nginx web 服务器。

bash

docker run -d -p 8080:80 --name my-nginx nginx
  • docker run:运行一个容器。

  • -d:在后台运行(分离模式)。

  • -p 8080:80:将宿主机的 8080 端口映射到容器的 80 端口。

  • --name my-nginx:给容器起个名字。

  • nginx:使用的镜像名(如果本地没有,会自动从 Docker Hub 下载)。

现在,打开浏览器访问 http://localhost:8080,你将看到 Nginx 的欢迎页面!

第三步:管理容器

  • 查看运行中的容器

    bash

    docker ps
  • 查看所有容器(包括已停止的)

    bash

    docker ps -a
  • 停止容器

    bash

    docker stop my-nginx
  • 启动已停止的容器

    bash

    docker start my-nginx
  • 进入容器内部(就像 SSH 到服务器一样):

    bash

    docker exec -it my-nginx /bin/bash
    • -it:以交互模式进入。

    • 退出时输入 exit

第四步:构建你自己的镜像

  1. 创建一个新目录,并进入。

  2. 创建一个 Dockerfile 文件:

    dockerfile

    # 使用官方 Python 运行时作为父镜像
    FROM python:3.9-slim
    
    # 设置工作目录为 /app
    WORKDIR /app
    
    # 将当前目录内容复制到容器的 /app 下
    COPY . .
    
    # 安装任何需要的包
    RUN pip install --no-cache-dir flask
    
    # 使端口 80 可供此容器外的环境使用
    EXPOSE 80
    
    # 定义环境变量
    ENV NAME World
    
    # 在容器启动时运行 app.py
    CMD ["python", "app.py"]
  3. 创建一个简单的 Flask 应用 app.py

    python

    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def hello():
        return 'Hello Docker!'
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=80)
  4. 构建镜像:

    bash

    docker build -t my-python-app .
    • -t my-python-app:给镜像打上标签/名字。

    • .:使用当前目录下的 Dockerfile。

  5. 运行你自己的镜像:

    bash

    docker run -d -p 4000:80 --name my-running-app my-python-app

    访问 http://localhost:4000,你将看到 "Hello Docker!"。


第二部分:Kubernetes 入门 - “集装箱船队”的指挥官

当你的应用从一个Docker容器扩展到成百上千个容器时,如何管理它们?这就是 Kubernetes 要解决的问题。Kubernetes 就像一个船队指挥官,自动化地管理、调度和扩展你的容器船队。


Kubernetes 核心概念
  1. Pod:Kubernetes 中最小的部署和管理单位。一个 Pod 可以包含一个或多个紧密相关的容器(比如一个应用容器和一个日志收集容器)。它是船上的一组集装箱

  2. Node:一个物理机或虚拟机,用于运行 Pod。它是船队中的一艘货轮

  3. Cluster:由一组 Node 组成的集合。这就是整个船队

  4. Deployment:定义了 Pod 的期望状态(比如运行 3 个副本)。它负责声明式的更新和回滚应用。它是船队的调度计划

  5. Service:一个稳定的网络端点,用于访问一组功能相同的 Pod(比如负载均衡)。它是船队的统一对外港口,无论背后的 Pod 如何创建销毁,访问方式不变。

Kubernetes 快速上手(使用 Minikube)

Minikube 可以在你的本地电脑上轻松创建一个单节点的 Kubernetes 集群,非常适合学习和测试。

第一步:安装 Minikube 和 kubectl

  1. 安装 kubectl:Kubernetes 的命令行工具,用于指挥“船队”。

  2. 安装 Minikube

第二步:启动集群

bash

minikube start

这个命令会创建一个本地虚拟机并启动 Kubernetes 集群。

第三步:部署你的第一个应用

使用我们之前构建的 my-python-app 镜像。首先,你需要将镜像推送到一个镜像仓库(如 Docker Hub),或者让 Minikube 使用本地镜像。

  • 让 Minikube 使用本地 Docker 镜像

    bash

    eval $(minikube docker-env) # 这步很重要!它让 Minikube 虚拟机使用你本地的 Docker 环境
    docker build -t my-python-app . # 重新构建,这次镜像会存在于 Minikube 内部

创建一个 deployment.yaml 文件:

yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-python-app
spec:
  replicas: 3 # 告诉 Kubernetes 运行 3 个副本 Pod
  selector:
    matchLabels:
      app: my-python-app
  template:
    metadata:
      labels:
        app: my-python-app
    spec:
      containers:
      - name: my-python-app
        image: my-python-app # 使用我们本地构建的镜像
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: my-python-service
spec:
  type: NodePort # 让服务可以从集群外部访问
  selector:
    app: my-python-app # 选择所有标签为 app: my-python-app 的 Pod
  ports:
    - protocol: TCP
      port: 80 # 服务端口
      targetPort: 80 # Pod 的端口

应用这个配置文件:

bash

kubectl apply -f deployment.yaml

第四步:查看和管理你的应用

  • 查看 Deployment

    bash

    kubectl get deployments
  • 查看 Pod

    bash

    kubectl get pods

    你应该会看到 3 个名为 my-python-app-xxxxx 的 Pod。

  • 查看 Service

    bash

    kubectl get services
  • 访问你的应用

    bash

    minikube service my-python-service

    这个命令会自动打开浏览器,访问到你部署的 Flask 应用。

总结:Docker 与 Kubernetes 的关系

特性Docker(集装箱)Kubernetes(船队指挥官)
核心功能构建和运行单个容器。编排和管理成群的容器。
关注点应用本身的打包、隔离和分发。应用的部署、扩展、高可用、自愈
类比制造标准化的集装箱指挥整个船队的航行、调度和维护。

工作流

  1. 开发者用 Docker 将应用打包成镜像。

  2. 运维人员用 Kubernetes 的配置文件(YAML)定义如何部署和运行这个镜像(需要多少副本、如何暴露服务等)。

  3. Kubernetes 从仓库拉取镜像,在集群中调度并运行容器,并确保其始终处于期望状态。

你已经成功入门了 Docker 和 Kubernetes 的基本概念和操作!下一步就是多实践,尝试打包更复杂的应用,并学习 Kubernetes 的更多资源对象,如 ConfigMapSecretIngress 等,来构建更强大的云原生应用。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐