在 Docker 上为 Windows 在 Kubernetes 上部署 docker-compose 应用程序

Deploying a docker-compose app on Kubernetes on Docker for Windows

我正在尝试按照 https://docs.docker.com/docker-for-windows/kubernetes/#use-docker-commands 上的说明进行 运行 一个针对 Docker 上的 kubernetes 的 docker-compose.yml 文件 Windows.

我正在为 Windows 使用 Docker 的 Edge 版本 -- 18.03.0-ce-rc4 -- 并且我启用了 kubernetes。

我在 https://docs.docker.com/compose/gettingstarted/#step-3-define-services-in-a-compose-file 使用 docker-compose 应用示例,即

version: '3.3'
services:
  web:
    build: .
    ports:
      - '5000:5000'
  redis:
    image: redis

此示例适用于 docker-compose builddocker-compose up

但是根据上面为 docker stack 链接的文档,我得到以下信息:

PS C:\dev\projects\python\kubetest> docker stack deploy --compose-file .\docker-compose.yml mystack
Ignoring unsupported options: build

Stack mystack was created
Waiting for the stack to be stable and running...
 - Service redis has one container running
PS C:\dev\projects\python\kubetest> kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)     AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP     5d
redis        ClusterIP   None         <none>        55555/TCP   8s

请注意,它不会创建 Web 服务以及 "ignoring unsupported options: build" 错误

我也尝试使用上面链接的文档中的示例 docker-compose.yml 文件,但它也没有用,出现完全不同的错误。

简而言之,按照文档,我无法将任何东西部署到 Docker 上的 kubernetes for Windows。

由于缺少对 build 的支持,web 服务容器将没有 image 到 运行。

Compose 可以在单个 Docker 主机上为您管理构建。由于 Swarm 和 Kubernetes 通常 运行 跨多个节点,image 应该引用网络上可用的注册表,以便所有节点都可以访问相同的图像。

Dockers stack deploy example includes a step to setup a private registry 并将其用作图片来源:

services:
  web:
    image: 127.0.0.1:5000/stackdemo

解决方法

在这种情况下,由于 运行ning 在 Docker 实例,这取决于 Kubernetes 的设置方式。

version: '3.3'
services:
  web:
    build: .
    image: me/web
    ports:
      - '5000:5000'
  redis:
    image: redis

在外部构建映像

docker-compose build web

或直接用 docker:

docker build -t me/web .

我运行按照官方说明遇到了同样的问题

为了绕过这个问题,我选择使用 kubectl 将 docker 图像部署到本地 k8s 而不是使用 docker stack(似乎根本原因可能是 --orchestrator kubernetes标志,它不起作用)。

步骤如下:

  1. 每个终端使用 Kubernetes 的 docker 注册表(重要)

    运行 & minikube docker-env | iex 在 Windows Powershell 下(iexInvoke-Expression 的别名)

    运行 eval $(minikube docker-env) 在 bash 环境下。

    之后,运行 docker image ls,确保您的 docker 注册表设置为 Kubernetes 的环境。 (您应该会在 'k8s.gcr.io' 域下看到一些默认图像。)

    如果打开了多个终端,您可能需要在每个 终端中执行此操作。

  2. 重建您的 docker 图像

    运行 docker-compose -f /path/to/your/docker-compose.yml build

    您的镜像应该出现在 K8s 的本地注册表中。

  3. 运行 你的头像 'kubectl':

    运行 kubectl run hello-world --image=myimage --image-pull-policy=Never

参考文献:

有一个项目:

https://github.com/kubernetes/kompose

称为 Docker Kompose,它可以帮助已经拥有 docker-compose 文件的用户通过自动转换他们的文件,尽可能轻松地在 Kubernetes 上部署他们的应用程序现有 docker-将文件组合成许多 yaml 文件。

尽管可以按照建议在 kubernetes 中部署 docker compose yaml。最好创建正确的 kubernetes yaml 以部署在您的特定集群上。

有一些工具可以让您的生活变得简单。

一个这样的工具是 Move2Kube (https://github.com/konveyor/move2kube)。你可以做到

move2kube translate -s <folder containing the dockerfiles>

它可以创建部署应用程序所需的相关部署、服务、入口等。