V dnešní době se hodně mluví o kontejnerech, a všem co je možné dát do kontejneru. V případě, že jste již zkušenější uživatel a víte, jak Docker funguje, pak je pro Vás situace jednoduchá a technologii kontejnerů máte v podstatě v malíčku.

Co ale v případě, že jste úplný začátečník a rádi by jste si zkusili vytvořit kontejner a v něm spustit nějakou službu?

Je důležité zmínit, než si začneme připravovat prostředí pro vytvoření našeho prvního kontejneru a testovat jej, že kontejner NENÍ virtuálka ve smyslu VMware, Image pro Virtual Manager apod. kontejner spouští pouze jednu službu, která neustále běží, dokud nespadne. V případě selhání služby, se okamžitě nastartuje nový kontejner.
Jako příklad je web server, FTP server, či v podstatě služby.

Co je potřeba pro práci s Docker kontejnery?

Jak začít používat Docker technologii na Fedoře, je velmi dobře popsáno na Fedora Developer Portálu část Docker installation

Dále je potřeba pomocí příkazu dnf nainstalovat následující balíčky:

dnf install -y origin docker-registry

Tím bychom měli nainstalovány potřebné balíčky pro práci s Docker kontejnery a i samotný OpenShift,
který využijeme pro deploy našeho prvního kontejneru.

Konfigurace Docker kontejneru pro spolupráci s OpenShiftem

Před tím, než-li spustíme Docker službu a OpenShift, je potřeba trochu upravit Docker konfigurační soubor /etc/sysconfig/docker.

Zde je potřeba odkomentovat volbu INSECURE_REGISTRY a přidat IP adresu, kterou používá OpenShift.

Více informaci lze opět najít na Fedora Developer Portálu část Configuring Docker.

Po úpravě, Docker konfigurační soubor vypadá následovně:

$ cat /etc/sysconfig/docker | grep INSECURE
# adding the registry to the INSECURE_REGISTRY line and uncommenting it.
INSECURE_REGISTRY='--insecure-registry 172.30.0.0/16'

Spuštění Docker služby pomocí systemd

Pro spuštění Docker služby slouží příkaz

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

Pro ověření, jestli nám opravdu běží docker služba slouží příkaz

$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
    Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
    Active: active (running) since Mon 2016-11-07 15:11:41 CET; 20s ago
      Docs: http://docs.docker.com
Main PID: 2769 (docker-current)
     Tasks: 9
    CGroup: /system.slice/docker.service
            └─2769 /usr/bin/docker-current daemon --exec-opt native.cgroupdriver=systemd --selinux-enabled --log-driver=journald --insecure-registry 172.30.0.0
Nov 08 14:01:19 localhost.localdomain docker-current[2013]: time="2016-11-08T14:01:19.310721481+01:00" level=info msg="[graphdriver] using prior storage driver \"devicemapper\""
Nov 08 14:01:19 localhost.localdomain docker-current[2013]: time="2016-11-08T14:01:19.314271045+01:00" level=info msg="Graph migration to content-addressability took 0.00 seconds"
Nov 08 14:01:19 localhost.localdomain docker-current[2013]: time="2016-11-08T14:01:19.327088702+01:00" level=info msg="Firewalld running: true"
Nov 08 14:01:20 localhost.localdomain docker-current[2013]: time="2016-11-08T14:01:20.780845664+01:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16.
Nov 08 14:01:21 localhost.localdomain docker-current[2013]: time="2016-11-08T14:01:21.937088251+01:00" level=info msg="Loading kontejners: start."
Nov 08 14:01:21 localhost.localdomain docker-current[2013]: time="2016-11-08T14:01:21.937291016+01:00" level=info msg="Loading kontejners: done."
Nov 08 14:01:21 localhost.localdomain docker-current[2013]: time="2016-11-08T14:01:21.937406091+01:00" level=info msg="Daemon has completed initialization"
Nov 08 14:01:21 localhost.localdomain docker-current[2013]: time="2016-11-08T14:01:21.937513606+01:00" level=info msg="Docker daemon" commit="e03ddb8/1.10.3" execdriver=native-0.2 graphdrive
Nov 08 14:01:21 localhost.localdomain systemd[1]: Started Docker Application kontejner Engine.
Nov 08 14:01:21 localhost.localdomain docker-current[2013]: time="2016-11-08T14:01:21.956150356+01:00" level=info msg="API listen on /var/run/docker.sock"

Těmito kroky bychom měli Docker kontejner kompletně nakonfigurovaný a spuštěný.

Spuštění OpenShiftu

Na začátku článku, jsem se zmínil, že bychom rádi Docker kontejner nahrály na OpenShift. Za tímto účelem stačí spustit následující příkaz dodávaný balíčkem origin, jenž nám OpenShift spustí na našem lokálním počítači.

$ sudo oc cluster up
-- Checking OpenShift client ... OK
-- Checking Docker client ... OK
-- Checking Docker version ... OK
-- Checking for existing OpenShift kontejner ... OK
-- Checking for openshift/origin:v1.3.0 image ... 
   Pulling image openshift/origin:v1.3.0
   Pulled 0/3 layers, 2% complete
   Pulled 1/3 layers, 53% complete
   Pulled 2/3 layers, 83% complete
   Pulled 3/3 layers, 100% complete
   Extracting
-- Checking Docker daemon configuration ... OK
-- Checking for available ports ...
    WARNING: Binding DNS on port 8053 instead of 53, which may be not be resolvable from all clients.
-- Checking type of volume mount ...
    Using nsenter mounter for OpenShift volumes
-- Creating host directories ... OK
-- Finding server IP ...
    Using 10.34.4.161 as the server IP
-- Starting OpenShift kontejner ...
    Creating initial OpenShift configuration
    Starting OpenShift using kontejner 'origin'
    Waiting for API server to start listening
    OpenShift server started
-- Installing registry ... OK
-- Installing router ... OK
-- Importing image streams ... OK
-- Importing templates ... OK
-- Login to server ... OK
-- Creating initial project "myproject" ... OK
-- Server Information ...
    OpenShift server started.
    The server is accessible via web console at:
        https://10.34.4.161:8443

    You are logged in as:

        User:     developer
        Password: developer

    To login as administrator:

        oc login -u system:admin

Příkaz oc cluster up zkontroluje následující věci:

  • Verzi Dockeru a zda-li je spuštěn.
  • Jestli je Docker správně nakonfigurován.
  • Dále přiřadí IP adresu pro OpenShift.
  • Nainstaluje interní docker-registr.
  • Vytvoří první projekt s názvem "myproject".
  • Jako poslední informace, zobrazí příkaz oc odkaz na OpenShift server a přístupové údaje na tento server.

Developer účet je používán pro vývoj či nahrání a další věci spojené s docker kontejnery, zatímco system:admin je používán pro získání systémových informací z OpenShift serveru. Oba účty budeme pro naše účely potřebovat.

Tím bychom měli spuštěny Docker daemona a OpenShift server.

Vytvoření Docker kontejneru

V následujících krocích vytvoříme jednoduchý Docker kontejner, který spustí jednoduchý echo command.

$ mkdir ~/docker-daemon-hello-world
$ cd ~/docker-daemon-hello-world

V adresáři vytvoříme Dockerfile, jež je pro docker důležitý.
Dockerfile v našem případě vypadá takto:

$ cat Dockerfile
FROM fedora:24
MAINTAINER "Petr Hracek" 
CMD [ "/bin/sh", "-c" , "while true; do echo Hello Docker World!; sleep 10; done" ]

Zbuildování Docker kontejneru

Pro zbuildování Docker kontejneru spustíme příkazem docker build -t docker-daemon-helloworld:0.1 .

$ docker build -t docker-daemon-helloworld:0.1 .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM fedora:24
Trying to pull repository docker.io/library/fedora ... 
24: Pulling from docker.io/library/fedora
2bf01635e2a0: Already exists 
Digest: sha256:7ffee69dbfaea363cba55db07942a5c0d29f291eaf510edd6c07f139001f4174
Status: Downloaded newer image for docker.io/fedora:24
 ---> f623aaef07f0
Step 2 : MAINTAINER "Petr Hracek" 
 ---> Running in ac5ec59148d8
 ---> d4401f3bc4bf
Removing intermediate kontejner ac5ec59148d8
Step 3 : CMD /bin/sh -c while true; do echo Hello Docker World!; sleep 10; done
 ---> Running in b2fd17829761
 ---> df517641add8
Removing intermediate kontejner b2fd17829761
Successfully built df517641add8
$ 

Pomocí příkazu docker images si můžeme zkontrolovat, zda-li vše proběhlo v pořádku.

$ docker images
REPOSITORY                                   TAG                 IMAGE ID            CREATED             SIZE
docker-daemon-helloworld                     0.1                 df517641add8        40 seconds ago      204.4 MB
docker.io/fedora                             24                  f623aaef07f0        14 hours ago        204.4 MB
docker.io/openshift/origin-deployer          v1.3.0              5bf464732ca8        8 weeks ago         487.1 MB
docker.io/openshift/origin-docker-registry   v1.3.0              59d447094a3c        8 weeks ago         345.5 MB
docker.io/openshift/origin-haproxy-router    v1.3.0              e33d4e33dffb        8 weeks ago         506.2 MB
docker.io/openshift/origin                   v1.3.0              7b24611e640f        8 weeks ago         487.1 MB
docker.io/openshift/origin-pod               v1.3.0              35873f68181d        8 weeks ago         1.591 MB
$ 

Jak lze vidět z výstupu, příkazem docker build se stáhl docker image s IMAGE ID f623aaef07f0 a zbuildovaný image má IMAGE ID df517641add8.

Otagování Docker kontejneru do lokálního docker repositáře

Před nahráním docker obrazu do kontejneru, jej nejprve označíme příkazem docker tag.
K tomu potřebujeme zjistit IMAGE ID pomocí příkazu docker images.
V našem případě to je df517641add8.

Docker kontejner označíme do našeho lokálního docker registru příkazem:

$ docker tag df517641add8 localhost.localdomain:5000/my-helloworld

Pro ověření, zda-li máme docker kontejner opravdu v lokálním docker registru, můžeme opět spustit příkaz docker images.
Výstup by měl být zhruba následující:

$ docker images
REPOSITORY                                   TAG                 IMAGE ID            CREATED             SIZE
docker-daemon-helloworld                     0.1                 df517641add8        6 minutes ago       204.4 MB
localhost.localdomain:5000/my-helloworld     latest              df517641add8        6 minutes ago       204.4 MB
docker.io/fedora                             24                  f623aaef07f0        14 hours ago        204.4 MB
docker.io/openshift/origin-deployer          v1.3.0              5bf464732ca8        8 weeks ago         487.1 MB
docker.io/openshift/origin-docker-registry   v1.3.0              59d447094a3c        8 weeks ago         345.5 MB
docker.io/openshift/origin-haproxy-router    v1.3.0              e33d4e33dffb        8 weeks ago         506.2 MB
docker.io/openshift/origin                   v1.3.0              7b24611e640f        8 weeks ago         487.1 MB
docker.io/openshift/origin-pod               v1.3.0              35873f68181d        8 weeks ago         1.591 MB
$ 

IMAGE ID musí být identické.

Přidání docker kontejneru do OpenShiftu

V podstatě existují dva přístupy, jak přidat docker kontejner do OpenShiftu. První je přidat jej jako obraz a druhý přes OpenShift docker-registr.

Přidání docker obraz do OpenShiftu jako obraz

Nejprve se do OpenShiftu přihlásíme jako developer s heslem developer. Heslo bylo zmíněno při spuštění OpenShiftu (oc cluster up).

$ sudo oc login -u developer

a spustíme příkaz:

$ sudo oc new-app docker-daemon-helloworld:0.1

Výstupem příkazu pak je:

$ sudo oc new-app docker-daemon-helloworld:0.1
W1116 12:32:56.797023    5104 newapp.go:333] Could not find an image stream match for "docker-daemon-helloworld:0.1". Make sure that a Docker image with that tag is available on the node for the deployment to succeed.
--> Found Docker image df51764 (9 minutes old) from  for "docker-daemon-helloworld:0.1"

    * This image will be deployed in deployment config "docker-daemon-helloworld"
    * The image does not expose any ports - if you want to load balance or send traffic to this component
      you will need to create a service with 'expose dc/docker-daemon-helloworld --port=[port]' later
    * WARNING: Image "docker-daemon-helloworld:0.1" runs as the 'root' user which may not be permitted by your cluster administrator

--> Creating resources with label app=docker-daemon-helloworld ...
    deploymentconfig "docker-daemon-helloworld" created
--> Success
    Run 'oc status' to view your app.
$ 

Přidání Docker kontejneru do OpenShiftu přes docker-registry

Druhou možností, jak přidat Docker kontejner do OpenShiftu, je přes docker-registry.

Prvně je nutné se přihlásit jako system:admin:

$ sudo oc login -u system:admin

Pokud chceme ověřit jak jsme přihlášení, příkaz je následující:

$ sudo oc whoami
system:admin 

Ke zjištění IP adresy OpenShift docker-registru, je příkaz:

$ sudo oc get svc -n default | grep docker-registry
docker-registry   172.30.178.172           5000/TCP                  18m
$

Nyní se přihlásíme zpět jako uživatel developer příkazem:

$ sudo oc login -u developer

Další krok je "spojit" lokální docker-registr s OpenShift docker-registrem. Provedeme příkazem:

$ sudo docker login -u developer -p $(sudo oc whoami -t) -e email_adress  172.30.178.172:5000

Docker kontejner opět označíme příkazem:

$ docker tag localhost.localdomain:5000/my-helloworld 172.30.178.172:5000/myproject/my-helloworld

Před vytvořením aplikace, Docker kontejner nahrajeme do OpenShiftu docker-registru příkazem:

$ sudo docker push 172.30.178.172:5000/myproject/my-helloworld
The push refers to a repository [172.30.178.172:5000/myproject/my-helloworld]
f40e681acd34: Pushed 
latest: digest: sha256:81dbec3a6f7ab17ca2fe86fe941e65bccbea119041eaedec180921c905b09c70 size: 4376
$

Pokud budeme chtít ověřit, jestli kontejner je v OpenShift docker-registru, k tomu slouží příkaz:

$ sudo oc get is
NAME            DOCKER REPO                                   TAGS      UPDATED
my-helloworld   172.30.178.172:5000/myproject/my-helloworld   latest    About a minute ago
$

Poslední krok je vytvoření aplikace v OpenShiftu

$ sudo oc new-app my-helloworld:latest --name=my-helloworld
--> Found image 783c4de (34 minutes old) in image stream my-helloworld under tag "latest" for "my-helloworld:latest"

    * This image will be deployed in deployment config "my-helloworld"
    * The image does not expose any ports - if you want to load balance or send traffic to this component
      you will need to create a service with 'expose dc/my-helloworld --port=[port]' later
    * WARNING: Image "myproject/my-helloworld:latest" runs as the 'root' user which may not be permitted by your cluster administrator

--> Creating resources with label app=my-helloworld ...
    deploymentconfig "my-helloworld" created
--> Success
    Run 'oc status' to view your app.
$

Jak vypadá UI z pohledu OpenShiftu

Zde je pár obrazovek, jak vypadá OpenShift po vytvoření aplikace.

OpenShift hlavní stránka aplikace

OpenShift hlavní stránka aplikace

Jak vypadá detail aplikace v OpenShiftu lze vidět na následujícím obrázku.

Detail OpenShift aplikace

Detail OpenShift aplikace

Pro kontrolu, co loguje náš docker image lze vidět na následujícím obrázku.

OpenShift log aplikace

OpenShift log aplikace

Smazání Docker kontejneru z OpenShiftu

Pokud budeme chtít smazat Docker kontejner z OpenShiftu v projektu s názvem 'myproject', provedeme to příkazem:

$ sudo oc delete dc helloworld -n myproject

Pokud Vás článek zaujal a chtěli by jste pracovat s Docker kontejnery, prosím kontaktujte phracek@redhat.com.

Links: