[IT]Docker 和 Kubernetes入门
Docker 和 Kubernetes 是现代应用开发和部署的基石。这个入门指南将用最直观的方式带你快速理解它们是什么,以及如何开始使用。
第一部分:Docker 入门 - “集装箱”的革命
可以把 Docker 理解为软件行业的集装箱。在集装箱出现之前,货物运输(软件开发)形状各异、依赖复杂,容易损坏。集装箱出现后,所有货物都被打包进标准容器,高效地在船、火车、卡车间流转。
Docker 核心概念
-
镜像:一个只读的模板,包含了运行应用所需的全部内容:代码、运行时、库、环境变量和配置文件。它就像是集装箱的设计图纸。
-
例如:一个
nginx:latest镜像就包含了 Nginx 服务器及其运行环境。
-
-
容器:是镜像的一个运行实例。它就像是根据图纸造出来的、正在海上运输的真实集装箱。
-
容器与宿主机是隔离的,拥有自己的文件系统、网络和进程空间。
-
你可以启动、停止、删除或移动一个容器。
-
-
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。
-
第四步:构建你自己的镜像
-
创建一个新目录,并进入。
-
创建一个
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"]
-
创建一个简单的 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) -
构建镜像:
bash
docker build -t my-python-app .
-
-t my-python-app:给镜像打上标签/名字。 -
.:使用当前目录下的 Dockerfile。
-
-
运行你自己的镜像:
bash
docker run -d -p 4000:80 --name my-running-app my-python-app
访问
http://localhost:4000,你将看到 "Hello Docker!"。
第二部分:Kubernetes 入门 - “集装箱船队”的指挥官
当你的应用从一个Docker容器扩展到成百上千个容器时,如何管理它们?这就是 Kubernetes 要解决的问题。Kubernetes 就像一个船队指挥官,自动化地管理、调度和扩展你的容器船队。
Kubernetes 核心概念
-
Pod:Kubernetes 中最小的部署和管理单位。一个 Pod 可以包含一个或多个紧密相关的容器(比如一个应用容器和一个日志收集容器)。它是船上的一组集装箱。
-
Node:一个物理机或虚拟机,用于运行 Pod。它是船队中的一艘货轮。
-
Cluster:由一组 Node 组成的集合。这就是整个船队。
-
Deployment:定义了 Pod 的期望状态(比如运行 3 个副本)。它负责声明式的更新和回滚应用。它是船队的调度计划。
-
Service:一个稳定的网络端点,用于访问一组功能相同的 Pod(比如负载均衡)。它是船队的统一对外港口,无论背后的 Pod 如何创建销毁,访问方式不变。
Kubernetes 快速上手(使用 Minikube)
Minikube 可以在你的本地电脑上轻松创建一个单节点的 Kubernetes 集群,非常适合学习和测试。
第一步:安装 Minikube 和 kubectl
-
安装 kubectl:Kubernetes 的命令行工具,用于指挥“船队”。
-
跟随 官方安装指南。
-
-
安装 Minikube:
-
跟随 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(船队指挥官) |
|---|---|---|
| 核心功能 | 构建和运行单个容器。 | 编排和管理成群的容器。 |
| 关注点 | 应用本身的打包、隔离和分发。 | 应用的部署、扩展、高可用、自愈。 |
| 类比 | 制造标准化的集装箱。 | 指挥整个船队的航行、调度和维护。 |
工作流:
-
开发者用 Docker 将应用打包成镜像。
-
运维人员用 Kubernetes 的配置文件(YAML)定义如何部署和运行这个镜像(需要多少副本、如何暴露服务等)。
-
Kubernetes 从仓库拉取镜像,在集群中调度并运行容器,并确保其始终处于期望状态。
你已经成功入门了 Docker 和 Kubernetes 的基本概念和操作!下一步就是多实践,尝试打包更复杂的应用,并学习 Kubernetes 的更多资源对象,如 ConfigMap, Secret, Ingress 等,来构建更强大的云原生应用。
更多推荐



所有评论(0)