在Kubernetes(K8s)中,部署MySQL数据库的时候经常会使用Docker容器来实现,但是要保证MySQL数据在容器重启或删除后不丢失,需要将数据保存在持久化存储中。下面我将为你详细讲解如何在Docker中保存MySQL数据。

整个过程可以分为以下几个步骤:

| 步骤 | 内容 |
| -------- | -------- |
| 步骤一 | 创建PersistentVolume(PV)用于存储MySQL数据 |
| 步骤二 | 创建PersistentVolumeClaim(PVC)与PV绑定,以获取存储资源 |
| 步骤三 | 创建MySQL Deployment并指定PV/PVC |
| 步骤四 | 创建Service以暴露MySQL服务 |

接下来针对每一步进行详细解释,并提供相应的代码示例:

### 步骤一:创建PersistentVolume(PV)

我们需要定义一个PersistentVolume,用于持久化存储MySQL的数据。以下是一个示例PV的YAML文件:

```yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/mysql
```

在上述示例中,我们创建了一个名为mysql-pv的PV,指定了存储空间为1Gi,并且将数据存储在宿主机的`/data/mysql`路径下。

### 步骤二:创建PersistentVolumeClaim(PVC)

接下来我们创建一个PersistentVolumeClaim,用于获取上面创建的PV提供的存储资源。以下是一个示例PVC的YAML文件:

```yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
```

在上述示例中,我们创建了一个名为mysql-pvc的PVC,并且请求了1Gi的存储资源。

### 步骤三:创建MySQL Deployment

现在我们可以创建一个MySQL Deployment,并指定之前创建的PV/PVC。以下是一个示例MySQL Deployment的YAML文件:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-deployment
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:latest
env:
- name: MYSQL_ROOT_PASSWORD
value: password
volumeMounts:
- mountPath: /var/lib/mysql
name: mysql-storage
volumes:
- name: mysql-storage
persistentVolumeClaim:
claimName: mysql-pvc
```

在上述示例中,我们创建了一个名为mysql-deployment的Deployment,使用了MySQL的官方镜像,并且将PV/PVC绑定到了Deployment的容器中。

### 步骤四:创建Service

最后我们创建一个Service,以暴露MySQL服务。以下是一个示例Service的YAML文件:

```yaml
apiVersion: v1
kind: Service
metadata:
name: mysql-service
spec:
selector:
app: mysql
ports:
- protocol: TCP
port: 3306
targetPort: 3306
type: NodePort
```

在上述示例中,我们创建了一个名为mysql-service的Service,并将其指向之前创建的MySQL Deployment。Service类型为NodePort,以便在集群外部可以访问MySQL服务。

通过以上过程,我们成功地将MySQL数据保存在了Docker容器中。希望这篇文章对你有所帮助,如果有任何问题欢迎随时向我提问。