Docker Exec: Jouw Goto Commando voor Het Uitvoeren van Commando’s in Docker


Heb je ooit moeten zien wat er binnenin een Docker-container gebeurt? Containers zijn bedoeld om idempotent te zijn: als er een probleem is, implementeer dan een nieuwe container. Vaak is het leven niet zo eenvoudig. Je moet commando’s uitvoeren in de container om het probleem te identificeren. Hier kan het docker exec-commando helpen.

Dit artikel zal je leren hoe je commando’s kunt uitvoeren op een actieve Docker-container met behulp van het docker exec-commando.

Vereisten

Om de voorbeelden in dit artikel te volgen, moet je de volgende stappen volgen.

  • Elke recente versie van Docker Desktop werkt op Windows, Linux of macOS. Deze tutorial maakt gebruik van v3.1.0 op Windows 10.

Het starten van een NGINX-container

Docker exec voert commando’s uit in containers. Maar om dat te doen, moet je eerst een container hebben om die commando’s in uit te voeren. Laten we beginnen door een Docker-image te downloaden en een democentainer te maken.

  1. Maak een nieuwe map aan, deze tutorial maakt gebruik van C:\gitrepos\test, om de bestanden voor de container te bewaren.

2. Maak een bestand aan met de naam dockerfile (zonder extensie), met de volgende code. Het Dockerfile definieert de stappen die nodig zijn om een container te maken.

FROM nginx:alpine
 COPY index.html /usr/share/nginx/html/index.html

3. Maak vervolgens een bestand in dezelfde map met de naam index.html, met de volgende code. Dit is een HTML-bestand dat, wanneer de container wordt gestart, een Hello World-bericht weergeeft.

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <meta http-equiv="X-UA-Compatible" content="ie=edge"> 
    <title>Hello World - Nginx Docker</title> 
    <style> 
       h1{ font-weight:lighter; font-family: Arial, Helvetica, sans-serif; 
       } 
    </style> 
    </head> 
    <body> 
       <h1> 
          Hello World 
       </h1> 

    </body> 
    </html>

4. Maak nu de Nginx Docker-container. Aangezien het Dockerfile zich in de huidige werkmap bevindt, geef . op om de Docker-engine te laten weten daar te kijken. Zorg er ook voor dat je de container tagt met my-ngnix met behulp van de t-parameter voor een gemakkelijkere referentie in de toekomst.

docker build -t my-nginx .
Creating a Docker container with the build command.

5. Nu de container is gebouwd, start je de container met het Docker run-commando.

# rm - Informeert Docker om de container te verwijderen nadat deze is gestopt 
# d - Geeft de controle van de opdrachtregel terug nadat de opdracht is uitgevoerd 
# p - Koppel de interne containerpoort 80 aan een externe poort 80 docker run --rm -d -p 80:80 my-nginx
Start the container with the Docker run command.

6. Open tot slot je webbrowser en ga naar http://localhost/ om het volgende te zien.

Output of the running NGINX container.

Uitvoeren van opdrachten met Docker Exec

Wanneer je commando’s uitvoert in een Docker-container, moet je mogelijk interactief een commando uitvoeren. Interactief commando betekent dat je een commando typt, feedback krijgt, een ander commando typt, enzovoort. Interactieve commando’s nemen je sessie over en voorkomen dat je iets anders kunt doen.

Maar wat als je de commando’s die je naar de container wilt sturen al van tevoren kent en commando’s in de achtergrond wilt uitvoeren? In dat geval kun je niet-interactieve commando’s uitvoeren. Niet-interactieve commando’s stellen je in staat om een commando naar Docker te sturen en onmiddellijk de controle over de console terug te krijgen.

Het lokaliseren van de container naam en ID

Nu je de container hebt gebouwd, kun je commando’s uitvoeren binnenin de container. Voordat je een commando uitvoert, zoek je de naam of ID van de NGINX-container. Zowel de naam als de ID werken in Docker-commando’s. Met dat in gedachten kan het lastiger zijn om de ID te onthouden dan de naam!

Om informatie weer te geven over een draaiende container, voer je het Docker ps commando uit om de volgende informatie weer te geven.

docker ps
Displaying running Docker containers.

Kopieer ofwel de unieke ID, e17e4b6be01a, of de willekeurig gegenereerde naam mystifying_chandrasekhar naar je klembord voor later gebruik.

Het uitvoeren van een niet-interactief commando met Docker Exec

Als voorbeeld van het uitvoeren van een niet-interactief commando, kopieer en voer het onderstaande commando uit om een lijst van bestanden in de /var/log directory terug te geven met het ls -l commando. Geef alles na de container naam, mystifying_chandrasekhar, door aan het Docker exec commando.

docker exec mystifying_chandrasekhar ls -l /var/log
Executing a directory listing within the NGINX container.

Vermijden van Console Uitvoer met Docker Commando’s

Door de shell-besturing onmiddellijk aan de gebruiker terug te geven, voorkomen grote bewerkingen dat de console bezet is. Sla console-uitvoer over met de gedetacheerde d-optie. Het onderstaande commando maakt het bestand /tmp/execWorks aan via het touch-commando binnen de container en geeft geen uitvoer weer op de console.

docker exec -d mystifying_chandrasekhar touch /tmp/execWorks

Interactieve Commando’s Uitvoeren met Docker Exec

Tot nu toe heb je geleerd hoe je niet-interactieve commando’s kunt uitvoeren in een Docker-container met docker exec. Maar je kunt te maken krijgen met een situatie waarin je een container moet troubleshooten, bijvoorbeeld wanneer je interactieve commando’s aan de container moet geven. In dat geval moet je commando’s interactief uitvoeren.

Interactieve uitvoering van commando’s met docker exec vereist twee opties, i en t. De i-optie houdt STDIN open, zodat commando’s naar de container kunnen worden gestuurd, en de t-optie wijst een pseudo-TTY (PTY) toe, een communicatiekanaal, om commando’s in te typen.

Kopieer en plak het volgende commando om een interactieve opdrachtprompt te openen naar de draaiende Docker-container met de Bourne (sh) shell, zoals aangegeven door de promptverandering naar / #.

docker exec -it mystifying_chandrasekhar sh
Running an interactive Docker shell.

Eenmaal in de shell, voer nu de onderstaande commando’s uit om bestanden vanuit de container te lijsten. Voer ten slotte het exit-commando uit om de interactieve shell te verlaten.

ls -l /var/log
exit
Open an interactive command prompt to the container.

Om een interactieve prompt te openen in een specifieke directory, geef het pad door aan de w-optie om Docker te vertellen de shell te starten in een gespecificeerde directory.

Het doorgeven van omgevingsvariabelen aan een draaiende container

Veel programma’s gebruiken omgevingsvariabelen om configuraties in te stellen bij het opstarten. Bijvoorbeeld, de meeste Java-toepassingen vereisen dat de JAVA_HOME omgevingsvariabele wordt ingesteld op het Java-pad.

Je kunt omgevingsvariabelen doorgeven aan een sessie met behulp van de e-optie. Bijvoorbeeld, misschien moet je een omgevingsvariabele genaamd MYVAR in een draaiende container zetten. Gebruik daarvoor de e-optie en geef het sleutel-/waardepakket van MYVAR="<some value>" zoals hieronder getoond.

docker exec -it -e MYVAR="hello" mystifying_chandrasekhar sh
echo $MYVAR
Pass environment variables

Omgevingsvariabelen doorgeven met een bestand

Als je veel omgevingsvariabelen hebt of een gedeelde configuratie, kan het handiger zijn om die variabelen in een bestand op te slaan. Geef het bestand via een relatief of absoluut pad door aan Docker met de --env-file-optie. Deze techniek wordt vaak gebruikt om veilige referenties aan een container te verstrekken. Zorg ervoor dat je nooit referenties commit naar versiebeheer!

Maak een tekstbestand met de naam env-vars.txt met de omgevingsvariabelen om door te geven en hun waarden. Dit bestand kan elke naam hebben die je wilt en heeft niet de .txt-bestandsextensie nodig.

Text file with environmental variables defined.

Geef de omgevingsvariabelen door aan Docker met de env-file-optie. Controleer of de variabelen beschikbaar zijn met het echo-commando zoals weergegeven in de onderstaande screenshot.

# Geef het bestand env-vars.txt door en open een interactieve prompt
docker exec -it --env-file env-vars.txt mystifying_chandrasekhar sh
# Controleer of de omgevingsvariabelen beschikbaar zijn in de Docker-container
echo $MYVAR
echo $FOO
echo $SOMETHING
Passing a environmental variables file to Docker and verifying the environment variables exist in the container.

Interactie met een draaiende container als een andere gebruiker

In productie worden applicaties vaak uitgevoerd als een specifieke gebruiker om hun toegang te beperken. Als je applicaties als een specifieke gebruiker uitvoert in productie, moet je dit ook doen tijdens het testen van commando’s.

In dit voorbeeld wordt de Docker-container uitgevoerd als de nginx-gebruiker. Geef de gebruiker door aan de w-optie om Docker te vertellen de container te starten als de nginx-account. Het whoami-commando, uitgevoerd vanuit de container, bevestigt dat inderdaad de nginx-gebruiker wordt gebruikt.

docker exec -it -u nginx mystifying_chandrasekhar sh
whoami
Running the container as the nginx user.

Volgende stappen

Je hebt geleerd hoe je commando’s kunt uitvoeren binnen een draaiende container met behulp van het docker exec-commando. Door het exec-commando te gebruiken om draaiende containers binnen te gaan en te ondervragen, heb je een krachtig nieuw gereedschap in handen om Docker-containers te troubleshooten.

Probeer nu om wat je hebt geleerd nog een stap verder te brengen en gebruik Git-versiebeheer om een statische website in de container te trekken, in plaats van een enkel bestand te kopiëren. Als Git nieuw voor je is, dan is het artikel Een Beginner’s Gids voor Visual Studio Code en Git een geweldige plek om te beginnen.

Source:
https://adamtheautomator.com/docker-exec/