Kubernetes Docker Compose 迁移

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: Kubernetes Docker Compose 迁移


网络异常,图片无法展示
|

网络异常,图片无法展示
|

在构建现代的无状态应用程序时,将应用程序的组件容器化是在分布式平台上部署和扩展的第一步。如果你在开发中使用过 Docker Compose,你可以通过以下方式对应用程序进行容器化:

  • 从代码中提取必要的配置信息。
  • 卸载应用程序的状态。
  • 打包你的应用程序以供重复使用。

编写指定容器镜像应如何运行的服务定义。

要在 Kubernetes 等分布式平台上运行服务,你需要将 Compose 服务定义转换为 Kubernetes 对象,这将使你能够灵活地扩展你的应用程序。kompose 这个工具可以帮助开发人员将 Compose 工作流迁移到 Kubernetes 或 OpenShift 等平台。

在本教程中,你将使用 kompose 将 Compose 服务转换为 Kubernetes 对象。你将使用 kompose 提供的对象定义作为起点并进行调整,以确保你的设置将以 Kubernetes 期望的方式使用 Secrets、Services 和 PersistentVolumeClaims。在本教程结束时,你将拥有一个单实例 Node.js 应用程序,其中包含在 Kubernetes 集群上运行的 MongoDB 数据库。

先决条件

  • 启用了基于 RBAC 的 Kubernetes 1.10+ 集群。我们这里将使用 DigitalOcean Kubernetes 集群,但你可以使用其他方法自由创建集群。
  • kubectl 命令行工具安装在你的本地机器或开发服务器上并配置连接到你的集群。
  • 安装在本地机器或开发服务器上的 Docker。
  • 一个 Docker Hub 帐户。

1.安装 kompose

要开始使用 kompose,请导航到项目的 GitHub Releases 页面,下载最新版本的 kompose:

curl -L https://github.com/kubernetes/kompose/releases/download/v1.18.0/kompose-linux-amd64 -o kompose

有关在非 Linux 系统上安装的详细信息,请参阅安装说明。

使二进制可执行文件:

chmod +x kompose

将其移动到 PATH 路径:

sudo mv ./kompose /usr/local/bin/kompose

要验证它是否已正确安装,你可以进行版本检查:

kompose version

如果安装成功,你将看到如下输出:

1.18.0 (06a2e56)

安装好并准备好使用 kompose 后,你现在可以克隆你将要转换到 Kubernetes 的 Node.js 项目代码。

2.打包应用程序

要将我们的应用程序与 Kubernetes 一起使用,我们需要克隆项目代码并打包应用程序,以便 kubelet 服务可以拉取镜像。

我们的第一步是从 DigitalOcean 社区 GitHub 帐户克隆 node-mongo-docker-dev 代码仓库,此存储库包含使用 Docker Compose 将 Node.js 应用程序容器化的代码,该代码使用 Node.js 来演示如何使用 Docker Compose 设置开发环境。

将代码库克隆到名为 node_project 的目录中:

git clone https://github.com/do-community/node-mongo-docker-dev.git node_project

导航到 node_project 目录:

cd node_project

node_project 目录包含用于处理用户输入的鲨鱼信息应用程序的文件和目录。它可以与容器一起使用:敏感和特定的配置信息已从应用程序代码中删除,并重构为在运行时注入,应用程序的状态已转移到 MongoDB 数据库。

项目目录中包含一个 Dockerfile 文件,其中包含构建应用程序镜像的说明。现在让我们构建镜像,以便可以将其推送到你的 Docker Hub 帐户并在你的 Kubernetes 安装中使用它。

使用 docker build 命令,使用 -t 标志构建镜像,这允许你使用易于记忆的名称对其进行标记。在这种情况下,使用你的 Docker Hub 用户名标记镜像并

将其命名为 node-kubernetes 或你自己选择的名称:

docker build -t your_dockerhub_username/node-kubernetes .

. 在命令中指定构建上下文是当前目录。

构建镜像大约需要一两分钟。完成后,检查你的镜像:

docker images

正常情况下你将看到以下输出:

REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZEyour_dockerhub_username/node-kubernetes   latest              9c6f897e1fbc        3 seconds ago       90MBnode                                      10-alpine           94f3c8956482        12 days ago         71MB

接下来,登录到你在先决条件中创建的 Docker Hub 帐户:

docker login -u your_dockerhub_username

出现提示时,输入你的 Docker Hub 帐户密码。以这种方式登录将使用你的 Docker Hub 凭据在用户的主目录中创建一个 ~/.docker/config.json 文件。

使用 docker push 命令将应用程序镜像推送到 Docker Hub。请记住将 your_dockerhub_username 替换为你自己的 Docker Hub 用户名:

docker push your_dockerhub_username/node-kubernetes

你现在有一个应用程序镜像了,你可以拉取该镜像以使用 Kubernetes 运行你的应用程序。下一步是将你的应用程序服务定义转换为 Kubernetes 对象。

3.使用 kompose 转换 Compose

我们的 Docker Compose 文件(docker-compose.yaml)列出了将使用 Compose 运行我们的服务的定义。Compose 中的服务是一个正在运行的容器,services 定义包含有关每个容器镜像如何运行的信息。在这一步中,我们将通过使用 kompose 创建 yaml 文件将这些定义转换为 Kubernetes 对象。这些文件将包含描述其所需状态的 Kubernetes 对象的规范。

我们将使用这些文件来创建不同类型的对象,Service 将确保运行我们容器的 Pod 保持可访问性;Deployment 将包含有关我们的 Pod 所需状态的信息;为我们的数据库数据提供存储的 PersistentVolumeClaim;运行时注入的环境变量的 ConfigMap;以及我们应用程序的数据库用户和密码的 Secret。其中一些定义将在 kompose 为我们创建的文件中,而其他定义则需要我们自己创建。

首先,我们需要修改 docker-compose.yaml 文件中的一些定义以使用 Kubernetes。我们将在我们的 nodejs 服务定义中包含对我们新建的应用程序镜像的引用,并删除我们用于在开发中使用 Compose 运行应用程序容器的挂载、卷和其他命令。此外,我们将重新定义两个容器的重启策略,以符合 Kubernetes 所期望的行为。

使用 nano 或你喜欢的编辑器打开文件:

nano docker-compose.yaml

nodejs 应用程序服务的当前定义如下所示:

# ~/node_project/docker-compose.yaml...services:  nodejs:    build:      context: .      dockerfile: Dockerfile    image: nodejs    container_name: nodejs    restart: unless-stopped    env_file: .env    environment:      - MONGO_USERNAME=$MONGO_USERNAME      - MONGO_PASSWORD=$MONGO_PASSWORD      - MONGO_HOSTNAME=db      - MONGO_PORT=$MONGO_PORT      - MONGO_DB=$MONGO_DB     ports:      - "80:8080"    volumes:      - .:/home/node/app      - node_modules:/home/node/app/node_modules    networks:      - app-network    command: ./wait-for.sh db:27017 -- /home/node/app/node_modules/.bin/nodemon app.js...

对上面的服务定义进行以下编辑:

  • 使用你的 node-kubernetes 镜像而不是本地 Dockerfile。
  • 将容器重启策略从 unless-stopped 更改为 always
  • 删除卷列表和命令指令。

完成的服务定义现在将如下所示:

# ~/node_project/docker-compose.yaml...services:  nodejs:    image: your_dockerhub_username/node-kubernetes    container_name: nodejs    restart: always    env_file: .env    environment:      - MONGO_USERNAME=$MONGO_USERNAME      - MONGO_PASSWORD=$MONGO_PASSWORD      - MONGO_HOSTNAME=db      - MONGO_PORT=$MONGO_PORT      - MONGO_DB=$MONGO_DB     ports:      - "80:8080"    networks:      - app-network...

接下来,向下滚动到 db 服务定义。在这里,进行以下编辑:

  • 将服务的重启策略更改为 always。
  • 删除 .env 文件,我们将使用在步骤 4 中创建的 Secret 将 MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD 的值传递给数据库容器,而不是使用 .env 文件中的值。

db 服务定义现在如下所示:

# ~/node_project/docker-compose.yaml...  db:    image: mongo:4.1.8-xenial    container_name: db    restart: always    environment:      - MONGO_INITDB_ROOT_USERNAME=$MONGO_USERNAME      - MONGO_INITDB_ROOT_PASSWORD=$MONGO_PASSWORD    volumes:        - dbdata:/data/db       networks:      - app-network...

最后,在文件的底部,删除 node_modules 卷,对应的 key 看起来像这样:

# ~/node_project/docker-compose.yaml...volumes:  dbdata:

完成编辑后保存并关闭文件。


在翻译我们的服务定义之前,我们需要编写 .env 文件,kompose 将使用它来使用我们的非敏感信息创建 ConfigMap。创建文件:

nano .env

kompose 将使用这个文件为我们的应用程序创建一个 ConfigMap。但是,我们不会在 Compose 文件中分配来自 nodejs 服务定义的所有变量,而是仅添加 MONGO_DB 数据库名称和 MONGO_PORT。当我们在第 4 步手动创建 Secret 对象时,我们将分别分配数据库用户名和密码。

将以下端口和数据库名称信息添加到 .env 文件。如果你愿意,可以随意重命名你的数据库:

# ~/node_project/.envMONGO_PORT=27017MONGO_DB=sharkinfo

完成编辑后保存并关闭文件。

你现在已准备好使用你的对象规范创建文件。kompose 提供了多种翻译资源的选项。你可以:

  • 使用 kompose convert 根据 docker-compose.yaml 文件中的服务定义创建 yaml 文件。
  • 使用 kompose up 直接创建 Kubernetes 对象。
  • 使用 kompose convert -c 创建 Helm Chart。

现在,我们将我们的服务定义转换为 yaml 文件,然后添加和修改 kompose 创建的文件。

使用以下命令将你的服务定义转换为 yaml 文件:

kompose convert

你还可以使用 -f 标志命名特定或多个 Compose 文件。

运行此命令后,kompose 将输出有关它创建的文件的信息:

INFO Kubernetes file "nodejs-service.yaml" created INFO Kubernetes file "db-deployment.yaml" created INFO Kubernetes file "dbdata-persistentvolumeclaim.yaml" created INFO Kubernetes file "nodejs-deployment.yaml" created INFO Kubernetes file "nodejs-env-configmap.yaml" created

其中包含 Node 应用程序 Service、Deployment 和 ConfigMap 以及 dbdata PersistentVolumeClaim 和 MongoDB 数据库 Deployment 的 yaml 文件。

这些文件是一个很好的起点,但为了使我们的应用程序的功能与使用 Docker Compose 将 Node.js 应用程序容器化以进行开发中描述的设置相匹配,我们需要对 kompose 生成的文件进行一些添加和更改。

4.创建 Kubernetes Secret

为了让我们的应用程序以我们期望的方式运行,我们需要对 kompose 创建的文件进行一些修改。这些更改中的第一个将为我们的数据库用户和密码生成一个 Secret,并将其添加到我们的应用程序和数据库 Deployment 中。Kubernetes 提供了两种使用环境变量的方式:ConfigMaps 和 Secrets。kompose 已经使用我们在 .env 文件中包含的非机密信息创建了一个 ConfigMap,因此我们现在将使用我们的机密信息创建一个 Secret:我们的数据库用户名和密码。手动创建 Secret 的第一步是将你的用户名和密码转换为 base64,这是一种允许你统一传输数据(包括二进制数据)的编码方案。

转换你的数据库用户名:

echo -n 'your_database_username' | base64

记下你在输出中看到的值。接下来,转换你的密码:

echo -n 'your_database_password' | base64

还要注意此处输出中的值。

打开 Secret 文件:

nano secret.yaml

注意:Kubernetes 对象通常使用 YAML 定义,它严格禁止制表符,并且需要两个空格进行缩进。如果你想检查任何 yaml 文件的格式,可以使用 linter 或使用带有 --dry-run--validate 标志的 kubectl create 测试语法的有效性:kubectl create -f your_yaml_file.yaml --dry-run --validate=true

通常,在使用 kubectl 创建资源之前验证你的语法是一个好主意。

将以下代码添加到文件中以创建一个 Secret,它将使用你刚刚创建的编码值定义你的 MONGO_USERNAMEMONGO_PASSWORD。请务必将此处的虚拟值替换为你的编码用户名和密码:

# ~/node_project/secret.yamlapiVersion: v1kind: Secretmetadata:  name: mongo-secretdata:  MONGO_USERNAME: your_encoded_username  MONGO_PASSWORD: your_encoded_password

我们已将 Secret 对象命名为 mongo-secret,但你可以随意命名它。

完成编辑后保存并关闭此文件。正如你对 .env 文件所做的那样,请务必将 secret.yaml 添加到你的 .gitignore 文件中,以使其不受版本控制。

编写完 secret.yaml 后,下一步将确保我们的应用程序和数据库 Pod 都使用我们添加到文件中的值。让我们首先在我们的应用 Deployment 中添加对 Secret 的引用。

打开名为 nodejs-deployment.yaml 的文件:

nano nodejs-deployment.yaml

该文件的容器规范包括在 env 键下定义的以下环境变量:

# ~/node_project/nodejs-deployment.yamlapiVersion: apps/v1kind: Deployment...    spec:      containers:      - env:        - name: MONGO_DB          valueFrom:            configMapKeyRef:              key: MONGO_DB              name: nodejs-env        - name: MONGO_HOSTNAME          value: db        - name: MONGO_PASSWORD        - name: MONGO_PORT          valueFrom:            configMapKeyRef:              key: MONGO_PORT              name: nodejs-env        - name: MONGO_USERNAME

我们需要向此处列出的 MONGO_USERNAMEMONGO_PASSWORD 变量添加对 Secret 的引用,以便我们的应用程序可以访问这些值。我们不会像 MONGO_DBMONGO_PORT 的值那样包含一个 configMapKeyRef 键来指向我们的 nodejs-env ConfigMap,而是包含一个 secretKeyRef 键来指向我们的 mongo-secret 密钥中的值。

将以下 Secret 引用添加到 MONGO_USERNAMEMONGO_PASSWORD 变量:

# ~/node_project/nodejs-deployment.yamlapiVersion: apps/v1kind: Deployment...    spec:      containers:      - env:        - name: MONGO_DB          valueFrom:            configMapKeyRef:              key: MONGO_DB              name: nodejs-env        - name: MONGO_HOSTNAME          value: db        - name: MONGO_PASSWORD          valueFrom:            secretKeyRef:              name: mongo-secret              key: MONGO_PASSWORD        - name: MONGO_PORT          valueFrom:            configMapKeyRef:              key: MONGO_PORT              name: nodejs-env        - name: MONGO_USERNAME          valueFrom:            secretKeyRef:              name: mongo-secret              key: MONGO_USERNAME

完成编辑后保存并关闭文件。

接下来,我们将相同的值添加到 db-deployment.yaml 文件中。

打开文件进行编辑:

nano db-deployment.yaml

在此文件中,我们将为以下变量键添加对 Secret 的引用:MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD。mongo 镜像使这些变量,以便你可以修改数据库实例的初始化。MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD 一起在 admin 身份验证数据库中创建一个 root 用户,并确保在数据库容器启动时启用身份验证。

使用我们在 Secret 中设置的值可确保我们将拥有一个对数据库实例具有 root 权限的应用程序用户,并可以访问该角色的所有管理和操作权限。在生产中工作时,你需要创建一个具有适当范围权限的专用应用程序用户。


MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD 变量下,添加对 Secret 值的引用:

# ~/node_project/db-deployment.yamlapiVersion: apps/v1kind: Deployment...    spec:      containers:      - env:        - name: MONGO_INITDB_ROOT_PASSWORD          valueFrom:            secretKeyRef:              name: mongo-secret              key: MONGO_PASSWORD                - name: MONGO_INITDB_ROOT_USERNAME          valueFrom:            secretKeyRef:              name: mongo-secret              key: MONGO_USERNAME        image: mongo:4.1.8-xenial...

完成编辑后保存并关闭文件。

有了 Secret,你可以继续创建数据库服务,并确保你的应用程序容器仅在完全设置和初始化后才尝试连接到数据库。

5.创建数据库和应用初始化容器

现在我们有了 Secret,我们可以继续创建我们的数据库服务和一个初始化容器,它将轮询这个服务,以确保我们的应用程序只在数据库启动任务后尝试连接到数据库,包括创建 MONGO_INITDB 用户和密码。

打开一个文件来定义数据库服务的规范:

nano db-service.yaml

将以下代码添加到文件中以定义服务:

# ~/node_project/db-service.yamlapiVersion: v1kind: Servicemetadata:  annotations:     kompose.cmd: kompose convert    kompose.version: 1.18.0 (06a2e56)  creationTimestamp: null  labels:    io.kompose.service: db  name: dbspec:  ports:  - port: 27017    targetPort: 27017  selector:    io.kompose.service: dbstatus:  loadBalancer: {}

我们在此处包含的选择器将将此 Service 对象与我们的数据库 Pod 匹配,这些 Pod 已使用标签 io.kompose.service: db 通过 kompose 在 db-deployment.yaml 文件中定义。我们还将此 Service 命名为 db。

完成编辑后保存并关闭文件。

接下来,让我们在 nodejs-deployment.yaml 中的容器数组中添加一个 Init Container 字段。这将创建一个 Init 容器,我们可以使用它来延迟我们的应用程序容器的启动,直到使用可访问的 Pod 创建 db 服务。

打开 nodejs-deployment.yaml 文件:

nano nodejs-deployment.yaml

在 Pod 规范中和容器数组旁边,我们将添加一个带有容器的 initContainers 字段,该容器将轮询 db 服务。

在 nodejs 容器数组中的端口和资源字段下方以及 restartPolicy 上方添加以下代码:

# ~/node_project/nodejs-deployment.yamlapiVersion: apps/v1kind: Deployment...    spec:      containers:      ...        name: nodejs        ports:        - containerPort: 8080        resources: {}      initContainers:      - name: init-db        image: busybox        command: ['sh', '-c', 'until nc -z db:27017; do echo waiting for db; sleep 2; done;']      restartPolicy: Always...

此 Init Container 使用 BusyBox 镜像,这是一个包含许多 UNIX 实用程序的轻量级镜像。在这种情况下,我们将使用 netcat 来轮询与 db 服务关联的 Pod 是否在端口 27017 上接受 TCP 连接。

此容器命令复制了我们在步骤 3 中从 docker-compose.yaml 文件中删除的等待脚本的功能。初始化容器运行完成;在我们的例子中,这意味着我们的 Node 应用程序容器在数据库容器运行并接受端口 27017 上的连接之前不会启动。db 服务定义允许我们保证这个功能,而不管数据库容器的确切位置是可变的。

完成编辑后保存并关闭文件。

创建数据库服务并准备好 Init Container 以控制容器的启动顺序后,你可以继续检查 PersistentVolumeClaim 中的存储要求并使用 LoadBalancer 公开你的应用程序服务。

6.修改 PVC 并暴露应用

在运行我们的应用程序之前,我们将进行两项最终更改,以确保我们的数据库存储将被正确配置,并且我们可以使用 LoadBalancer 暴露我们的应用程序前端。

首先,让我们修改 kompose 为我们创建的 PersistentVolumeClaim 中定义的存储资源。这个声明允许我们动态配置存储来管理我们应用程序的状态。

要使用 PersistentVolumeClaims,你必须创建一个 StorageClass 并将其配置为供应存储资源。在我们的例子中,因为我们使用的是 DigitalOcean Kubernetes,所以我们的默认 StorageClass 配置器设置为 dobs.csi.digitalocean.com — DigitalOcean 块存储。

我们可以使用以下命令进行检查:

kubectl get storageclass

如果你使用的是 DigitalOcean 集群,你将看到以下输出:

NAME                         PROVISIONER                 AGEdo-block-storage (default)   dobs.csi.digitalocean.com   76m

如果你不使用 DigitalOcean 集群,则需要创建一个 StorageClass 。有关如何执行此操作的

当 kompose 创建 dbdata-persistentvolumeclaim.yaml 时,它将存储资源设置为不满足我们要求的大小。因此,我们需要修改 PersistentVolumeClaim 以使用最小可行的 DigitalOcean 块存储单元:1GB。请随意修改它以满足你的存储要求。

打开 dbdata-persistentvolumeclaim.yaml

nano dbdata-persistentvolumeclaim.yaml

将存储值替换为 1Gi:

# ~/node_project/dbdata-persistentvolumeclaim.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata:  creationTimestamp: null  labels:    io.kompose.service: dbdata  name: dbdataspec:  accessModes:  - ReadWriteOnce  resources:    requests:      storage: 1Gistatus: {}

另请注意 accessMode:ReadWriteOnce 意味着由于此声明而配置的卷将只能由单个节点读写。

完成后保存并关闭文件。

接下来,打开 nodejs-service.yaml

nano nodejs-service.yaml

我们将使用 DigitalOcean 负载均衡器在外部暴露此服务。如果你没有使用 DigitalOcean 集群,请查阅你的云提供商的相关文档以获取有关其负载均衡器的信息。

在 Service 规范中,将 LoadBalancer 指定为服务类型:

# ~/node_project/nodejs-service.yamlapiVersion: v1kind: Service...spec:  type: LoadBalancer  ports:...

当我们创建 nodejs 服务时,会自动创建一个负载均衡器,为我们提供一个外部 IP,我们可以在其中访问我们的应用程序。

完成编辑后保存并关闭文件。

准备好所有文件后,我们就可以开始并测试应用程序了。

7.启动和访问应用程序

是时候创建我们的 Kubernetes 对象并测试我们的应用程序是否按预期工作了。

要创建我们定义的对象,我们将使用带有 -f 标志的 kubectl create 命令,这将允许我们指定 kompose 为我们创建的文件以及我们编写的文件。运行以下命令创建 Node 应用和 MongoDB 数据库 Service 和 Deployment,以及你的 Secret、ConfigMap 和 PersistentVolumeClaim:

kubectl create -f nodejs-service.yaml,nodejs-deployment.yaml,nodejs-env-configmap.yaml,db-service.yaml,db-deployment.yaml,dbdata-persistentvolumeclaim.yaml,secret.yaml

你将看到以下输出,表明对象已创建:

service/nodejs createddeployment.extensions/nodejs createdconfigmap/nodejs-env createdservice/db createddeployment.extensions/db createdpersistentvolumeclaim/dbdata createdsecret/mongo-secret created

要检查你的 Pod 是否正在运行,请输入:

kubectl get pods

你无需在此处指定命名空间,因为我们已经在默认命名空间中创建了对象。

当你的 db 容器正在启动并且你的应用程序 Init Container 正在运行时,你将看到以下输出:

NAME                      READY   STATUS              RESTARTS   AGEdb-679d658576-kfpsl       0/1     ContainerCreating   0          10snodejs-6b9585dc8b-pnsws   0/1     Init:0/1            0          10s

一旦该容器运行并且你的应用程序和数据库容器已启动,你将看到以下输出:

NAME                      READY   STATUS    RESTARTS   AGEdb-679d658576-kfpsl       1/1     Running   0          54snodejs-6b9585dc8b-pnsws   1/1     Running   0          54s

Running STATUS 表示你的 Pod 已绑定到节点,并且与这些 Pod 关联的容器正在运行。READY 表示一个 Pod 中有多少个容器正在运行。

注意:如果你在 STATUS 列中看到意外阶段,请记住你可以使用以下命令对 Pod 进行故障排除:

kubectl describe pods your_podkubectl logs your_pod

随着你的容器运行,你现在可以访问该应用程序。要获取 LoadBalancer 的 IP,请键入:

kubectl get svc

你将看到以下输出:

NAME         TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)        AGEdb           ClusterIP      10.245.189.250   <none>           27017/TCP      93skubernetes   ClusterIP      10.245.0.1       <none>           443/TCP        25m12snodejs       LoadBalancer   10.245.15.56     your_lb_ip       80:30729/TCP   93s

与 nodejs 服务关联的 EXTERNAL_IP 是你可以访问应用程序的 IP 地址。如果你在 EXTERNAL_IP 列中看到状态,这意味着你的负载均衡器仍在创建中。

在该列中看到 IP 后,在浏览器中导航到它:http://your_lb_ip

你应该看到以下登录页面:

网络异常,图片无法展示
|

单击获取鲨鱼信息按钮。你将看到一个带有输入表单的页面,你可以在其中输入鲨鱼名称和对该鲨鱼一般特征的描述:

网络异常,图片无法展示
|

在表格中,添加你选择的鲨鱼。为了演示,我们将 Megalodon Shark 添加到 Shark Name 字段,并将 Ancient 到 Shark Character 字段:

网络异常,图片无法展示
|

单击提交按钮。你将看到一个页面,其中向你显示此鲨鱼信息:

网络异常,图片无法展示
|

你现在拥有一个 Node.js 应用程序的单实例应用,其中包含在 Kubernetes 集群上运行的 MongoDB 数据库。


相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
4天前
|
Kubernetes Java 调度
Java容器技术:Docker与Kubernetes
Java容器技术:Docker与Kubernetes
16 0
|
4天前
|
Kubernetes 负载均衡 调度
【Docker 专栏】Docker Swarm 与 Kubernetes 的选型指南
【5月更文挑战第8天】Docker Swarm 和 Kubernetes 是两大容器编排工具,各有优势。Docker Swarm 简单易用,适合小到中型规模,与 Docker 生态系统集成紧密;而 Kubernetes 功能强大,扩展性好,适用于大规模、复杂场景。选择时需考虑团队技术能力、应用需求及现有技术栈。Kubernetes 学习曲线较陡,Docker Swarm 则较平缓。
【Docker 专栏】Docker Swarm 与 Kubernetes 的选型指南
|
5天前
|
Kubernetes Cloud Native 持续交付
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
【5月更文挑战第7天】本文探讨了Docker和Kubernetes如何协同构建和管理云原生应用。Docker提供容器化技术,Kubernetes则负责容器的部署和管理。两者结合实现快速部署、自动扩展和高可用性。通过编写Dockerfile创建镜像,然后在Kubernetes中定义部署和服务进行应用暴露。实战部分展示了如何部署简单Web应用,包括编写Dockerfile、构建镜像、创建Kubernetes部署配置以及暴露服务。Kubernetes还具备自动扩展、滚动更新和健康检查等高级特性,为云原生应用管理提供全面支持。
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
|
5天前
|
前端开发 API 数据库
【Docker专栏】Docker Compose实战:编排多容器应用
【5月更文挑战第7天】Docker Compose是Docker的多容器管理工具,通过YAML文件简化多容器应用部署。它能一键启动、停止服务,保证开发、测试和生产环境的一致性。安装后,创建`docker-compose.yml`文件定义服务,如示例中的web和db服务。使用`docker-compose up -d`启动服务,通过`docker-compose ps`、`stop`、`down`和`logs`命令管理服务。
【Docker专栏】Docker Compose实战:编排多容器应用
|
7天前
|
Kubernetes Cloud Native Go
Golang深入浅出之-Go语言中的云原生开发:Kubernetes与Docker
【5月更文挑战第5天】本文探讨了Go语言在云原生开发中的应用,特别是在Kubernetes和Docker中的使用。Docker利用Go语言的性能和跨平台能力编写Dockerfile和构建镜像。Kubernetes,主要由Go语言编写,提供了方便的客户端库与集群交互。文章列举了Dockerfile编写、Kubernetes资源定义和服务发现的常见问题及解决方案,并给出了Go语言构建Docker镜像和与Kubernetes交互的代码示例。通过掌握这些技巧,开发者能更高效地进行云原生应用开发。
49 1
|
敏捷开发 存储 安全
传统应用的docker化迁移
Docker是云技术和IT技术的未来,这一点正在被越来越多的公司认识到,但是对于传统企业来说,如何将传统的应用迁移到Docker是一个迫切需要解决的问题。传统企业,尤其是国内的传统企业,IT建设普遍滞后,当大多数互联网公司都在大面积使用Docker的时候,传统企业还在为虚拟化、公有云[注]和敏捷开发挣扎。很多企业都在提工业4.0,但是信息化建设却没有提高到一定的高度。企业的信息化程度,很大程度上决定了企业的生产效率,而 Docker则从应用层面提出了非常好的解决方案。本文也将从迁移的角度来阐述如何在传统企业中使用Docker。 传统应用容器化迁移的思考 对于传统应用来说,使用和不使用Dock
313 0
|
3天前
|
存储 安全 数据安全/隐私保护
【Docker 专栏】Docker 容器化应用的备份与恢复策略
【5月更文挑战第9天】本文探讨了Docker容器化应用的备份与恢复策略,强调了备份在数据保护、业务连续性和合规要求中的关键作用。内容涵盖备份的重要性、内容及方法,推荐了Docker自带工具和第三方工具如Portainer、Velero。制定了备份策略,包括频率、存储位置和保留期限,并详细阐述了恢复流程及注意事项。文章还提及案例分析和未来发展趋势,强调了随着技术发展,备份与恢复策略将持续演进,以应对数字化时代的挑战。
【Docker 专栏】Docker 容器化应用的备份与恢复策略
|
3天前
|
监控 Kubernetes Docker
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
【5月更文挑战第9天】本文探讨了Docker容器中应用的健康检查与自动恢复,强调其对应用稳定性和系统性能的重要性。健康检查包括进程、端口和应用特定检查,而自动恢复则涉及重启容器和重新部署。Docker原生及第三方工具(如Kubernetes)提供了相关功能。配置检查需考虑检查频率、应用特性和监控告警。案例分析展示了实际操作,未来发展趋势将趋向更智能和高效的检查恢复机制。
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
|
2天前
|
NoSQL Redis Docker
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
12 0
|
3天前
|
缓存 关系型数据库 数据库
【Docker 专栏】Docker 与容器化数据库的集成与优化
【5月更文挑战第9天】本文探讨了Docker与容器化数据库集成的优势,如快速部署、环境一致性、资源隔离和可扩展性,并列举了常见容器化数据库(如MySQL、PostgreSQL和MongoDB)。讨论了集成方法、注意事项、优化策略,包括资源调整、缓存优化和监控告警。此外,强调了数据备份、恢复测试及性能评估的重要性。未来,随着技术发展,二者的集成将更紧密,为数据管理带来更多可能性。掌握此技术将应对数字化时代的机遇与挑战。
【Docker 专栏】Docker 与容器化数据库的集成与优化