Svarbu
Vertimas yra bendruomenės pastangos, prie kurių jūs galite prisijungti. Šis puslapis šiuo metu išverstas 100.00%.
8. Konteinerizuotas išdėstymas
Yra daug būdų, kaip galima naudoti konteinerizuotą aplikaciją, nuo pačių paprasčiausių (paprastas Docker vaizdas) iki sudėtingų (Kubernetes ir pan.).
Pastaba
Tokio tipo išdėstymui reikia, kad būtų įdiegta ir paleista docker aplikacija. Peržiūrėkite šį vadovą.
Patarimas
Docker run yra iš anksto supakuota aplikacija (dar žinoma kaip vaizdas). Ją galima sukurti atsisiuntus kaip šaltinį (Dockerfile ir resursus), arba gauti jau sukurtą iš registrų (privačių ar viešų).
Pastaba
QGIS Debian-Ubuntu paketui reikia tinkamo gpg autentifikacijos rakto. Prašome skaityti diegimo puslapius, kad keistumėte šį Dockerfile.
8.1. Paprasti docker vaizdai
Kadangi viešame registre docker vaizdo nėra, jums reikės jį susikurti. Kad tai padarytumėte, sukurkite aplanką qgis-server ir jame:
sukurkite failą
Dockerfilesu tokiu turiniu:
FROM debian:bookworm-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/resources/installation-guide/#repositories)
    && echo "deb [signed-by=/etc/apt/keyrings/qgis-archive-keyring.gpg] https://qgis.org/debian bookworm 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"]
sukurkite failą
cmd.shsu tokiu turiniu:
#!/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
sukurkite vaizdą su:
docker build -f Dockerfile -t qgis-server ./
8.1.1. Pirmas paleidimas
Kad paleistumėte serverį, jums reikės QGIS projekto failo. Jūs galite naudoti vieną iš jūsų, arba pasirinkti šį pavyzdį.
Kad tai padarytumėte, sukurkite aplanką data viduje anksčiau sukurto aplanko qgis-server ir nukopijuokite į jį savo failą. Kad tiktų žemiau einantys paaiškinimai, pervadinkite jį į osm.qgs.
Pastaba
Jums gali reikėti pridėti reklamuojamą URL kortelėje QGIS Serveris, kurią rasite , jei GetCapabilities bus neteisingas. Pavyzdžiui, jei jūsų serveris išorėje matomas per prievadą 8080, jūs įrašysite kaip reklamuojamą URL http://localhost:8080/qgis-server/. Daugiau informacijos rasite skiltyje Jūsų projekto konfigūravimas ir tolimesnėse.
Dabar jūs galite paleisti serverį įvykdydami:
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
Naudotos parinktys:
-d: vykdyti fone
–rm: pašalinti konteinerį, kai jis sustabdomas
–name: kuriamo konteinerio pavadinimas
–net: (anksčiau sukurtas) potinklis
–hostname: konteinerio mašinos pavadinimas, vėlesniam naudojimui
-v: vietinis duomenų aplankas, kurį reikia prijungti prie konteinerio
-p: mašinos/konteinerio prievadų sugretinimas
-e: aplinkos kintamasis, kurį reikia naudoti konteineryje
Kad patikrintumėte, rašykite docker ps | grep qgis-server ir tada turėtumėte matyti eilutę su 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. Panaudojamas pavyzdys
Kadangi serveris priima tik fastcgi jungtis, jums reikia HTTP serverio, kuris apdoroja protokolą. Kad tai padarytumėte, jums reikia sukurti paprastą Nginx konfigūracijos failą ir paleisti Nginx vaizdą.
Dabartiniame aplanke sukurkite nginx.conf su tokiu turiniu:
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;
  }
}
Ir įrašykite tokią komandą:
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
Kad patikrintumėte galimybių pasiekiamumą, įrašykite naršyklėje http://localhost:8080/qgis-server/?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities
8.1.3. Susitvarkymas
Kad išvalytumėte vykdomus vaizdus, įrašykite:
docker stop qgis-server nginx
8.2. Doker rinkiniai
Ankstesnį būdą galima aprašyti scenarijumi, bet jo negalima lengvai supakuoti ar standartizuoti bei lengvai valdyti.
Norint dirbti su docker vaizdų rinkiniu, jūs galėtumėte naudoti docker rinkinį, kurį valdo orkestratorius. Rinkinyje vaizdai veikia tame pačiame privačiame potinklyje ir jūs galite paleisti / sustabdyti visą rinkinį ar išplatinti rinkinį į kitus darbininkus. Yra daug orkestratorių, pavyzdžiui Swarm, Kubernetes ir Mesos.
Žemiau pateiktos paprastos konfigūracijos, skirtos testavimui. Jos netinka gamybai.
8.2.1. Swarm/docker-compose
Docker dabar turi savo orkestratorių: Swarm (suderinamą su docker-compose failais). Jūs turite jį įjungti (Mac versija veiks ir su Linux).
Rinkinio aprašymas
Dabar, kai turite veikiantį Swarm, sukurkite paslaugos failą (žr. Išplatinti į 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
Kad pateiktumėte (ar atnaujintumėte) rinkinį, rašykite:
docker stack deploy -c qgis-stack.yaml qgis-stack
Tikrinkite rinkinio pateikimo būseną, kol gausite 1/1 stulpelyje replicas:
docker stack services qgis-stack
Kažkas panašaus į:
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
Kad patikrintumėte WMS galimybes, įrašykite naršyklėje http://localhost:8080/qgis-server/?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities
Susitvarkymas
Kad apsitvarkytumėte, rašykite:
docker stack rm qgis-stack
8.2.2. Kubernetes
Įdiegimas
Jei turite įsidiegę Docker Desktop, Kubernetes (dar vadinamo k8s) naudojimas yra gan paprastas: įjunkite k8s.
Priešingu atveju sekite minikube vadovą arba microk8s skirtą Ubuntu.
Kadangi Kubernetes diegimas gali būti tikrai sudėtingas, mes koncentruosimės tik ties šios demonstracijos aspektais. Tolimesnę / detalesnę informaciją rasite oficialioje dokumentacijoje.
microk8s
microk8s reikia kelių papildomų žingsnių: jūs turite įjungti registrą ir pridėti žymą qgis-server vaizdui, kad Kubernetes rastų sukurtus vaizdus.
Visų pirmą, įjunkite registrą:
microk8s enable dashboard dns registry
Tada pridėkite žymą ir sustumkite vaizdą į jūsų naujai sukurtą registrą:
docker tag qgis-server 127.0.0.1:32000/qgis-server && docker push 127.0.0.1:32000/qgis-server
Galų gale, pridėkite ir pabaikite /etc/docker/daemon.json, kad jūsų registras 127.0.0.1:32000 būtų sąraše lauke insecure-registries:
{
  "insecure-registries": ["127.0.0.1:32000"]
}
Manifestų kūrimas
Kubernetes yaml manifestuose aprašo platinamus objektus. Yra daug skirtingų tipų, bet mes naudosime tik platinimus (valdyti podus, t.y. docker vaizdus) ir paslaugas, kad išplatinimai būtų matomi vidiniais ar išoriniais tikslais.
Platinimo manifestai
Sukurkite failą deployments.yaml su tokiu turiniu:
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;
        }
      }
Paslaugos manifestas
Sukurkite failą services.yaml su tokiu turiniu:
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
Manifestų platinimas
Norint platinti vaizdus ir paslaugus Kubernetes, galima naudoti švieslentę (spauskite + viršutiniame dešiniame kampe) arba komandinę eilutę.
Pastaba
Kai komandinė eilutė naudojama su microk8s, jūs turėsite prieš kiekvieną komandą rašyti priešdėlį microk8s.
Norėdami platinti ar atnaujinti jūsų manifestus:
kubectl apply -f ./
Kad patikrintumėte, kas šiuo metu išplatinta:
kubectl get pods,services,deployment
Turėtumėte gauti kažką panašaus į tai:
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
Norėdami skaityti nginx/qgis žurnalą, rašykite:
kubectl logs -f POD_NAME
Norėdami patikrinti WMS galimybes, naršyklėje rašykite http://localhost:30080/qgis-server/?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities
Susitvarkymas
Norėdami apsitvarkyti rašykite:
kubectl delete service/qgis-server service/qgis-nginx deployment/qgis-nginx deployment/qgis-server configmap/nginx-configuration
8.3. Platinimas debesyje
Nuosavo serverių spiečiaus tvarkymas valdant konteinerizuotų aplikacijų platinimą yra sudėtingas darbas. Jūs turite valdyti kelis dalykus, tokius kaip aparatinė įranga, pralaidumas ir saugumas skirtinguose lygmenyse.
Debesų platinimo sprendimai gali būtų gera alternatyva, kai jūs nenorite gilintis į infrastruktūros valdymą.
Platinimas debesyje gali naudoti nuosavybinius mechanizmus, bet jie taipogi suderinami su etapais, paaiškintais anksčiau (docker vaizdai ir rinkinių valdymas).
8.3.1. AWS atvejis
Su Amazon AWS, per ECS (Elastic Container Service) funkcionalumus, jūs galite naudoti docker-compose ar Kubernetes suderinamus įrankius jūsų rinkinio valdymui. Jūs turėsite sukurti vaizdų registrą, kad jūsų savi vaizdai būtų prieinami.
Norėdami naudoti į docker-compose panašų funkcionalumą, turite įdiegti ecs-cli klientą ir turėti reikiamas teises / vaidmenis. Tada, naudodami ecs-cli compose komandas jūs galite perpanaudoti rinkinio aprašymą.
Norėdami naudoti Kubernetes, jūs galite naudoti AWS žiniatinklio konsolę ar komandinės eilutės įrankį eksctl ir turėti reikiamas teises / vaidmenis. Tada su gerai sukonfigūruota kubectl aplinka jūs galite perpanaudoti Kubernetes manifestus.