Zum Hauptinhalt springen

Devcontainer einrichten

Der Devcontainer wird durch das Dockerfile unter .devcontainer/Dockerfile beschrieben. In dem Dockerfile können Tools installiert und konfiguriert werden, die fürs Projekt nötig sind. Dies erleichtert den Einstieg für neue Projektmitglieder und garantiert dass alle die gleiche Umgebung haben.

Kein must!

Theoretisch könnte auch jeder Projektmitarbeiter alle Tools nodejs, java und co. selbst installieren. Hat ja früher auch funktioniert 😉

  • Es muss darauf geachtet werden, dass alle dieselben Versionen verwenden.
Devcontainer vs produktives Docker-Image
  • Der Devcontainer (.devcontainer/Dockerfile) dient zum entwickeln. Darin wird gearbeitet.
    • 💡 Der Devcontainer wird lokal gestartet.
  • Das produktive Image (nginx/Dockerfile, oder später ihr-projekt/Dockerfile) ist optimiert. Dieses sollte so klein wie möglich sein und nur das nötigste beinhalten. Meisten z.B. die gebaute Applikation (ohne node_moduls und co.) und nicht der dev Build.
    • 💡 Das produktive Image wird als Container auf AWS gestartet.

Aufgaben

Mit docker compose den Devcontainer starten und prüfen

  • Den Devcontainer starten
    docker compose up devcontainer -d
  • Mit docker exec eine shell im Container öffnen
    docker exec -it devcontainer /bin/bash
  • Im Container den nginx starten:
    chmod +x nginx/scripts/start-nginx.sh # evt. nicht nötig, schadet aber nicht
    sh nginx/scripts/start-nginx.sh
  • Prüfen ob der Webserver läuft.
    curl http://localhost:3000
    • 💡 Mit curl kann man beliebige HTTP Request absetzen. curl wird daher oft fürs testen verwendet
Port 3000 muss frei sein

Wenn auf dem Port 3000 bereits ein Prozess läuft, muss dieser gekillt werden

Windows
$ netstat -ano | findstr :3000
>TCP 0.0.0.0:3000 0.0.0.0:0 LISTENING 2660
>TCP [::]:3000 [::]:0 LISTENING 2660
$ taskkill /PID 2660 /F
Linux
kill $(lsof -t -i:3000)
Docker Container

Wenn der Port 3000 von einem anderen Docker Container belegt ist muss dieser gestoppt werden.

$ docker ps
> CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
> 95a55d07e361 a-image "/bin/sh -c 'while s…" 2 seconds ago Up 2 seconds 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp container-name
$ docker stop container-name
tipp

Natürlich kann man auch via Browser den Webserver testen. Dafür muss http://localhost:3000 im Browser geöffnet werden.

In VS Code Devcontainer starten und prüfen

tipp
  • Bitte startet den Devcontainer zuerst mit docker compose.
  • VS Code hat nicht so tolle Fehlermeldungen wenn was nicht klappt 🙄

VS Code fragt automatisch nach, ob das Projekt im Container geöffnet werden soll sofern das Plugin "Dev Containers" installiert wurde.

  • "Reopen in Container" klicken und warten
  • Nun wird der Container gebaut und gestartet. Das kann einige Minuten dauern!

bg right fit

Unterdessen...

  1. Wen auf "Connecting to Dev Container (Show Logs)" geklickt wird
  2. erscheint folgender Log. Es zeigt wie das "Image" gebaut wird
  3. Unten rechts ist ersichtlich ob VS Code in einem Container geöffnet wird/wurde.

bg right fit

Terminal öffnen und nginx starten

  1. Mit + kann ein neues Terminal geöffnet werden, (z.B. zsh oder bash)
  2. Nun existiert ein ubuntu Terminal im Container.
    (selbst unter Windows 🤯)
  3. Die Dateien sind verfügbar unter /workspace

bg right fit

  1. Nginx starten (wie ohne VS Code)
    chmod -x nginx/scripts/start-nginx # evt. nicht nötig, schadet aber nicht
    sh nginx/scripts/start-nginx
  2. Prüfen ob der Webserver läuft.
    curl http://localhost:3000

Produktives Dockerfile testen

  1. Mit docker compose der productive service starten
    docker compose up production -d
  2. In der shell oder im Browser prüfen
    curl http://localhost:3001
VS Code Devcontainer kann "docker in docker"
  • Wenn Ihr ein Terminal im VS Code Devcontainer gestartet habt ist es möglich direkt darin mit docker compose up production -d zu starten. 🤯
  • Wenn Ihr den Devcontainer via docker compose selbst gestartet habt ist kein docker verfügbar
    • kein Problem! Ihr könnt auch auf der Machine, in einer zweiten Shell den Befehl ausführen