8. 集装箱化部署

使用容器化应用的方法有很多种,从最简单的(简单的Docker图像)到复杂的(Kubernetes等等)。

备注

这种部署需要 docker application 以便安装和运行。检查一下这个 tutorial

提示

Docker运行预打包的应用程序(又名图像),可以作为源代码(Dockerfile和资源)检索以构建或已从注册表(私有或公共)构建。

备注

QGIS Debian-Ubuntu包下载需要有效的gpg身份验证密钥。请参阅 installation pages 以更新以下Dockerfile。

8.1. 简单的坞站图像

因为扩展坞图像不存在于公共注册表中。你将需要建造它。为此,请创建一个目录 qgis-server 并在其目录中:

  • 创建文件 Dockerfile 内容如下:

FROM debian:bullseye-slim

ENV LANG=en_EN.UTF-8


RUN apt-get update \
    && apt-get install --no-install-recommends --no-install-suggests --allow-unauthenticated -y \
        gnupg \
        ca-certificates \
        wget \
        locales \
    && localedef -i en_US -f UTF-8 en_US.UTF-8 \
    # Add the current key for package downloading
    # Please refer to QGIS install documentation (https://www.qgis.org/fr/site/forusers/alldownloads.html#debian-ubuntu)
    && mkdir -m755 -p /etc/apt/keyrings \
    && wget -O /etc/apt/keyrings/qgis-archive-keyring.gpg https://download.qgis.org/downloads/qgis-archive-keyring.gpg \
    # Add repository for latest version of qgis-server
    # Please refer to QGIS repositories documentation if you want other version (https://qgis.org/en/site/forusers/alldownloads.html#repositories)
    && echo "deb [signed-by=/etc/apt/keyrings/qgis-archive-keyring.gpg] https://qgis.org/debian bullseye main" | tee /etc/apt/sources.list.d/qgis.list \
    && apt-get update \
    && apt-get install --no-install-recommends --no-install-suggests --allow-unauthenticated -y \
        qgis-server \
        spawn-fcgi \
        xauth \
        xvfb \
    && apt-get remove --purge -y \
        gnupg \
        wget \
    && rm -rf /var/lib/apt/lists/*

RUN useradd -m qgis

ENV TINI_VERSION v0.19.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini

ENV QGIS_PREFIX_PATH /usr
ENV QGIS_SERVER_LOG_STDERR 1
ENV QGIS_SERVER_LOG_LEVEL 2

COPY cmd.sh /home/qgis/cmd.sh
RUN chmod -R 777 /home/qgis/cmd.sh
RUN chown qgis:qgis /home/qgis/cmd.sh

USER qgis
WORKDIR /home/qgis

ENTRYPOINT ["/tini", "--"]

CMD ["/home/qgis/cmd.sh"]
  • 创建文件 cmd.sh 内容如下:

#!/bin/bash

[[ $DEBUG == "1" ]] && env

exec /usr/bin/xvfb-run --auto-servernum --server-num=1 /usr/bin/spawn-fcgi -p 5555 -n -d /home/qgis -- /usr/lib/cgi-bin/qgis_mapserv.fcgi
  • 使用以下工具构建映像:

docker build -f Dockerfile -t qgis-server ./

8.1.1. 第一次运行

要运行服务器,您需要一个QGIS项目文件。你可以用你的一个或挑一个 this sample

为此,请创建一个目录 data 在目录中 qgis-server 并将您的文件复制到其中。要符合以下说明,请将其重命名为 osm.qgs

备注

您可能需要将通告的URL添加到 QGIS Server 选项卡中的 Project ► Properties 如果GetCapbilites被摧毁了。例如,如果您的服务器暴露在端口8080上,您将把它作为通告的URL http://localhost:8080/qgis-server/ 。有关更多信息,请参阅部分 配置您的项目 以及随后的。

现在,您可以使用以下命令运行服务器:

docker network create qgis
docker run -d --rm --name qgis-server --net=qgis --hostname=qgis-server \
              -v $(pwd)/data:/data:ro -p 5555:5555 \
              -e "QGIS_PROJECT_FILE=/data/osm.qgs" \
              qgis-server

使用的选项:

  • -d :在后台运行

  • --rm :当容器停止时将其移除

  • --name 要创建的容器的名称

  • --net :(先前创建的)子网络

  • --hostname :容器主机名,供以后参考

  • -v :容器挂载的本地数据目录

  • -p :主机/容器端口映射

  • -e :要在容器中使用的环境变量

要进行检查,请键入 docker ps | grep qgis-server 您应该会看到一条带有 qgis-server **

CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS         PORTS                    NAMES
4de8192da76e   qgis-server   "/tini -- /home/qgis…"   3 seconds ago   Up 2 seconds   0.0.0.0:5555->5555/tcp   qgis-server

8.1.2. 可用样本

因为服务器只接受fast cgi连接,所以您需要一个处理该协议的HTTP服务器。为此,我们必须创建一个简单的nginx配置文件并启动一个nginx映像。

创建文件 nginx.conf 在包含此内容的当前目录中:

server {
  listen 80;
  server_name _;
  location / {
    root  /usr/share/nginx/html;
    index index.html index.htm;
  }
  location /qgis-server {
    proxy_buffers 16 16k;
    proxy_buffer_size 16k;
    gzip off;
    include fastcgi_params;
    fastcgi_pass qgis-server:5555;
  }
}

并键入以下命令:

docker run -d --rm --name nginx --net=qgis --hostname=nginx \
              -v $(pwd)/nginx.conf:/etc/nginx/conf.d/default.conf:ro -p 8080:80 \
              nginx:1.13

要检查功能可用性,请键入浏览器http://localhost:8080/qgis-server/?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities

8.1.3. 清理

要清理正在运行的映像,请键入以下内容:

docker stop qgis-server nginx

8.2. 码头堆栈

前面的方法是脚本化的,但不容易打包,也不容易标准化或易于管理。

要使用扩展坞图像集,您可以使用由管弦乐团管理的扩展坞堆栈。在堆栈中,镜像工作在相同的专用网络中,您可以启动/停止整个堆栈,也可以将堆栈部署到其他工作进程。管弦乐团有很多人,比如斯沃特、库伯内斯和梅索斯。

在以下内容中,我们将为测试目的提供简单的配置。它们不适合生产。

8.2.1. 蜂群/码头-组成

Docker现在有了自己的协调器:Sarm(与docker-compose文件兼容)。你不得不 enable it (Mac版本也可以在Linux上运行)。

堆栈描述

现在您已经让Sarm工作了,接下来创建服务文件(请参见 Deploy to Swarm ) qgis-stack.yaml

version: '3.7'

services:
  qgis-server:
    # Should use version with utf-8 locale support:
    image: qgis-server:latest
    volumes:
      - REPLACE_WITH_FULL_PATH/data:/data:ro
    environment:
      - LANG=en_EN.UTF-8
      - QGIS_PROJECT_FILE=/data/osm.qgs
      - QGIS_SERVER_LOG_LEVEL=0  # INFO (log all requests)
      - DEBUG=1                  # display env before spawning QGIS Server

  nginx:
    image: nginx:1.13
    ports:
      - 8080:80
    volumes:
      - REPLACE_WITH_FULL_PATH/nginx.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - qgis-server

要部署(或更新)堆栈,请键入以下内容:

docker stack deploy -c qgis-stack.yaml qgis-stack

检查堆栈部署状态,直到您获得 1/1replicas 专栏:

docker stack services qgis-stack

类似于:

ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
gmx7ewlvwsqt        qgis_nginx          replicated          1/1                 nginx:1.13          *:8080->80/tcp
l0v2e7cl43u3        qgis_qgis-server    replicated          1/1                 qgis-server:latest

要检查wms功能,请输入Web浏览器http://localhost:8080/qgis-server/?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities

清理

要进行清理,请键入:

docker stack rm qgis-stack

8.2.2. 库伯

安装

如果你有一个 Docker Desktop 安装,使用Kubernetes(又名K8)非常简单: enable k8s

如果不是,请按照 minikube tutorialmicrok8s for Ubuntu

由于Kubernetes的安装可能非常复杂,我们将只关注此演示使用的方面。有关更多/更深入的信息,请查看 official documentation

Microk8s

Microk8需要额外的步骤:您必须启用注册表并标记qgis服务器映像,以便让Kubernetes找到创建的映像。

首先,启用注册表:

microk8s enable dashboard dns registry

然后,标记映像并将其推送到新创建的注册表中:

docker tag qgis-server 127.0.0.1:32000/qgis-server && docker push 127.0.0.1:32000/qgis-server

最后,添加或完成 /etc/docker/daemon.json 要让您的注册表 127.0.0.1:32000 中列出的 insecure-registries 字段:

{
  "insecure-registries": ["127.0.0.1:32000"]
}

创建清单

Kubernetes描述了要在YAML清单中部署的对象。有许多不同的类型,但我们将只使用部署(处理Pod,即扩展底座映像)和服务来将部署公开给内部或外部目的。

部署清单

创建文件 deployments.yaml 内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: qgis-server
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      myLabel: qgis-server
  template:
    metadata:
      labels:
        myLabel: qgis-server
    spec:
      containers:
        - name: qgis-server
          image: localhost:32000/qgis-server:latest
          imagePullPolicy: Always
          env:
            - name: LANG
              value: en_EN.UTF-8
            - name: QGIS_PROJECT_FILE
              value: /data/osm.qgs
            - name: QGIS_SERVER_LOG_LEVEL
              value: "0"
            - name: DEBUG
              value: "1"
          ports:
            - containerPort: 5555
          volumeMounts:
            - name: qgis-data
              mountPath: /data/
      volumes:
        - name: qgis-data
          hostPath:
            path: REPLACE_WITH_FULL_PATH/data

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: qgis-nginx
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      myLabel: qgis-nginx
  template:
    metadata:
      labels:
        myLabel: qgis-nginx
    spec:
      containers:
        - name: qgis-nginx
          image: nginx:1.13
          ports:
            - containerPort: 80
          volumeMounts:
            - name: nginx-conf
              mountPath: /etc/nginx/conf.d/
      volumes:
        - name: nginx-conf
          configMap:
            name: nginx-configuration

---
kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-configuration
data:
  nginx.conf: |
    server {
      listen 80;
      server_name _;
      location / {
        root  /usr/share/nginx/html;
        index index.html index.htm;
      }
      location /qgis-server {
        proxy_buffers 16 16k;
        proxy_buffer_size 16k;
        gzip off;
        include fastcgi_params;
        fastcgi_pass qgis-server:5555;
        }
      }
服务清单

创建文件 services.yaml 内容如下:

apiVersion: v1
kind: Service
metadata:
  name: qgis-server
  namespace: default
spec:
  type: ClusterIP
  selector:
    myLabel: qgis-server
  ports:
    - port: 5555
      targetPort: 5555
---
apiVersion: v1
kind: Service
metadata:
  name: qgis-nginx
  namespace: default
spec:
  type: NodePort
  selector:
    myLabel: qgis-nginx
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30080

部署清单

要在Kubernetes中部署映像和服务,用户可以使用仪表板(单击 + 位于右上角)或命令行。

备注

在将命令行与microk8一起使用时,您必须在每个命令前面加上 microk8s

要部署或更新清单,请执行以下操作:

kubectl apply -f ./

要检查当前部署的内容,请执行以下操作:

kubectl get pods,services,deployment

您应该获得如下内容::

NAME                               READY   STATUS    RESTARTS   AGE
pod/qgis-nginx-54845ff6f6-8skp9    1/1     Running   0          27m
pod/qgis-server-75df8ddd89-c7t7s   1/1     Running   0          27m

NAME                       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/Kubernetes         ClusterIP   10.152.183.1     <none>        443/TCP        5h51m
service/qgis-exec-server   ClusterIP   10.152.183.218   <none>        5555/TCP       35m
service/qgis-nginx         NodePort    10.152.183.234   <none>        80:30080/TCP   27m
service/qgis-server        ClusterIP   10.152.183.132   <none>        5555/TCP       27m

NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/qgis-nginx    1/1     1            1           27m
deployment.apps/qgis-server   1/1     1            1           27m

要读取nginx/qgis日志,请键入以下内容:

kubectl logs -f POD_NAME

要检查wms功能,请输入Web浏览器http://localhost:30080/qgis-server/?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities

清理

要进行清理,请键入以下内容:

kubectl delete service/qgis-server service/qgis-nginx deployment/qgis-nginx deployment/qgis-server configmap/nginx-configuration

8.3. 云部署

管理您自己的服务器集群以处理容器化应用程序的部署是一项复杂的工作。您必须在不同的级别处理多个问题,如硬件、带宽和安全。

当您不想专注于基础设施管理时,云部署解决方案可能是一个很好的选择。

云部署可以使用专有机制,但它们也与前面解释的阶段兼容 (docker imagesstack management )。

8.3.1. AWS使用案例

借助Amazon AWS,通过 ECS (Elastic Container Service) 功能,您可以使用docker-compose或kubernetes兼容的包装器来管理您的堆栈。您将不得不创建一个 image registry 以使您的自定义图像可访问。

要使用docker编写的类似功能,您需要安装 ecs-cli 客户端,并拥有 proper permissions / roles 。然后,在政府的帮助下 ecs-cli compose 命令,您可以重复使用 stack description

要使用Kubernetes,您可以使用AWS Web控制台或命令行工具 eksctl 并且具有适当的权限/角色。然后,使用配置良好的kubectl环境,您可以重用 Kubernetes manifests