## Docker-container maken met Dockerfile

Zodra we een proces in Docker starten vanuit een image, haalt Docker de image en de bijbehorende bovenliggende images op en herhaalt het proces totdat het de basis-image heeft bereikt. Vervolgens voegt het Union File System een ​​lees-schrijflaag toe. Die lees-schrijflaag, de informatie over de bovenliggende image en andere informatie zoals de unieke id, netwerkconfiguratie en resourcelimieten wordt een container genoemd. Containers hebben statussen omdat ze kunnen veranderen van actieve naar verlaten status. Een container met de status 'running' bevat een boom van processen die op de CPU worden uitgevoerd, geïsoleerd van de andere processen die op de host worden uitgevoerd, waarbij de status van het bestandssysteem wordt afgesloten en de exitwaarde behouden blijft. Je kunt er een container mee starten, stoppen en herstarten.

Een Dockerfile is een script/tekstbestand, samengesteld uit verschillende commando's en argumenten die achtereenvolgens worden opgesomd om automatisch acties uit te voeren op een basisimage om een ​​nieuwe te creëren. Het helpt ons om te voorkomen dat er problemen onstaan tijdens het uitvoeren van container. Ze worden gebruikt om dingen te organiseren en helpen enorm bij implementaties door het proces van begin tot eind te vereenvoudigen. Het begint met het definiëren van een afbeelding FROM waaruit het bouwproces begint en levert een nieuwe afbeelding met vereiste opdrachten en argumenten die moeten worden gebruikt voor het maken van docker-containers.

Hier zijn dus een snelle en eenvoudige stappen over hoe we een Dockerfile kunnen gebruiken om een ​​Docker-container te maken.

## Docker-commands

Voordat we beginnen met het maken van onze Dockerfile, moeten we de nodige commando's leren om een ​​werkende Dockerfile te maken. Er zijn tientallen opdrachten die kunnen worden gebruikt om het te maken.

ADD

De opdracht ADD wordt gebruikt om de bestanden van een brondirectory naar de bestemming te kopiëren, de bron kan ook een url zijn. Als het een url is, zal de opdracht het doel eenvoudig naar de bestemmingsmap downloaden.

CMD

CMD-opdracht wordt gebruikt om specifieke opdrachten uit te voeren die worden uitgevoerd bij het maken van containers op basis van de afbeelding. Het lijkt erg op de RUN-opdracht, terwijl CMD niet wordt uitgevoerd tijdens het bouwen.

ENTRYPOINT

ENTRYPOINT-argument stelt de concrete standaardtoepassing in die wordt gebruikt elke keer dat een container wordt gemaakt met behulp van de afbeelding.

ENV

ENV wordt gebruikt om de omgevingsvariabelen in te stellen. Deze variabelen zijn toegankelijk met de docker-container die een enorme hoeveelheid flexibiliteit biedt voor het uitvoeren van programma's.

FROM

Het FROM-argument definieert het basisimage dat moet worden gebruikt om het bouwproces te starten. Dit kan elk docker-image zijn, of het nu op de host of in de repository is.

WORKDIR

De WORKDIR-instructie wordt gebruikt om in te stellen waar het commando gedefinieerd met CMD moet worden uitgevoerd.

RUN

RUN is de opdracht die wordt gebruikt om de docker-images te bouwen, wat een centraal uitvoerende richtlijn is voor de Dockerfiles.

MAINTAINER

MAINTAINER is de opdracht die niet wordt uitgevoerd maar de auteur aangeeft, en dus het auteurveld van de afbeeldingen instelt.

USER

De USER-instructie wordt gebruikt om de UID (of gebruikersnaam) in te stellen die de container moet uitvoeren op basis van de image die wordt gebouwd.

VOLUME

De VOLUME-opdracht wordt gebruikt om toegang vanuit je container tot een map op de hostcomputer mogelijk te maken.

EXPOSE

De opdracht EXPOSE wordt gebruikt om een ​​opgegeven poort te koppelen om netwerken mogelijk te maken tussen het actieve proces in de container en de host.

## Een Dockerfile maken

Nadat we de nodige commando's hebben geleerd om onze vereiste container te bouwen, gaan we snel aan de slag met onze eerste eigen container. Hier maken we een Dockerfile om een ​​image te maken om de Nginx Web Server-container te installeren. Daarvoor moeten we een bestand met de naam Dockerfile maken met onze favoriete teksteditor.

    $ sudo nano Dockerfile

Vervolgens willen we onze Docker-configuratie toevoegen die de opdrachten en argumenten voor de Nginx Web Server-container bevat.

    #Base image
    FROM ubuntu

    #Lets install NGINX
    RUN apt -y update && apt -y install nginx

    #Lets copy the local index.html to /tmp
    COPY index.html /tmp/index.html
    COPY default /etc/nginx/sites-available/default

    #lets expose port 80
    EXPOSE 80/tcp

    CMD /usr/sbin/nginx && tail -f /dev/null

Nadat we het bestand met de bovenstaande opdrachten hebben gemaakt, gaan we het bestand opslaan en afsluiten.

Bovenstaande Dockerfile verwijst naar een index.html, zorg dat de index.html bestaat in dezelfde directory.

    <b>Copied From physical machine.</b>

    <h1> Hello, How are you?</h1>

Maak ook een bestand genaamd default, hierin komen een aantal default instellingen voor Nginx.

    server {
            listen 80 default_server;
            listen [::]:80 default_server;

            root /tmp;

            # Add index.php to the list if you are using PHP
            index index.html index.htm index.nginx-debian.html;

            server_name _;
            location / {
                    # First attempt to serve request as file, then
                    # as directory, then fall back to displaying a 404.
                    try_files $uri $uri/ =404;
            }
    }

De volgende bestanden zitten nu in de directory:

    -rw-r--r-- 1 root    root     287 Feb 11 16:40 Dockerfile
    -rw-r--r-- 1 root    root     452 Feb 11 16:36 default
    -rw-r--r-- 1 root    root      69 Feb 11 16:36 index.html

## Een image bouwen met Dockerfile

Nu we klaar zijn met het maken van ons Dockerfile voor de Nginx Web Server Container, zullen we nu eindelijk een image bouwen met deze Dockerfile. Om een image te maken, moeten we de volgende opdracht uitvoeren in onze directory.

    docker build -t my_first_nginx .

Het bovenstaande commando zal een image bouwen met de naam my_first_nginx met behulp van het gemaakte Dockerfile.

## Een Docker-container maken

Met behulp van de image die we zojuist hebben gemaakt, gaan we nu verder met de laatste stap van het maken van een container met daarin een Nginx Web Server-container, met een naam naar keuze. Hier is het nginx.

    # docker run --name nginx -p 80:80 -d my_nginx

Ten slotte hebben we onze Nginx-container gemaakt en deze wordt doorgestuurd naar poort 80. Om te controleren of deze correct werkt, kunnen we docker ps gebruiken.