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.
- 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.
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.
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.

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

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

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.

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.

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.
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 / #
.

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.

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.

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.

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.

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.

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.