Website-Suche

So passen Sie Docker-Images mit Dockerfiles an


In diesem Artikel wird gezeigt, wie Sie Docker-Images mithilfe einer Beschreibungsdatei mit dem Namen Dockerfile anpassen. Sie erfahren, wie Sie vorhandene Images erweitern, sie an Ihre Anforderungen anpassen und wie Sie das resultierende Image in Docker Hub veröffentlichen.

In diesem Tutorial lernen Sie:

  • So passen Sie ein Image mit einer Dockerfile an.
  • So veröffentlichen Sie das resultierende Image in Docker Hub.

HTTPS ist aktiviert.

Verwendete Softwareanforderungen und Konventionen

Einleitung

In den vorherigen Artikeln wurden Docker-Konzepte und einige grundlegende Docker-Befehle vorgestellt. In diesem Artikel erfahren Sie, wie Sie ein vorhandenes Docker-Image anpassen und erweitern, die Änderungen in einer Dockerfile beschreiben und das Image in einer Registrierung veröffentlichen.

Das Dockerfile

Im vorherigen Artikel haben Sie Änderungen an einem ausgeführten Container vorgenommen und die Änderungen in den lokalen Imagecache übernommen. Obwohl es sich um eine hilfreiche Ressource für bestimmte Situationen handelt, wird empfohlen, Anpassungen auf besser dokumentierte Weise vorzunehmen, damit das Image auf anderen Hosts bereitgestellt werden kann. Es wird empfohlen, ein Dockerfile zu schreiben.

Bei der Dockerfile handelt es sich um eine YAML-Datei, bei der es sich um eine Textdatei mit einer gewissen Syntax handelt: Beziehungen werden durch Einrückungen (Leerzeichen) ausgedrückt und jede Zeile besteht aus Schlüssel- und Wertpaaren.

Beginnen wir mit einer einfachen Dockerfile, die Paketprops (enthält die Befehle htop und ps) in ein Debian-Image installiert.

Erstellen Sie ein neues Verzeichnis, geben Sie es ein und speichern Sie die folgende Datei mit dem Namen Dockerfile (großes D):

FROM debian
RUN apt-get update &&\
    apt-get -y install procps

Diese Dockerfile gibt an, dass das Basis-Image den Namen Debian hat (FROM-Klausel). Wenn es nicht lokal vorhanden ist, wird es vom Docker Hub heruntergeladen. Der Befehl RUN führt apt-get zweimal aus. Beachten Sie die Verwendung eines umgekehrten Schrägstrichs (\), um eine Zeile umzubrechen, und die Verwendung von -y, um die Bestätigungsaufforderung von apt-get install zu überspringen.

Der nächste Schritt besteht darin, das Image mit docker build zu erstellen.

docker build -t mydebian .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM debian
 ---> be2868bebaba
Step 2/2 : RUN apt-get update &&    apt-get -y install procps
 ---> Running in 52a16b346afc
…
Removing intermediate container 52a16b346afc
 ---> f21a05a59966
Successfully built f21a05a59966
Successfully tagged mydebian:latest

Das Flag -t mydebian benennt das neue Image. Der Punkt (.) weist Docker an, das aktuelle Verzeichnis zu verwenden, um nach einer Dockerfile zu suchen. Beachten Sie, dass neue Ebenen erstellt und entfernt werden, wenn die Zeilen der Dockerfile interpretiert werden.

Es muss ein neues Bild im lokalen Cache vorhanden sein.

docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mydebian            latest              f21a05a59966        8 minutes ago       119MB
debian              latest              be2868bebaba        7 weeks ago         101MB

Aus diesem Image kann ein Container erstellt werden.

docker run -it --name mydebian_container  mydebian
root@ef9eb174874a:/# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 02:43 pts/0    00:00:00 bash
root         9     1  0 02:43 pts/0    00:00:00 ps -ef

Von nun an können Sie Container erstellen, die unter Debian laufen, mit dem Paket procps, und die Befehle htop und ps sind bereits installiert.

Erstellen wir nun eine Dockerfile, um Apache und PHP zur Image-Build-Zeit zu installieren, um die gleichen Ziele wie im vorherigen Artikel zu erreichen, als die Befehle innerhalb des Containers ausgeführt wurden.

FROM debian
RUN apt-get update &&\
    apt-get -y install procps libapache2-mod-php
CMD service apache2 start

Wir haben libapache2-mod-php in Zeile 3 und einen CMD-Befehl in Zeile 4 hinzugefügt, um Apache zu starten. Beim Start des Containers wird der CMD-Befehl ausgeführt. Es kann nur einen CMD-Befehl pro Dockerfile geben. Wenn der CMD-Befehl angegeben ist, ersetzt er den CMD-Befehl des Bildes, das Sie erweitern. Wenn der CMD-Befehl weggelassen wird, wird der Befehl des Basis-Images ausgeführt (falls vorhanden). Wie Sie vielleicht schon vermutet haben, verfügt das Dockerfile des Debian-Basisimages über einen CMD-Befehl zum Ausführen von bash. Sie können dies im Docker Hub überprüfen.

docker run -d --name mydebian_container2 -d -p 8000:80 -v "$PWD":/var/www/html mydebian
ad325685b738464c49bff40b65c6824160105ab5c285282efefbc4ddeec20ba2
roger@slash:~/LinuxConfig/04 Dockerfile$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
ad325685b738        mydebian            "/bin/sh -c 'service…"   11 seconds ago      Up 5 seconds        0.0.0.0:8000->80/tcp   mydebian_container2

Diesmal haben wir den Container mit dem Schalter -d gestartet, weil wir möchten, dass er vom Terminal gelöst wird.

Wichtige Dockerfile-Befehle

Die Dockerfile verfügt über weitere Befehle neben FROM, RUN und CMD.

Der Befehl ENV wird verwendet, um Umgebungsvariablen im Image zu setzen, wie z. B. http_proxy. Viele Bilder verwenden Umgebungsvariablen, um Parameter an den neuen Container zu übergeben. Überprüfen Sie beispielsweise die Bilder von Datenbanken wie MySQL und PostgreSQL im Docker Hub.

Der Befehl COPY kopiert Dateien und Verzeichnisse zur Build-Zeit vom Host in das Image. Der Quellpfad (erstes Argument) ist relativ zum aktuellen Verzeichnis.

Der Befehl ADD ähnelt dem COPY, mit dem Unterschied, dass, wenn es sich bei der Quelle um eine komprimierte tar-Datei handelt, diese automatisch im Zielverzeichnis innerhalb des Images dekomprimiert wird. Abgesehen von dieser Verwendung empfiehlt Docker nach Möglichkeit die Verwendung des Befehls COPY.

Der Befehl EXPOSE gibt an, welche Ports des Images von Docker verfügbar gemacht werden können. Während der Containererstellung können diese Ports bei Bedarf Hostports zugeordnet werden.

Der Befehl WORKDIR legt das Verzeichnis fest, das Docker verwendet, wenn Befehle innerhalb des Containers mit docker exec ausgeführt werden.

Erstellen eines Bildes mit aktiviertem HTTPS

Jetzt erweitern wir das offizielle PHP Apache-Image, um SSL mit einem automatisch generierten Zertifikat zu aktivieren, um die Verwendung der genannten Befehle zu veranschaulichen. Erstellen Sie in einem neuen Verzeichnis die folgende Dockerfile.

FROM php:7-apache

RUN openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/ssl-cert-snakeoil.key -out /etc/ssl/certs/ssl-cert-snakeoil.pem -subj "/C=BR/ST=Rio Grande do Sul/L=Porto Alegre/O=Security/OU=Development/CN=example.com"

RUN a2enmod rewrite
RUN a2ensite default-ssl
RUN a2enmod ssl

EXPOSE 443

COPY ./html /var/www/html

WORKDIR /var/www/html

In Zeile 3 erstellen wir ein Zertifikat. Zeilen 5 – 7 aktivieren mod_rewrite und SSL. Zeile 9 legt Port 443 offen (Port 80 ist bereits durch das Upstream-Image offengelegt). Zeile 11 fügt das Anwendungsverzeichnis zum Container hinzu. Schließlich legt Zeile 13 das Arbeitsverzeichnis als Apache-Arbeitsverzeichnis fest. Alle Befehle, die von docker exec ausgeführt werden, verwenden standardmäßig dieses Verzeichnis als Basis.

Erstellen Sie nun ein Verzeichnis mit dem Namen html und eine Datei mit dem Namen phpinfo.php mit diesem Inhalt.

<?php
phpinfo();
?>

Lassen Sie uns nun den Container erstellen und ausführen.

docker build -t app_image .
docker run -d --rm -p 80:80 -p 443:443 --name app_container app_image

Jetzt können Sie sowohl über HTTP als auch über HTTPS auf phpinfo.php Skript zugreifen.

http://localhost/phpinfo.php
https://localhost/phpinfo.php

HTTPS ist aktiviert.

Bei HTTPS beschwert sich der Browser über die Sicherheit des Zertifikats, da dieses selbstsigniert ist, aber die Warnung kann ignoriert werden.

Veröffentlichen von Images im Docker Hub

Die erstellten Images sind nur lokal im lokalen Cache von Docker vorhanden. Möglicherweise möchten Sie sie mit anderen Docker-Hosts oder Teamkollegen teilen oder sie sogar der Welt zugänglich machen. In jedem Fall möchten Sie Ihre Images in einer Docker-Registry veröffentlichen. Sie können in einer cloudbasierten Registrierung veröffentlicht werden, wie z. B. dem Docker Hub, der übrigens die Standardeinstellung ist, wenn Sie die Registrierung nicht explizit angeben. Zuerst eine kostenlose Docker-ID erstellen, dann anmelden:

docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: infroger
Password: 
Login Succeeded

Als Nächstes markieren Sie das Image mit dem Repository-Namen (infroger), dem Image-Namen und dem Tag (Image-Version).

docker tag app_image infroger/app_image:1
docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
infroger/app_image   1                   c093151fc68f        14 hours ago        381MB
app3_image            latest              c093151fc68f        14 hours ago        381MB

Pushen Sie dann das Image in das Repository.

docker push infroger/app_image:1
The push refers to repository [docker.io/infroger/app_image]
27f7f2b01c49: Pushed 
81b08cd5fe07: Pushed 
d1c23d198f84: Pushed 
e66392ad9b85: Pushed 
a71f63e3a00f: Pushed 
9c58778f21dd: Pushed 
973719bed9b7: Pushed 
8f5090ef2ac0: Pushed 
fbdafdbe3319: Pushed 
a5c4801ecf39: Pushed 
e9ba112d38b9: Pushed 
25ba5230dadf: Pushed 
f2907ce42b47: Pushed 
e31bf34cfab9: Pushed 
9066d03e98e0: Pushed 
96db4ce698ad: Pushed 
abae6a338e5c: Pushed 
4572a80a7a5e: Pushed 
ef68f6734aa4: Pushed 
1: digest: sha256:2e7e53fcdf800ad0c4837cd70014170cc869d36de5c301f2e2ced318803bf963 size: 4279

Gehen Sie nun zu Docker Hub und überprüfen Sie, ob das Image vorhanden ist:

https://hub.docker.com/r/infroger/app_image

In Docker Hub mit kostenloser Registrierung können Sie ein privates Repository mit unbegrenzten öffentlichen Repositorys haben. Andernfalls können Sie Ihre eigene Docker-Registrierung ausführen, was mit einem Befehl erfolgen kann:

docker run -d -p 5000:5000 --restart=always --name registry registry:2

Der Vorteil einer privaten Registrierung ist die Privatsphäre. Sie müssen jedoch Sicherheit, Hochverfügbarkeit, Speicheranforderungen, Zugriffskontrolle usw. verwalten.

Schlussfolgerung

In diesem Artikel haben wir behandelt, wie Sie vorhandene Images erweitern und mithilfe eines Dockerfiles an Ihre Bedürfnisse anpassen können. Wir haben auch gesehen, wie Sie die Images in einer Docker-Registrierung veröffentlichen. Bisher kann man viel machen, aber wir kratzen nur an der Docker-Welt. Im nächsten Artikel sehen wir eine sehr einfache Form der lokalen Containerorchestrierung mit Docker Compose.

Mehr in dieser Docker-Artikelreihe

  • Eine praktische Einführung in Docker-Container
  • So interagieren Sie mit Docker-Containern

Verwandte Artikel: