%Teilweise Erzeugt mit dem LaTeX-Generator: http://latex.sehnot.de

%Schriftgröße, Layout, Papierformat, Art des Dokumentes
\documentclass[10pt,oneside,a4paper]{scrartcl}

%Einstellungen der Seitenränder
\usepackage[left=2cm,right=2cm,top=1.5cm,bottom=1.5cm,includeheadfoot]{geometry}

%neue Rechtschreibung
\usepackage[ngerman]{babel}

%Umlaute ermöglichen
\usepackage[utf8]{inputenc}

%Gesamtseitenzahl
\usepackage{lastpage}

% Kopf- und Fußzeile
\usepackage[automark]{scrpage2}

%Quellcode-Listings
\usepackage{listings}

%Hyperlinks
\usepackage{hyperref}

%Kopfzeile
\ihead{Linux}
\chead{}
\ohead{http://kohnlehome.de/linux/docker.pdf}
\setheadsepline{0.5pt}

%Fußzeile
\setfootsepline{0.5pt}
\ifoot{Franz Kohnle}
\cfoot{Seite \thepage\ von  \pageref{LastPage}}
\ofoot{\today}

\pagestyle{scrheadings}

\begin{document}

% Überschrift 
\begin{center}
    \LARGE % Schriftgröße
    \bfseries % Fettdruck
    \sffamily % Serifenlose Schrift
    Docker
\end{center}


\section{Version}
\begin{verbatim}
docker version                          # installierte Version anzeigen
\end{verbatim}

\section{Images verwalten}
\subsection*{Image-Namen}
\begin{verbatim}
<user>/<image>:<tag>
\end{verbatim}

\begin{itemize}
    \item Default-User: \texttt{library}
    \item Default-Tag: \texttt{latest}
\end{itemize}

\subsection*{Kommandos}
\begin{verbatim}
docker image pull <image>               # Image herunterladen
docker image build -t <image>:<tag> .   # Image von Dockerfile bauen
docker image ls                         # heruntergeladene Images anzeigen
docker image rm <image>                 # Image löschen
\end{verbatim}

\section{Container verwalten}
\begin{verbatim}
docker container ls                     # alle laufenden Container anzeigen
docker container ls -a                  # auch Container, die nicht laufen, anzeigen
docker container stop <container>       # laufenden Container stoppen
docker container start <container>      # Container wieder starten
docker container inspect <container>    # Details des Containers anzeigen
docker container rm <container>         # Container löschen
docker exec -it <container> KOMANDO     # KOMMANDO im laufenden Container ausführen
\end{verbatim}

\section{Volumes verwalten}
\begin{verbatim}
docker volume ls                        # alle Volumes anzeigen
docker volume create <volume>           # Volume erstellen (/var/lib/docker/volumes/...)
docker volume inspect <volume>          # Eigenschaften anschauen
docker volume rm <volume>               # Volume löschen
\end{verbatim}

\section{Netzwerke verwalten}
\begin{verbatim}
docker network create <network>         # Netzwerk erstellen
docker network rm <network>             # Netzwerk löschen
\end{verbatim}

\newpage

\section{Image mit Dockerfile erstellen}
\subsection*{Beispieldatei: Dockerfile}
\begin{verbatim}
FROM python
RUN pip install flask
COPY ./static /home/myapp/static/
COPY ./templates /home/myapp/templates/
COPY sample_app.py /home/myapp/
EXPOSE 8080
CMD python /home/myapp/sample_app.py
\end{verbatim}

\subsection*{Image im aktuellen Verzeichnis erstellen}
\begin{verbatim}
docker build -t sampleapp .
\end{verbatim}

\section{Container aus Image erstellen und starten}
\begin{verbatim}
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
\end{verbatim}



\subsection*{OPTIONS}
\begin{verbatim}
-d                                      # Container im Hintergrund laufen lassen
-e VARIABLE=WERT                        # Umgebungsvariablen setzen
-it                                     # interaktive Shell, beenden mit exit
--name <containername>                  # Name vergeben
--network <network>                     # mit Netzwerk verbinden
--network-alias <alias>                 # Aliasnamen für Container vergeben
-p <hostport>:<containerport>           # Containerport zu Host weiterleiten
--rm                                    # Container nach Beenden löschen
-v </pfad/im/host>:</pfad/im/container> # Verzeichnisse mappen (Bind mount volume)
-v <volume>:</pfad/im/container>        # Volume mappen
\end{verbatim}


\newpage


\subsection*{Beispiele}
\subsubsection*{Hello World}
\begin{verbatim}
docker run hello-world
\end{verbatim}

\subsubsection*{Alpine Linux}
\begin{verbatim}
docker run alpine echo "Hallo!"         # Kommando 
docker run -it alpine /bin/sh           # Interaktive Shell, beenden mit exit
\end{verbatim}

\subsubsection*{Webserver}
\begin{verbatim}
docker run -d -p 8080:80 -v /home/gbs/htdocs:/usr/local/apache2/htdocs httpd
docker run -d -p 8080:80 -v /home/gbs/htdocs:/usr/share/nginx/html     nginx
\end{verbatim}

\subsubsection*{MongoDB-Server mit MongoDB-Client}
\begin{verbatim}
docker network create mongonet
docker run -d --network mongonet --name mongoserver mongo
docker run -it --network mongonet --rm mongo mongo --host mongoserver
\end{verbatim}

\subsubsection*{MySQL mit PHPMyAdmin}
\begin{verbatim}
docker network create webnet
docker run -d --network webnet -e MYSQL_ROOT_PASSWORD=123 --name dbserver mysql:8
docker run -d --network webnet -e PMA_HOST=dbserver --name webserver -p 80:80 phpmyadmin/phpmyadmin
\end{verbatim}




\section{docker-compose}
\subsection*{Grundbefehle}
\begin{verbatim}
docker-compose version        # zeigt installierte Version
docker-compose up             # startet Container
docker-compose up -d          # startet Container im Hintergrund
docker-compose down           # Container und Networks entfernen
\end{verbatim}

\subsection*{Konfigurationsdatei docker-compose.yml}
\begin{itemize}
    \item Einrückungen: zwei Leerzeichen
    \item nach Doppelpunkt: ein Leerzeichen
\end{itemize}

\subsection*{Beispiel}
\begin{itemize}
    \item WordPress with Docker-Compose (c't magazine):  \href{https://gist.github.com/jamct/1794e4e52b9f0fbd280c7df5666724df}{gist.github.com/jamct/...}
\end{itemize}



\end{document}
