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 选项卡中的 如果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/1 在 replicas 专栏:
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 tutorial 或 microk8s 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 images 和 stack 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 。