> For the complete documentation index, see [llms.txt](https://docs.devolutions.net/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.devolutions.net/powershell-universal/da/getting-started/docker.md).

# Docker

Installér og konfigurer PowerShell Universal i Docker, herunder containerimages, Docker Compose, brugerdefinerede Dockerfiles, volumenpersistens og understøttede tags.

## Docker

### Bekræftelse af, at Docker er installeret korrekt

> **Bemærk:** Apple M1-enheder: I skrivende stund er der nogle problemer på Apple M1-enheder og, nogle ARM64/ARMv8-enheder. Gennemgå venligst [PowerShell Universal-forummet](https://forum.devolutions.net/product/powershell-universal), før De fortsætter.

#### Docker

Kør følgende kommando for at bekræfte, at Docker er installeret:

```
docker version
```

Eksempel på output:

```
Client: Docker Engine - Community
 Version:           23.0.1
 API version:       1.42
 Go version:        go1.19.5
 Git commit:        a5ee5b1
 Built:             Thu Feb  9 19:47:01 2023
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          23.0.1
  API version:      1.42 (minimum version 1.12)
  Go version:        go1.19.5
  Git commit:        bc3805a
  Built:            Thu Feb  9 19:47:01 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.18
  GitCommit:        2456e983eb9e37e47538f59ea18f2043c9a73640
 runc:
  Version:          1.1.4
  GitCommit:        v1.1.4-0-g5fd4c4d
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

```

#### Docker Compose

Docker Compose v1 bruger kommandoen `docker-compose`. Fra juni 2023 ophører supporten for Docker Compose v1.

Docker Compose v2 bruger kommandoen `docker compose`.

Hvis De bruger Docker Compose v1, skal De tilpasse kommandoerne tilsvarende. Flere oplysninger om Docker Compose kan findes [her](https://docs.docker.com/compose/).

Kør en af følgende kommandoer for at bekræfte, at Docker Compose er installeret:

Docker Compose v1:

```
docker-compose version
```

Docker Compose v2:

```
docker compose version
```

Eksempel på output:

```
Docker Compose version v2.16.0
```

#### Et Docker Hello-World

For at sikre, at Docker kan hente og køre containerimages, skal De køre følgende kommando:

```
docker run hello-world
```

Eksempel på output:

```
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete 
Digest: sha256:ffb13da98453e0f04d33a6eee5bb8e46ee50d08ebe17735fc0779d0349e889e9
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

### Installation

### Brug af den forudbyggede container

For at køre PowerShell Universal skal De bruge det medfølgende objektbeholderbillede. Docker-imaget er tilgængeligt på [Docker Hub](https://hub.docker.com/r/devolutions/powershell-universal).

Den forudbyggede version understøtter både gratis og betalte funktioner i PowerShell Universal.

Start containeren ved at hente imaget og derefter køre en container med standardporten bundet.

#### Kørsel af et grundlæggende image

```
docker pull devolutions/powershell-universal
docker run --name 'PSU' -it -p 5000:5000 devolutions/powershell-universal
```

#### Præsenter et image på en anden port

Hvis port 5000 ikke er tilgængelig på Deres vært, skal De skifte til en anden port.

f.eks. Præsenter på port 80

```
docker pull devolutions/powershell-universal
docker run --name 'PSU' -it -p 80:5000 devolutions/powershell-universal
```

#### Monter en volumen

Kommandoen `docker run` giver Dem mulighed for at montere en volumen til vedvarende lager. Montér volumenen i mappen /root.

**Montér et volumen på containeren i Windows**

Følgende kommando monterer mappen `C:\docker\volumes\PSU` til `/root` på Deres container:

```
docker pull devolutions/powershell-universal
docker run --name 'PSU' -it -p 5000:5000 -v C:\docker\volumes\PSU:/root devolutions/powershell-universal 
```

**Montér et volumen på containeren på Mac og Linux**

Følgende kommando monterer mappen `/docker/volumes/PSU` til `/root` på Deres container:

```
docker pull devolutions/powershell-universal
docker run --name 'PSU' -it -p 5000:5000 -v /docker/volumes/PSU:/root devolutions/powershell-universal 
```

#### Stop af en container

Følgende kommando stopper en kørende container med navnet `PSU`:

```
docker stop PSU
```

#### Fjernelse af en container

Følgende kommando fjerner en stoppet container med navnet `PSU`:

```
docker rm PSU
```

Flaget `--force` kan fjerne en kørende container:

```
docker rm --force PSU
```

### Docker Compose

Docker Compose giver Dem mulighed for at bruge en yaml-tekstfil til at standardisere Deres build og scripte udrulningen (eller buildet) af flere containere.

Standardnavnet for enhver compose-fil er `docker-compose.yml`. Det anbefales, at De bruger dette som Deres compose-filnavn.

#### Oprettelse af et Compose-script til Windows

Følgende compose-fil kører en Powershell Universal-container i Windows:

```yml
version: "5.2.1"
services:
  PSU:
    container_name: PSU
    image: devolutions/powershell-universal:latest
    ports:
      - 5000:5000
    restart: unless-stopped
    environment:
      - TZ=Europe/London
    volumes:
      - C:\docker\volumes\PSU:/root
```

#### Oprettelse af et Compose-script til Mac / Linux

Følgende compose-fil kører en Powershell Universal-container på Mac og Linux:

```yml
version: "5.2.1"
services:
  PSU:
    container_name: PSU
    image: devolutions/powershell-universal:latest
    ports:
      - 5000:5000
    restart: unless-stopped
    environment:
      - TZ=Europe/London
    volumes:
      - /docker/volumes/PSU:/root
```

#### Start af containere ved hjælp af Compose-scripts

Brug af en Terminal-shell eller PowerShell for Windows. Brug kommandoen cd til at ændre arbejdskataloget med Deres `docker-compose.yml`-script.

Kør følgende kommando:

```
docker compose up -d
```

Eksempel på output:

```
Creating network "PSU_default" with the default driver
Pulling PSU (devolutions/powershell-universal:latest)...
latest: Pulling from devolutions/powershell-universal
7608715873ec: Pull complete
4e66273c6cfb: Pull complete
2649c52300c2: Pull complete
a20175666bc7: Pull complete
65ce93bc0653: Pull complete
Digest: sha256:d7ff98e6197d21070aac325c2efbefa393a4952d2e8ba6b1327dc97824ec4d55
Status: Downloaded newer image for devolutions/powershell-universal:latest
Creating PSU ... done
```

#### Stop af containere ved hjælp af Compose-scripts

Ved brug af en Terminal-shell eller PowerShell til Windows. cd til kataloget med Deres `docker-compose.yml`-script.

Kør følgende kommando

```
docker compose down
```

Eksempel på output:

```
[+] Running 2/2
 ⠿ Container PSU         Removed                                           0.5s
 ⠿ Network PSU_default   Removed                                           0.4s
```

#### Brug af miljøvariabler og SQL-persistens

De kan tilføje miljøvariabler til Deres Compose-scripts. Nedenfor er et eksempel på:

* Angivelse af et nodenavn
* Tilføjelse af SQL-persistens
* Tilføjelse af en SQL-forbindelsesstreng

```yaml
version: "5.2.1"
services:
  PSU:
    container_name: PSU
    image: devolutions/powershell-universal:latest
    ports:
      - 5000:5000
    restart: unless-stopped
    environment:
      - TZ=Europe/London
      - Plugins__0=SQL
      - Data__ConnectionString=Data Source=sql1.domain.com;Initial Catalog=PSUTicketBridge;User Id=psu_ticketbridge_dbo;******;TrustServerCertificate=True;Trusted_Connection=True;integrated security=false;
      - NodeName=mynodename
    volumes:
      - /docker/volumes/PSU:/root
```

#### Brug af miljøvariabler og PostgreSQL-persistens

De kan tilføje miljøvariabler til Deres Compose-scripts. Nedenfor er et eksempel på:

* Angivelse af et nodenavn
* Tilføjelse af PostgreSQL-persistens
* Tilføjelse af en PostgreSQL-forbindelsesstreng

```yaml
version: "5.2.1"
services:
  PSU:
    container_name: PSU
    image: devolutions/powershell-universal:latest
    ports:
      - 5000:5000
    restart: unless-stopped
    environment:
      - TZ=Europe/London
      - Plugins__0=PostgreSQL
      - Data__ConnectionString=Host=PGhostname; Database=PGdatabase; User Id=PGusername; ******;Port=5432
      - NodeName=mynodename
    volumes:
      - /docker/volumes/PSU:/root
```

### Opbygning af en brugerdefineret container

Hvis De ønsker at bygge flere funktioner, ændre eller hardkode miljøvariabler i Deres container, skal De oprette en `Dockerfile`

> ***BEMÆRK:*** Dockerfiles skelner mellem store og små bogstaver og skal starte med et stort 'D'.

For at oprette et Docker-image, der kan bevare Universal-dataene, skal De oprette en dockerfile som den nedenfor.

Denne Dockerfile eksponerer port 5000, opretter en /data-volumen, angiver konfigurationsmiljøvariabler, så Universal-lageret og databasen gemmes i volumenet, og angiver derefter Universal.Server som indgangspunkt til containeren.

#### Skrivning af et Dockerfile-script til Linux

```docker
FROM devolutions/powershell-universal:latest
LABEL description="Universal - The ultimate platform for building web-based IT Tools" 

EXPOSE 5000
VOLUME ["/home/data"]
ENV Data__RepositoryPath /home/data/Repository
ENV Data__ConnectionString Data Source=/home/data/database.db
ENV UniversalDashboard__AssetsFolder /home/data/UniversalDashboard 
ENV Logging__Path /home/data/logs/log.txt
ENTRYPOINT ["./Universal.Server"]
```

#### Opbygning af en container

Fra den sti, der hoster Deres Dockerfile, skal De køre følgende kommando:

```
docker build . --tag=universal-persistent
```

#### Windows

```docker
FROM devolutions/powershell-universal:5.0.0-windowsservercore-1809
LABEL description="Universal - The ultimate platform for building web-based IT Tools" 

EXPOSE 5000
VOLUME ["C:/data"]
ENV Data__RepositoryPath C:/data/Repository
ENV Data__ConnectionString Data Source=C:/data/database.db
ENV UniversalDashboard__AssetsFolder C:/data/UniversalDashboard 
ENV Logging__Path C:/data/logs/log.txt
ENTRYPOINT ["C:/ProgramData/Universal/Universal.Server.exe"]
```

Kør et build med build-kommandoen:

```
docker build . --tag=universal-persistent
```

Start dockercontaineren med run-kommandoen, og sørg for at angive den volumen, der skal monteres:

```
docker run -it --name powershelluniversal --mount source=psudata,target=/home/data --rm -d  -p 5000:5000/tcp universal-persistent:latest
```

#### SQL

For at bruge SQL-persistens skal De definere pluginet og forbindelsesstrengen som følger:

```
ENV Data__ConnectionString=Data Source=ServerName; Initial Catalog=DatabaseName; Integrated Security=SSPI;
ENV Plugins:0=SQL
```

#### PostgreSQL

For at bruge PostgreSQL-persistens skal De definere pluginet og forbindelsesstrengen som følger:

```
ENV Data__ConnectionString=Host=PGhostname; Database=PGdatabase; User Id=PGusername; ******;Port=5432
ENV Plugins:0=PostgreSQL
```

### Tidszoner

For at understøtte tidszoner korrekt på Linux, når jobs planlægges, skal De medtage pakken `tzdata` i Deres dockerfile sammen med en miljøvariabel, der angiver serverens tidszone.

```
ENV TZ Europe/Amsterdam
RUN apt-get install -y tzdata
```

## Mærker

Vi publicerer følgende tags til Docker Hub:

* latest - Aktuel version, der bruger Ubuntu LTS
* 2026.x-\<OS>-\<PS> - Produktionsversion med den angivne OS- og PS-version
* 2026.x-modules - Aktuel produktionsversion på Ubuntu LTS med udvalgte AZ-moduler installeret
* 4.x-\<OS>-\<PS> - Aktuel produktionsversion 4 med de angivne OS- og PS-versioner

### Inkluderede moduler

Modulcontainerimages indeholder følgende moduler:

* Az.Accounts
* Az.Compute
* Az.KeyVault
* Az.Resources
* Invoke-SqlCmd2

## Resumé

Denne grundlæggende "Sådan kommer De i gang" gør det muligt for Dem at begynde at køre eller bygge PSU-containere. Dette referenceafsnit linker til alle kilder til kommandoer:

## Referencer

### Kørende containere

<https://docs.docker.com/engine/reference/commandline/run/>

<https://docs.docker.com/engine/reference/commandline/stop/>

<https://docs.docker.com/engine/reference/commandline/rm/>

<https://docs.docker.com/compose/>

### Opbygning af containere

<https://docs.docker.com/engine/reference/commandline/build/>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.devolutions.net/powershell-universal/da/getting-started/docker.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
