Dit is deel één van een tweedelige serie over het werken met Docker-containers. In dit deel zullen we ons concentreren op de vele manieren en opties om een afbeelding uit te voeren en hoe de host kan communiceren met een Docker-container.
In het tweede deel behandelen we de lijst, starten, stoppen en opnieuw opstarten van containers en voeren we opdrachten uit op het uitvoeren van containers. Docker-afbeeldingen zijn de eenheden van implementatie. Wanneer u een afbeelding uitvoert, geeft u een Docker-container opdracht die één proces uitvoert in zijn eigen geïsoleerde omgeving voor het bestandssysteem, de netwerkstructuur en de verwerkingsstructuur.
Docker-containers zijn zeer flexibel en maken veel use-cases mogelijk die te zwaar, complex en / of duur zijn met andere technologieën zoals virtuele machines en bare metal-servers.
Voordat we beginnen, moet u ervoor zorgen dat Docker correct in uw omgeving is geïnstalleerd. Afhankelijk van hoe het is geïnstalleerd en uw gebruiker, moet u het mogelijk als sudo uitvoeren. Ik sla de sudo over.
U start een Docker-container door een afbeelding uit te voeren. Er zijn verschillende manieren om een container uit te voeren die invloed heeft op hoe gemakkelijk het is om alle containers te beheren. Wanneer de container start, wordt meestal de opdracht uitgevoerd die is gedefinieerd in het koppelingsbestand. Hier is het Dockerbestand voor de hello-world container:
KLAAR KOPIE hallo / CMD ["/ hallo"]
Het commando voert simpelweg het "hallo" binaire bestand uit dat gekopieerd werd naar de root van de container bij het bouwen van de afbeelding.
Een container kan op de voorgrond lopen waar deze blokkeert totdat het proces wordt afgesloten en de container stopt met lopen. In de voorgrondmodus drukt de container zijn uitvoer af naar de console en kan deze de standaardinvoer lezen. In de losstaande modus (wanneer u de vlag -d opgeeft), wordt de controle onmiddellijk geretourneerd en de container
De eenvoudigste manier om een container te gebruiken is: koppelingsrun
.
Wanneer u een container uitvoert met deze opdracht, wijst Docker deze een naam toe die bestaat uit twee willekeurige woorden. Bijvoorbeeld: havenarbeider, rennende hello-wereld
.
Als je al een hello-world afbeelding hebt, zal Docker het uitvoeren. Als u dit niet doet, wordt het uit de officiële Docker-repository DockerHub gehaald en uitgevoerd. De uitvoer moet er als volgt uitzien:
Hallo van Docker! Dit bericht laat zien dat uw installatie correct lijkt te werken. Om dit bericht te genereren, nam Docker de volgende stappen: 1. De Docker-client nam contact op met de Docker-daemon. 2. De Docker-daemon heeft de "Hello-World" -afbeelding uit de Docker Hub gehaald. 3. De Docker-daemon heeft een nieuwe container gemaakt op basis van die afbeelding die het uitvoerbare bestand uitvoert dat de uitvoer produceert die u momenteel aan het lezen bent. 4. De Docker-daemon heeft die uitvoer gestreamd naar de Docker-client, die deze naar uw terminal heeft verzonden. Om iets ambitieuzers te proberen, kunt u een Ubuntu-container uitvoeren met: $ docker run -it ubuntu bash Deel afbeeldingen, automatiseer werkstromen en meer met een gratis docker-ID: https://cloud.docker.com/ Voor meer voorbeelden en ideeën, bezoek: https://docs.docker.com/engine/userguide/
Het hello-programma wordt afgesloten na het weergeven van het bericht, waardoor het proces in de container wordt beëindigd en de containerrun wordt beëindigd. De container blijft hangen voor het geval je er verbinding mee wilt maken, logboeken wilt bekijken of iets anders. Om de container te bekijken, kunt u de volgende opdracht uitvoeren:
docker ps -a --format "table .ID \ t . Status \ t . Names" CONTAINER ID STATUS NAMES 8e2e491accb5 (0) 2 minuten geleden clever_liskov
Ik zal later uitleggen hoe je containers en alle relevante opties kunt vermelden. Laten we ons nu concentreren op het gedeelte Names. Docker heeft automatisch de naam "clever_liskov" gegenereerd en ik zal het moeten gebruiken of de container-ID om naar deze container te verwijzen voor elk doel, zoals het opnieuw opstarten, verwijderen of uitvoeren van een opdracht.
Het gebruik van container-ID's of automatisch gegenereerde namen is soms onhandig. Als u regelmatig een container gebruikt die u vaak opnieuw maakt, krijgt deze een andere ID en automatisch gegenereerde naam. De naam zal ook willekeurig zijn.
Met Docker kunt u uw containers een naam geven wanneer u ze uitvoert door een "--name" op te geven docker run - name hello-world hello-world
.
Nu, als we naar het proces kijken (ik verwijderde clever_liskov eerder) zullen we zien dat de container hello-world heet:
docker ps -a --format "table .ID \ t . Names" CONTAINER ID NAMEN f6fe77b3b6e8 hello-world
Er zijn verschillende voordelen voor een benoemde container:
Laten we naar de laatste optie kijken. Als ik dezelfde run-opdracht opnieuw probeer uit te voeren met dezelfde "hello-world" -naam, krijg ik een foutmelding:
docker run --name hello-world hello-world docker: Foutreactie van daemon: Conflict. De containernaam "/ hello-world" is al in gebruik door container f6fe77b3b6e8e77ccf346c32c599e67b2982893ca39f0415472c2949cacc4a51. U moet die container verwijderen (of de naam ervan wijzigen) om die naam opnieuw te kunnen gebruiken. Zie 'docker run --help'.
Containers blijven standaard hangen. Soms heb je ze niet nodig. In plaats van handmatig verwijderde containers handmatig te verwijderen, zorgt u ervoor dat de container vanzelf verdwijnt. De --rm
opdrachtregelargument doet het volgende: havenarbeider run --rm hello-world
.
Docker voert standaard de opdracht uit die is opgegeven in het koppelingsbestand dat is gebruikt om de afbeelding te maken (of rechtstreeks het beginpunt als er geen opdracht wordt gevonden). U kunt deze altijd overschrijven door uw eigen opdracht aan het einde van de opdracht Uitvoeren te geven. Laten we rennen ls -la
op de busybox afbeelding (de Hallo Wereld afbeelding heeft geen ls
uitvoerbaar):
docker uitvoeren busybox ls -la totaal 44 drwxr-xr-x 18 root root 4096 18 mrt 17:06. drwxr-xr-x 18 root root 4096 mrt 18 17: 06 ... -rwxr-xr-x 1 root root 0 maart 18 17:06 .dockerenv drwxr-xr-x 2 root root 12288 9 mrt 00:05 bin drwxr-xr -x 5 root root 340 mrt 18 17:06 dev drwxr-xr-x 2 root root 4096 mrt 18 17:06 etc drwxr-xr-x 2 nobody nogroup 4096 9 mrt 00:05 home dr-xr-xr-x 85 root root 0 maart 18 17:06 proc drwxr-xr-x 2 root root 4096 mrt 9 00:05 root dr-xr-xr-x 13 root root 0 mrt 18 17:06 sys drwxrwxrwt 2 root root 4096 9 uur 00: 05 tmp drwxr-xr-x 3 root root 4096 9 mrt 00:05 usr drwxr-xr-x 4 root root 4096 9 maart 00:05 var
Dockercontainers voeren geïsoleerde processen uit in hun eigen kleine wereld. Maar het is vaak noodzakelijk en nuttig om toegang tot de host te bieden.
Docker-containers nemen niet automatisch de omgeving over van het hostproces dat ze heeft uitgevoerd. U moet de omgevingsvariabelen expliciet aan de container geven wanneer u deze uitvoert met behulp van de -e
opdrachtregel vlag. U kunt meerdere omgevingsvariabelen doorgeven. Hier is een voorbeeld:
docker run --rm -it -e ENV_FROM_HOST = "123" busybox / # env HOSTNAME = 8e7672bce5a7 SHLVL = 1 HOME = / root ENV_FROM_HOST = 123 TERM = xterm PATH = / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin PWD = / / #
Op de eerste regel wordt de container van de busybox uitgevoerd en wordt de container doorgegeven ENV_FROM_HOST variabele en vervolgens in de container lopen env
laat zien dat het ENV_FROM_HOST is correct ingesteld.
U kunt ook variabelen voor de omgevingsomgeving gebruiken. Hiermee stelt u een aantal variabelen voor de hostomgeving in en gebruikt u deze in de opdracht run:
$ export VAR_1 = 1 $ export VAR_2 = 2 $ docker run --rm -it -e VAR_1 = "$ VAR_1" -e VAR_2 = "$ VAR_2" busybox
In de container zijn ze nu zichtbaar:
/ # env | grep VAR VAR_1 = 1 VAR_2 = 2
Een van de nuttigste interacties is het opzetten van host-directory's. Dat maakt verschillende interessante gebruikscasussen mogelijk:
Hier maak ik een bestand op de host: $ echo "Ja, het werkt!" > ~ / data / 1.txt
Dan voer ik het busybox afbeelding montage van de ~ / gegevensdirectory naar /gegevens in de container en de bestandsinhoud op het scherm weergeven:
$ docker run --rm -v ~ / data: / data busybox cat /data/1.txt Ja, het werkt!
Ik gebruikte de cat /data/1.txt
commando hier.
Als u een poort in uw Docker-bestand blootstelt via BLOOT, het is alleen toegankelijk voor andere containers van het havenbedrijf. Om het op de host toegankelijk te maken, moet u de -p
opdrachtregelargument. De syntaxis is -p
.
Hier wordt het nginx afbeelding, die poort 80 blootstelt en de -p
opdrachtregelargument om het zichtbaar te maken op de host op poort 9000:
docker run --name nginx --rm -d -p 9000: 80 nginx
Merk op dat in tegenstelling tot de vorige opdrachten die sommige taken hebben uitgevoerd en voltooid, de nginx-container blijft werken en naar binnenkomende verzoeken luistert. Laten we verifiëren dat nginx echt actief is en reageert op verzoeken op poort 9000. Ik geef de voorkeur aan de uitstekende httpie HTTP-client boven krul voor het raken van webservers en services vanaf de opdrachtregel:
http HEAD localhost: 9000 HTTP / 1.1 200 OK Accept-ranges: bytes Connection: keep-alive Content-Length: 612 Content-Type: text / html Datum: zo, 19 mrt 2017 07:35:55 GMT ETag: "58a323e4- 264 "Laatst gewijzigd: di, 14 feb 2017 15:36:04 GMT-server: nginx / 1.11.10
Er zijn veel manieren om een Docker-afbeelding uit te voeren om een container te maken en er zijn veel opties. Elke combinatie ondersteunt een bepaald gebruik. Het is erg handig wanneer u met Docker-containers werkt om de details volledig te begrijpen en de beste methode te gebruiken om uw containers te lanceren.
Daarnaast maakt de koppeling van hostvolumes en blootstellings- en publicatiepoorten een nauwe integratie met de host mogelijk en een overvloed aan gebruiksscenario's. In deel twee duiken we in het beheer van een stapel containers en profiteren we van de volledige kracht die Docker biedt.