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.1725000/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
Jak vypadá detail aplikace v OpenShiftu lze vidět na následujícím obrázku.

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

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.