NÄIN VÄHENNÄT YLLÄPIDETTÄVIEN KÄYTTÖJÄRJESTELMIEN MÄÄRÄÄ DOCKEREILLA
Dockerit on tapa ajaa sovelluksia omissa kontitetuissa ympäristöissään. Dockereiden suurin etu on niiden sisällä olevien sovellusten siirrettävyys alustalta tai arkkitehtuurilta toiseen ilman, että niiden alla olevaan käyttöjärjestelmään tai palvelimeen tarvitsee sovelluksen kannalta juurikaan kiinnittää huomiota. Tämä vähentää turhaan käyttöjärjestelmien kanssa pelaamiseen käytettyä aikaa ja vapauttaa resursseja itse tekemiseen.
Toinen loistava ominaisuus on kaikille yhtenäinen ympäristö. Esimerkiksi softakehittäjät voivat koodata omalla läppärillään sovellusta kontteihni, joiden ympäristö on identtinen pilvessä pyörivän tuotannon kanssa.
Yllä oleva kuva havainnollistaa, miten Dockerien käyttö voi merkittävästi vähentää ylläpidettävien käyttöjärjestelmien (Guest OS) määrää ympäristössä. Tämä helpottaa ylläpitoa ja luo joustavuutta kehittäjille.
Moniin tavanomaisiin teknologioihin ja sovelluksiin löytyy valmiita pohjia Dockerhubista. Oman Docker imagen voi luoda tekemällä määrittelytiedoston, eli Dockerfilen. Dockerfilessä kuvataan mitä ominaisuuksia, sovelluksia ja esivalmisteluja imageen halutaan viedä itse sovelluksen suorittamista varten.
Dockerfilejä on helppo versio hallita esim. Gitillä, jolloin konfiguraatiosta säilyy automaattisesti historiatieto. Kuinka moni muistaa miettineensä, että mitenkäs sitä muutama vuosi sitten asennettiin se epästandardi versio jostain laajennuksesta, kun sovelluksen kehitystiimi sitä vaati?
Seuraavassa esimerkissä luodaan yksinkertainen Docker image, jossa pyörii Nginx-webpalvelin. Tätä varten Dockerfile tiedostoon määritellään seuraavat parametrit:
FROM centos:centos7 RUN yum install epel-release -y RUN yum update -y && yum install nginx -y ADD run.sh /run.sh RUN sed -i '1 i\daemon off;' /etc/nginx/nginx.conf RUN chmod +x /run.sh EXPOSE 80 ENTRYPOINT /run.sh
Kyseessä on hyvin yksinkertainen konfiguraatio, joka hakee pohjaimageksi CentOS 7 ympäristön ja ajaa siihen viimeisimmät tietoturvapäivitykset sekä asentaa Nginx-palvelimen omasta RPM-repositorysta. Lopuksi imageen lisätään tiedosto, jolla nginx saadaan käynnistymään aina, kun docker luodaan imagesta. Asetamme sen myös käynnistymään suoraan prosessina run.sh scriptiä kutsuttaessa. Tiedostossa määritellään myös missä portissa luotu docker kuuntelee, kun se on käynnissä.
run.sh sisältää vain komennon jolla nginx käynnistetään.
#!/bin/bash /usr/sbin/nginx
Tallenna tiedosto nimellä run.sh
Nyt kun määritys imagea varten on valmis haluamme saada sen ajoon. Luomme tätä varten Telia INcloud 9 -palveluun instanssin, jossa voimme ajaa Dockereita. Haluamme myös esikonfiguroida User dataa hyväksikäyttäen virtuaalipalvelimen suoraan valmiiksi Dockeriamme varten. Tätä varten käytämme cloud-init ohjelmaa. Se on asennettu valmiiksi kaikkiin Telian tarjoamiin imageihin. Konfiguraatio on äärimmäisen helppo ja yksinkertainen:
#cloud-config timezone: Europe/Helsinki package_upgrade: true packages: - docker
runcmd: - [ systemctl, enable, docker.service ] - [ systemctl, start , docker.service ]
Kerromme cloud-config -datalla instanssille, että haluamme aikavyöhykkeeksi Helsingin, päivittää kaikki paketit viimeisimpään versioon sekä asentaa Docker-palvelimen riippuvuuksineen. Lopuksi vielä Docker service aktivoidaan ja käynnistetään. Huomaa, että esimerkin ”runcmd”-osuus on systemd:lle, joka on käytössä esim. CentOS/RHEL7 jakeluissa. Ubuntulle ja Debianille löytyy omat työkalut serviceiden hallintaan. User-data luetaan, kun instanssi käynnistyy ja cloud-init noutaa metadatan itselleen työstettäväksi.
User datan voi antaa API:n, CLI-työkalujen tai käyttöliittymän kautta "userdata" kenttään:
Kun instanssi on käynnistynyt ja cloud-init suorittanut sille annetut tehtävät, voimme varmistaa, että instanssi on valmis tarjoilemaan docker containereita:
# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Meillä on nyt kaksi tiedostoa, Dockerfile sekä run.sh. Luomme näistä imagen josta voimme laittaa dockerin ajoon:
# docker build –t nginx .
...
Kun image on valmis käynnistetään docker.
# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE nginx latest 66c461df60d9 28 seconds ago 323.5 MB centos centos7 34943839435d 2 weeks ago 224 MB # docker run -t -i -d -p 80:80 --name www nginx # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES aedc1cc8f240 nginx:latest "/bin/sh -c /run.sh 1 seconds ago Up 1 seconds 0.0.0.0:80->80/tcp www
nginx on nyt omassa docker containerissaan ajossa ja siihen voidaan yhdistää instanssin julkiosoitteella:
Esimerkki on hyvin yksinkertainen ja se tarkoitus on näyttää miten Telian OpenStack-pohjaisessa INcloud 9 -palvelussa voidaan ajaa Dockereita. Isoissa Docker-ympäristöissä suosittelemme tutustumaan CoreOS käyttöjärjestelmään. Kyseisen käyttöjärjestelmän hallinnointi ja käyttöönotto on suhteellisen helppoa ja se sisältää mm. HA-ominaisuudet dockereiden ajamiseen. Lisäksi siitä löytyy suoraan image OpenStackissa käytettäväksi.