Docker.io in der Praxis – OpenVPN Server

Nach dem ersten Artikel zu Docker nun ein weiterer Post zum Thema.

Diesmal direkt mit dem Erstellen eines eigenen Images. Es geht um OpenVPN, ein open-source VPN, welches eine Vielzahl von Plattformen (Windows, OS X, Linux, Android und iOS) unterstützt.

Veröffentlicht habe ich das ganze unter github.Die zentrale Datei ist die Datei Dockerfile, welche den Build des Images steuert.

FROM debian

MAINTAINER Joachim Lusiardi

RUN apt-get update; \
    apt-get -y install openvpn ;

ADD start.sh /start.sh

RUN chmod +x /start.sh

VOLUME ["/etc/openvpn"]
VOLUME ["/var/log/openvpn"]

EXPOSE 1194/udp
EXPOSE 1194/tcp

ENTRYPOINT /start.sh

FROM legt ein Basis-Image fest, hier die neuste Version von Debian.
MAINTAINER gibt den Betreuer des Images an.
RUN führt Befehle innerhalb des Images aus. Hier das Updaten der Packet-Quellen, Installieren von OpenVPN und dem Ausführbarmachen des start-Skripts.
ADD fügt eine Datei dem Image hinzu.
VOLUME gibt an, das ein Verzeichnis des Images beim Ausführen auf ein Verzeichnis des Hosts gelegt werden kann.
EXPOSE definiert welche Ports von ausserhalb des Images erreichbar sein sollen. Diese sind nicht automatisch beim Starten des Images auf eine öffentliche IP gebunden.
ENTRYPOINT gibt an, welches Kommando ausgeführt werden soll.

Weitere Detail auf github und auch unter https://registry.hub.docker.com/u/shing19m/docker-openvpn-server/.

Docker.io in der Praxis – Installation

Nachdem Docker immer mehr gehyped wird (LinuxMagazin 09/14, c’t 17/2014), soll das ganze hier mal für einen Root-Server inklusive folgender Dienste getestet:

  • WordPress (inklusive MySQL Datenbank)
  • OpenVPN Server
  • getrennter SSH Server für IRC mit irssi in screen oder tmux

Zusätzlich soll als Option das schnelle und einfache Bereitstellen von weiteren Diensten auf Basis von Technologien wie Node.js und NoSQL Datenbanken möglich sein.

Installation von Docker auf dem Root-Servers

Zunächst muss Docker installiert werden. Das soll nun hier besprochen werden.

Basisinstallation

Der Hoster bietet hier Debian-76-wheezy-64-minimal an.

Nach der Installation muss die Liste der Paket-Quellen angepasst werden (Debian Testing wird benötigt). Dabei hilft der Debian Sources List Generator:

deb http://ftp.debian.org/debian testing main contrib 
deb-src http://ftp.debian.org/debian testing main contrib 

deb http://ftp.debian.org/debian/ jessie-updates main contrib 
deb-src http://ftp.debian.org/debian/ jessie-updates main contrib 

deb http://security.debian.org/ jessie/updates main contrib 
deb-src http://security.debian.org/ jessie/updates main contrib

Anschließend mit apt-get update und apt-get dist-upgrade auf die Debian-Version jessie (bzw. testing) updaten.

Nun für den richtigen Kernel sorgen:

echo "deb http://ftp.us.debian.org/debian wheezy-backports main" > \
    /etc/apt/sources.list.d/wheezy-backports.list
apt-get update
apt-get -t wheezy-backports install linux-image-amd64

Docker installieren

Für Docker gibt es ein Ubuntu Repository, welches auch für Debian verwendet werden kann:

apt-key adv --keyserver keyserver.ubuntu.com \
    --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
echo "deb http://get.docker.io/ubuntu docker main" > \
    /etc/apt/sources.list.d/docker.list
apt-get update
apt-get install lxc-docker

Die beiden letzen Schritte nach dieser Anleitung: http://doduck.com/docker-install-on-debian-7/

IPv6 für die Container

IPv6 ermöglicht es, für jeden Container eine eigene IP zu reservieren.

Leider wird IPv6 von Docker zum aktuellen Stand (23. August 2014, Docker Version  1.2.0) noch nicht unterstützt, kann aber über lxc direkt an den Container durchgereicht werden. Wenn IPv6 nicht verwendet werden soll, so kann dieser Abschnitt übersprungen werden.

Für IPv6 muss in der Datei /etc/sysctl.conf folgende Zeile eingefügt oder wieder eingkommentiert werden:

net.ipv6.conf.all.forwarding=1

Und der Docker-Daemon muss auf den lxc Treiber umgestellt werden. Dazu unter Debian in der Datei /etc/default/docker folgendes eintragen:

DOCKER_OPTS="--exec-driver=lxc"

Zusätzlich muss das lxc Paket installiert werden:

apt-get install lxc

Nun muss der von Docker angelegten Bridge noch eine  IPv6 IP hinzufügen:

ip -6 addr add aaaa:bbbb:cccc:dddd::1:1/112 dev docker0

Dabei muss natürlich aaaa:bbbb:cccc:dddd durch einen entsprechenden Teil des eigenen IPv6 Subnetzes ersetzt werden.

Um das Ganze zu Vereinfachen, bietet es sich an, Container dann mit folgendem Script zu starten:

#!/bin/bash

NW_IP=$1
shift
NW_GW=aaaa:bbbb:cccc:dddd::1:1
#shift
REST=$@

docker run \
    --lxc-conf="lxc.network.flags=up" \
    --lxc-conf="lxc.network.ipv6=$NW_IP" \
    --lxc-conf="lxc.network.ipv6.gateway=$NW_GW" \
    $REST

Beim Aufrufen muss die IPv6 Adresse inklusive Subnetzmaske angegeben werden, also aaaa:bbbb:cccc:dddd::1:2/112.

Résumé

Nun ist es möglich mit Docker Container zu verwenden und sogar IPv6 direkt in die Container zu leiten.

Wie moderne Grafikkarten den Musikgenuss stören können…

Aktuell hatte ich das Problem, das mein Linux-Desktop keine Musik mehr abspielen wollte.

Zuerst einen Kopfhörer direkt an die (Onboard-)Soundkarte geklemmt, um Defekte im Verstärker, den Boxen, den Kabeln, etc. ausschließen zu können. Leider war es das nicht.

Die Lösung war viel mehr die in meiner ATI-Grafikkarte integrierte Audio-Lösung, die bei HDMI für den guten (naja nie getestet) Ton sorgen soll. Diese wird wohl standardmäßig anstelle der (Onboard-)Soundkarte verwendet.

Mit

lspci | grep Audio

kann man sich alle Audiogeräte anzeigen lassen. Ergab bei mir:

00:1b.0 Audio device: Intel Corporation 5 Series/3400 Series Chipset High Definition Audio (rev 05)
01:00.1 Audio device: ATI Technologies Inc Barts HDMI Audio [Radeon HD 6800 Series]

Nachdem ich die HDMI-Soundausgabe nicht brauche bzw. brauchen werden, war der Plan, diese zu deaktivieren. Mit

lsmod

nachschauen, eventuell ein Kernelmodul zuständig ist (sollte das Modul snd_hda_codec_hdmi sein). Nun muss man sein Linux daran hindern, dieses Modul zu laden. Dazu dient das sogenannte Blacklisting von Modulen. Unter Ubuntu im Verzeichnis /etc/modprobe.d eine Datein blacklist-hdmi.conf mit folgendem Inhalt anlegen:

blacklist snd_hda_codec_hdmi

Das Verhindert das Laden des Moduls beim Systemstart und so funktionierte auch die Soundausgabe wie gewohnt.

IPv6 auf Ubuntu Server deaktivieren

Frei nach diese Seite kann IPv6 zur Laufzeit und dauerthaft deaktiviert werden.

Geprüft werden kann, ob IPv6 aktiviert ist mit folgender Zeile:

cat /proc/sys/net/ipv6/conf/all/disable_ipv6

Bei der Ausgabe steht 0 für „IPv6 aktiv“ und 1 für „IPv6 inaktiv“.

IPv6 kann über die Datei sysctl.conf dauerhaft deaktiviert werden. Dazu am Ende folgende Zeilen einfügen:

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

Aktiviert werden diese Änderungen durch das Komando

sudo sysctl -p

oder per Neustart des Systems.

Statische IP auf Ubuntu (Server)

Original stammt von hier: http://www.howtogeek.com. Aber falls deren Content mal verschwindet, hier die Zusammenfassung:

In der Datei /etc/network/interfaces pro Interface folgendes eintragen:

auto eth0
iface eth0 inet static
        address 192.168.1.100
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255
        gateway 192.168.1.1

Nameserver wie üblich in der /etc/resolv.conf:

domain Towergroup.local
search Towergroup.local
nameserver 10.0.20.101

Danach kann man den dhcp-client auch wieder deinstallieren:

apt-get remove dhcp-client