Docker containers bieden geïsoleerde omgevingen voor het draaien van applicaties en zorgen voor consistentie en overdraagbaarheid. Als je met Docker containers werkt, is het cruciaal om hun shells te kunnen inspecteren en er verbinding mee te maken. Hierdoor kun je commando’s uitvoeren, problemen oplossen en het gedrag van de containers in realtime controleren.

Dit artikel laat zien hoe je toegang kunt krijgen tot lokale en remote Docker containers voor onderhoud en updates.

Waarom je bij je containers moet kunnen

Toegang tot containers is essentieel voor effectief beheer en probleemoplossing in gecontaineriseerde omgevingen. Het stelt je in staat om de logs en runtime informatie van de container te analyseren en eenvoudig fouten te identificeren en op te lossen.

Toegang tot containers stelt je ook in staat om commando’s uit te voeren voor snelle configuratie-updates, pakketinstallaties en andere administratieve taken. Zonder toegang zou je het hele container image opnieuw moeten bouwen met de bijgewerkte configuratie, wat tijdrovend en inefficiënt kan zijn.

Containers moeten ook met elkaar kunnen communiceren in een gedistribueerd applicatie-ecosysteem. Je hebt dus toegang tot de container nodig om diagnostische commando’s uit te voeren en ervoor te zorgen dat de connectiviteit tussen de containers gezond is.

Hoewel het mogelijk is om toegang te krijgen tot containers via een traditioneel Secure Shell (SSH) protocol, biedt Docker verschillende ingebouwde methoden om je te helpen tijd te besparen en de efficiëntie te verhogen. Deze omvatten:

  • docker exec
  • docker run
  • docker attach
  • docker compose exec
  • docker compose run

Elke methode heeft zijn specifieke gebruikssituaties en voordelen. Als je weet wat het juiste commando is voor jouw use case, kun je je aanpak optimaliseren.

Hoe en waarom docker exec gebruiken

docker exec staat je toe om toegang te krijgen tot de shell sessie van een draaiende container en commando’s uit te voeren zonder dat je een nieuwe instance hoeft te starten. Let op dat dit commando niet persistent is, wat betekent dat het niet opnieuw wordt uitgevoerd als je de container afsluit of herstart.

Om toegang te krijgen tot een draaiende container, heb je zijn naam of ID nodig (die kun je krijgen door docker ps -a te draaien). Voer die dan in het volgende commando in:

docker exec -it  /bin/bash

Het docker exec commando uitgevoerd in de terminal om een bash shell in een container te spawnen.
Toegang krijgen tot een container met docker exec

Hoe en waarom docker run gebruiken

Met het commando docker run kun je een nieuwe container starten en direct toegang krijgen tot zijn shell. Deze container is standaard niet gekoppeld aan je huidige shellsessie, maar je kunt hem wel koppelen met de optie -it.

Met het volgende commando kun je een nieuwe container starten, deze aan je huidige shellsessie koppelen en een bash-shell spawnen:

docker run -it  /bin/bash

Het docker run commando wordt uitgevoerd in de terminal om een container te starten en daarin een bash shell te spawnen.
Toegang tot container met docker run.

Hoe en waarom docker attach gebruiken

Het commando docker attach is handig voor het monitoren en debuggen van containeroperaties. Hiermee kun je verbinding maken met een draaiende container en de standaard invoer-, uitvoer- en foutstromen in realtime bekijken.

Om het te gebruiken, start je de container met docker run. Ontkoppel vervolgens door op Ctrl+P en Ctrl+Q te drukken. Je kunt in plaats daarvan ook de vlag -d voor die container opgeven.

Zodra je container op de achtergrond draait, kun je deze openen met het volgende commando:

docker attach 

docker attach wordt uitgevoerd in de terminal om toegang te krijgen tot een container.
Docker attach gebruiken om toegang te krijgen tot een container.

Hoe en waarom Docker Compose gebruiken

Docker Compose stelt je in staat om Docker applicaties met meerdere containers te maken en uit te voeren. Je kunt het gebruiken om de services waaruit je applicatie bestaat te definiëren in een YAML bestand en vervolgens dat bestand gebruiken om alle containers samen op te starten en te beheren. Het is geschikt voor ontwikkel- en testomgevingen waar je snel complexe omgevingen moet opstarten.

Om toegang te krijgen tot een specifieke container die al draait, voer je het volgende commando docker compose uit, gevolgd door de naam van de service en het commando dat je wilt draaien:

docker compose exec app /bin/bash

Dit commando start een nieuw proces binnen de container die het opgegeven commando uitvoert. Je kunt het gebruiken om elk commando in de container uit te voeren, inclusief interactieve shells zoals bash.

In het verlengde hiervan: als je een nieuwe container wilt opstarten met Docker Compose en er direct toegang tot wilt krijgen, voer dan het volgende commando uit:

docker compose run app /bin/bash

Merk op dat docker compose twee verschillende syntaxis heeft: docker-compose (versie 1) en code>docker compose (versie 2). De versie 2 syntaxis is flexibeler en krachtiger, dus het is aan te raden om deze waar mogelijk te gebruiken.

De docker compose run en docker compose exec commando's worden uitgevoerd in de terminal om toegang te krijgen tot containers.
Docker Compose gebruiken om toegang te krijgen tot containers

Een SSH server toevoegen aan je Docker container

Een SSH server toevoegen aan je Docker container helpt je bij het beheren en oplossen van problemen met je gecontaineriseerde applicaties. Met een SSH server kun je op afstand toegang krijgen tot containers en ze beheren, commando’s uitvoeren en logs inspecteren vanaf elke locatie.

Je kunt een SSH server toevoegen door hem op te nemen in je Dockerfile voordat je de container bouwt en hem dan te verbinden met een SSH client. Je kunt ook tijdelijke SSH toegang toevoegen door een shell te spawnen in een draaiende container en daarin een SSH server te installeren.

Een SSH server opnemen bij het bouwen van je Docker container

Wanneer je een Docker container bouwt, kan het handig zijn om een SSH server in de container op te nemen als je vaak gebruik wil maken van SSH voor toegang. Dit maakt toegang op afstand en debuggen van de container mogelijk tijdens ontwikkeling of probleemoplossing. Met een SSH server in de container kun je ook veilig bestanden overzetten van en naar de container.

Om een SSH server op te nemen tijdens het bouwen, breng je een paar wijzigingen aan in de Dockerfile van de container. Hier is een voorbeeld van een Dockerfile met een SSH server:

FROM debian:latest

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:root123' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

EXPOSE 22

CMD ["/usr/sbin/sshd", "-D"]

Een SSH commando uitgevoerd in de terminal om toegang te krijgen tot een container.
Dockercontainer gebouwd met een SSH server

Deze code bouwt een container met het nieuwste Debian image en installeert de SSH server. Het maakt ook een nieuwe directory aan voor de SSH server en stelt het root-wachtwoord in en schakelt het aanmelden van de root in via de SSH configuratie.

Tot slot wordt poort 22, de standaardpoort van SSH, vrijgegeven.

Om dit Dockerfile te gebruiken, bouw je de container met het commando docker build en voer je de container uit met docker run. Hier is een voorbeeld:

docker build . -t ssh-container 
docker run -d -p 2222:22 ssh-container

Dit commando bouwt een container met behulp van het Dockerfile en labelt het met de naam ssh-container. Gebruik -d om de container in detached modus te draaien. Map vervolgens poort 22 in de container naar poort 2222 op de hostmachine met -p.

Zodra de container draait, kun je ernaar SSH en met het commando ssh:

ssh root@localhost-p 2222

Als om het wachtwoord wordt gevraagd, typ dan het wachtwoord in dat je in het YAML bestand hebt ingesteld. In dit geval is dat “root123” Je bent nu verbonden met de SSH server die in de container draait. Dit betekent dat je op afstand kunt debuggen of bestanden kunt overbrengen van en naar de container.

Tijdelijk een SSH server toevoegen aan een draaiende Docker container

Je kunt ook een SSH server toevoegen aan een draaiende container met het commando docker exec:

docker exec <container_name_or_id> /bin/bash

Zodra je toegang hebt gekregen tot de container, installeer je de OpenSSH server en start je de SSH daemon:

apt update && apt install openssh-server && /usr/sbin/openssh -D

Dit opent een nieuwe instance van de SSH server in de container. Je bent nu klaar om er verbinding mee te maken met een SSH client op je lokale machine.

Merk op dat je alleen verbinding kunt maken met de container via SSH als jij of je team de SSH poort heeft vrijgegeven tijdens de uitvoerings- of buildfase.

Verbinden met de SSH server van je container

Begin met het identificeren van het IP adres of de hostnaam van de container via je container management platform of service.

Gebruik het commando ssh om verbinding te maken met het IP adres:

ssh [username]@[container-ip-address]

Voer het wachtwoord in voor de opgegeven gebruikersnaam als daarom wordt gevraagd. In plaats van een wachtwoord kunnen sommige SSH servers sleutelgebaseerde beveiliging gebruiken.

Je zou nu een remote terminal sessie verbonden moeten hebben met de container.

Samenvatting

Nu Docker steeds populairder wordt, is het belangrijk om de containers die in je omgeving draaien te kunnen inspecteren. Deze functionaliteit stelt je in staat om problemen tijdens de ontwikkeling te diagnosticeren en op te lossen.

Docker biedt ook een veelzijdige set ingebouwde commando’s voor verschillende ontwikkelingstaken. Je kunt deze commando’s gebruiken om je workflow te stroomlijnen zonder te hoeven vertrouwen op traditionele SSH methoden.

Kijk eens naar Kinsta om je applicaties, WordPress websites of databases te hosten. Met Kinsta heb je een snelle en veilige host, waarbij je projecten worden ingezet op een infrastructuur die is gebouwd op het Premium Tier Network en C2 Machines van Google Cloud Platform. Kies tussen 37 datacenters en een HTTP/3-enabled CDN met 260+ PoPs. Wees veilig dankzij geïsoleerde containertechnologie, twee sterke firewalls en geavanceerde DDoS bescherming van Cloudflare. En je kunt apps integreren of workflows automatiseren met de Kinsta API.

Marcia Ramos Kinsta

Ik ben de Editorial Team Lead bij Kinsta. Ik ben een open source liefhebber en ik houd van coderen. Met meer dan 7 jaar ervaring in technisch schrijven en redactiewerk voor de tech-industrie, werk ik graag samen met mensen om duidelijke en beknopte content te creëren en workflows te verbeteren.