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.
Jak vypadá detail aplikace v OpenShiftu lze vidět na následujícím obrázku.
Pro kontrolu, co loguje náš docker image lze vidět na následujícím obrázku.
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.