KONTIT
POMPPIMAAN
Docker, Kubernetes, OpenShift
arto.santala@solita.fi
HAASTEITA SOFTATUOTANNOSSA
› Miten käyttöjärjestelmätason resursseja, muuttujia, säätöjä, ympäristöä
hallitaan?
› Miten taataan että kehitys ja testiympäristöt ovat vastaavat ja ympäristö ei
muutu matkalla?
› Miten voidaan käyttää resursseja tehokkaasti kun sovellus muodostuu
lukuisista osista, esim. kanta, palvelu1, palvelu2, palvelu3, ui, jne?
› Miten toimitaan kun kehitystiimissä on Windows, OSX ympäristöjä, ja
testiympäristöissä CentOS/Ubuntu?
› Mites se DevOps?
DOCKER
› Container-malli, jossa jaetaan käyttöjärjestelmätason kernel
• Käynnistyy välittömästi, käyttää vähemmän muistia, jakaa koneen
resursseja tehokkaammin
• Ei välitä ympäristöstään
• Tuo riippuvuutensa mukanaan
• Eristetty verkon ja resurssien osalta
• Rakennetaan ja suoritetaan puhtaassa ympäristössä, immutable
container malli
https://www.docker.com/
https://www.slideshare.net/jpetazzo/docker-and-go-why-did-we-decide-to-write-docker-in-go
MITÄ KAIKKEE?
DOCKER IMAGET
› Image = Sovelluspaketti, jossa kerroksittain muutoksia
• Pystytään uudelleenkäyttämään kerroksia suoraan, esim.
Ubuntu/JDK/munjavasovellus
› Container = yksittäinen ’instanssi’ imagen pohjalta
• Omat ympäristömuuttujat, omat portit, oma tiedostojärjestelmä
• Ideana ei ole tunkea konttiin kaikkea mitä tarvitaan, vaan yhdistellä kontteja
› Repository – paikka jonne sovelluspaketit varastoidaan ja mistä ne haetaan,
esim. https://hub.docker.com
docker run ubuntu /bin/echo 'Hello world'
docker run -t -i ubuntu /bin/bash
docker run hello-world
MUT HEI, MIKSEI VAGRANT+ANSIBLE?
DOCKER KÄYTTÖÖNOTTO
› Docker Toolbox
› Docker for Mac
› Docker for Windows
› Tai ihan vaan tuttavallisesti:
• brew cask install docker
AJA JAVA YSILLÄ?
› docker run -it --rm openjdk:9-jdk java –version
› docker run -it --rm openjdk:9-jdk
› docker run –d –p 8080:8080 -v /tmp:/java
openjdk:9-jdk sh -c "cd /java; javac *.java; jar
myapp.jar *; java –jar myapp.jar”
MITEN HALLINNOIDAAN?
› docker ps
› docker ps –a
› docker stop #CONTAINERID
› docker rm #CONTAINERID
› docker build –t munsofta .
› docker history munsofta
› docker logs #CONTAINERID
› docker save munsofta –o
munsofta.tar
› docker load –i
./munsofta.tar
› docker rmi munsofta
DOCKERFILE
› Sensijaan että ajaisit dockeria komentoriviltä, voit määrittää
haluamasi konfiguraatiot tiedostoon
› Tiedosto voidaan ajaa, toistaa, levittää, versioida, jne
› Sovelluksen riippuvuudet ja tarpeet
• Docker build: rakennetaan paketti
• Docker run: Potkaistaan käyntiin
• Docker push: Julkaistaan repositoryyn
• Docker pull: Noudetaan paketti repositorystä
DOCKERFILE
FROM openjdk:8
VOLUME /tmp
ADD target/indexserver.jar app.jar
RUN sh -c 'touch /app.jar'ENTRYPOINT ["java","-
Djava.security.egd=file:/dev/./urandom","-
Dspring.profiles.active=docker","-Xmx1024m","-
jar","/app.jar"]
DOCKERFILE
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
ENV NGINX_HOST foobar.com
ENV NGINX_PORT 80
EXPOSE 80
CMD nginx”, “-g”, “’daemon off;’”]
DOCKERFILE
FROM dockerfile/ubuntu
RUN 
add-apt-repository -y ppa:nginx/stable && 
apt-get update && 
apt-get install -y nginx && 
rm -rf /var/lib/apt/lists/* && 
echo "ndaemon off;" >> /etc/nginx/nginx.conf && 
chown -R www-data:www-data /var/lib/nginx
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs",
"/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]
WORKDIR /etc/nginx
CMD ["nginx"]
EXPOSE 80 EXPOSE 443
DOCKER REGISTRY
› Hah, sille on tietysti oma image
› Voit pullia sen ja alkaa ajamaan omaa priva-registryä jonne voi
pushia ja pullia Docker kontteja ja imageita
› docker pull registry
› docker run –d –p5000:5000 registry
DOCKER-COMPOSE
› Docker-compose auttaa hallitsemaan useammasta containerista
koostuvia kokonaisuuksia, jotka pitäisi käynnistää yhdessä
› Versio 1 ja 2 välillä suuria eroja, esim. linkitys vs dependency ja
network asetukset
https://github.com/vegasbrianc/docker-compose-demo
DOCKER-COMPOSE
version: '2’
services:
elasticsearch:
build: ./elastic
environment:
- ES_HEAP_SIZE=4g
command: elasticsearch -Des.network.host=0.0.0.0
ports:
- "9200:9200”
- "9300:9300”
volumes:
- ./elastic/esdata:/usr/share/elasticsearch/data
pdfindexer:
build: ./indexserver
ports:
- "8080:8080”
depends_on:
- elasticsearch
volumes:
- ./indexserver/pdf-files:/pdf-files:ro
DOCKER + STACK
› Tulossa Docker 1.13 versiossa
› Kuten nimi vihjaa, kokoelma yhteenkuuluvia palveluita
› docker-cloud.yml
› Containerien sijasta luo palveluita (Service)
› Kuten docker-compose, mutta hieman enemmän
ympäristönhallintaa
• Deploy strategy, dns servers, restart-on-stop, roles, etc
• Eri stack tiedosto dev, staging, production, jne
https://docs.docker.com/docker-cloud/apps/stacks/
DOCKER SWARM
› Nyt päästään asiaan: Miten saada docker-ympäristöön mukaan
redundanssia, miten ajaa docker-kokonaisuuksia useampia rinnan?
› Docker Swarm on Docker-suunnalta tuleva ratkaisu tähän
› Service = edustapalvelin/proxy abstraktio
https://docs.docker.com/swarm/install-manual/
SWARM MODE: ACTIVE
DOCKER SWARM
› Swarm muodostuu virtuaalikoneiden klusterista, ainakin yksi
manager node ja yksi tai useampi worker node
• Paikallisessa sandboxissa helpointa testata docker-machine
virtuaalikoneilla
OSX TESTAILUA: VALMISTELU
docker-machine create --driver virtualbox manager1
docker-machine create --driver virtualbox worker1
docker-machine create --driver virtualbox worker2
https://github.com/docker/labs/tree/master/swarm-mode/beginner-tutorial
OSX TESTAILUA: SWARM LUONTI
docker-machine ssh manager1 "docker swarm init --listen-addr $(docker-
machine ip manager1) --advertise-addr $(docker-machine ip manager1)”
export worker_token=`docker-machine ssh manager1 "docker swarm join-token
worker -q"`
docker-machine ssh worker1 "docker swarm join --token $worker_token --
listen-addr $(docker-machine ip worker1) --advertise-addr $(docker-machine
ip worker1) $(docker-machine ip manager1):2377"
docker-machine ssh worker2 "docker swarm join --token $worker_token --
listen-addr $(docker-machine ip worker2) --advertise-addr $(docker-machine
ip worker2) $(docker-machine ip manager1):2377"
OSX TESTAILUA: KÄYTTÖ
docker-machine ssh manager1 docker node ls
docker-machine ssh worker1 docker swarm leave
docker-machine ssh worker2 docker swarm leave
docker-machine ssh manager1 docker swarm leave --force
KUBERNETES
› Googlella on ollut suuria tarpeita containerien käyttöön ja heidän
täytyi pystyä hallitsemaan niitä jo ennen kuin Docker Swarm saatiin
aikaan
› Apuna hallinnassa on väline nimeltä Kubernetes: Sillä on
päällekkäisyyttä Docker-compose ja Docker Swarm kanssa
› Erillinen CLI, erillinen API, erilliset yaml tiedostot
› Alunperin suosittu, mutta Swam kirii kiinni kovaa vauhtia…
http://kubernetes.io/
https://github.com/TheNewNormal/kube-cluster-osx
OPENSHIFT
› OpenShift on RedHat tekosia: Lisää työkaluja Docker ja Kubernetes
hallintaan
› Voisi ajatella, että tämä tuo abstraktion Kuberneteksen päälle, lisää
hallintatyökaluja ja automatiikkaa
› OpenShift on sekä ympäristö (Openshift online) että työkalupakki,
jota voi käyttää erillään, vaikka lokaalisti
OPENSHIFT CLOUDFORMS
DOCKER MONITOROINTI
› Dockerin omat kilkkeet
• docker logs, docker ps, docker inspect, docker stats
• echo -e "GET /containers/[CONTAINER_NAME]/stats HTTP/1.0rn"
| nc -U /var/run/docker.sock
› CAdvisor, Prometheus, Sensu, Logz.io
› Scout, Data Dog, Sysdig, New Relic, Dynatrace, SignalFx
TIPSUT JA TRIXXUT
› Imageissa löytyy useita vaihtoehtoja, on esim. erityisiä ‘lean java’ imageita
joissa vain minimit
› Kun image muodostuu layereistä, on fiksua ajaa aina cleanupit saman layer-
komennon yhteydessä
› Containereille on hyvä aina antaa labeleita, jotta ne löytää helposti
› Labeleilla voi ryhmitellä containereita nopeasti eri suunnista, esim.
• env=dev,staging,prod
• layer=front,backend,db
TIPSUT JA TRIXXUT
› Image-kansion voi siirtää eri paikkaan tilansäästömielessä, esim. muistikortilla
• Paitsi nykyisessä Docker for Mac versiossa…
• Teoriassa mahdollista linkittää…
• mv
~/Library/Containers/com.docker.docker/Data/com.docker.drive
r.amd64-linux/Docker.qcow2 /LargeDrive/Docker/Docker.qcow2
• ln -s /LargeDrive/Docker/Docker.qcow2
~/Library/Containers/com.docker.docker/Data/com.docker.drive
r.amd64-linux/Docker.qcow2
TIPSUT JA TRIXXUT
› Jos filu kasvaa lihavaksi, voi sen poistaa – huom siinä lähtee kaikki imaget!
• Quit Docker via menu
• rm
~/Library/Containers/com.docker.docker/Data/com.docker.drive
r.amd64-linux/Docker.qcow2
• Start Docker via Finder
TIPSUT JA TRIXXUT
› Miten kaikki/käyttämättömät imaget saa poistoon?
• docker rmi $(docker images –q)
• docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
• docker system prune (Docker 1.13)
DOCKER TUHMUUKSIA – ÄLÄ TEE!
› Dataa tai logeja containerin sisällä – käytä volume mappingiä!
› Kovakoodattuja viittauksia ip-osoitteisiin, containerien välillä –
käytä linkkejä, networkkejä, serviceitä!
› Uber containerit, jotka tekevät montaa asiaa yhtä aikaa – separation
of concerns!
› Fatit imaget, paljon tarpeettomia välivaiheita ja kerroksia, lihava
pohjaimage
› Credentiaaleja kontissa – sama kuin yleensä gitin kanssa myös
KIITOS!
› Palautetta, lisää näkökantoja?
https://github.com/crystoll/kontitpomppimaan
Kontit pomppimaan3

Kontit pomppimaan3

  • 1.
  • 2.
    HAASTEITA SOFTATUOTANNOSSA › Mitenkäyttöjärjestelmätason resursseja, muuttujia, säätöjä, ympäristöä hallitaan? › Miten taataan että kehitys ja testiympäristöt ovat vastaavat ja ympäristö ei muutu matkalla? › Miten voidaan käyttää resursseja tehokkaasti kun sovellus muodostuu lukuisista osista, esim. kanta, palvelu1, palvelu2, palvelu3, ui, jne? › Miten toimitaan kun kehitystiimissä on Windows, OSX ympäristöjä, ja testiympäristöissä CentOS/Ubuntu? › Mites se DevOps?
  • 3.
    DOCKER › Container-malli, jossajaetaan käyttöjärjestelmätason kernel • Käynnistyy välittömästi, käyttää vähemmän muistia, jakaa koneen resursseja tehokkaammin • Ei välitä ympäristöstään • Tuo riippuvuutensa mukanaan • Eristetty verkon ja resurssien osalta • Rakennetaan ja suoritetaan puhtaassa ympäristössä, immutable container malli https://www.docker.com/ https://www.slideshare.net/jpetazzo/docker-and-go-why-did-we-decide-to-write-docker-in-go
  • 4.
  • 5.
    DOCKER IMAGET › Image= Sovelluspaketti, jossa kerroksittain muutoksia • Pystytään uudelleenkäyttämään kerroksia suoraan, esim. Ubuntu/JDK/munjavasovellus › Container = yksittäinen ’instanssi’ imagen pohjalta • Omat ympäristömuuttujat, omat portit, oma tiedostojärjestelmä • Ideana ei ole tunkea konttiin kaikkea mitä tarvitaan, vaan yhdistellä kontteja › Repository – paikka jonne sovelluspaketit varastoidaan ja mistä ne haetaan, esim. https://hub.docker.com docker run ubuntu /bin/echo 'Hello world' docker run -t -i ubuntu /bin/bash docker run hello-world
  • 6.
    MUT HEI, MIKSEIVAGRANT+ANSIBLE?
  • 7.
    DOCKER KÄYTTÖÖNOTTO › DockerToolbox › Docker for Mac › Docker for Windows › Tai ihan vaan tuttavallisesti: • brew cask install docker
  • 8.
    AJA JAVA YSILLÄ? ›docker run -it --rm openjdk:9-jdk java –version › docker run -it --rm openjdk:9-jdk › docker run –d –p 8080:8080 -v /tmp:/java openjdk:9-jdk sh -c "cd /java; javac *.java; jar myapp.jar *; java –jar myapp.jar”
  • 9.
    MITEN HALLINNOIDAAN? › dockerps › docker ps –a › docker stop #CONTAINERID › docker rm #CONTAINERID › docker build –t munsofta . › docker history munsofta › docker logs #CONTAINERID › docker save munsofta –o munsofta.tar › docker load –i ./munsofta.tar › docker rmi munsofta
  • 10.
    DOCKERFILE › Sensijaan ettäajaisit dockeria komentoriviltä, voit määrittää haluamasi konfiguraatiot tiedostoon › Tiedosto voidaan ajaa, toistaa, levittää, versioida, jne › Sovelluksen riippuvuudet ja tarpeet • Docker build: rakennetaan paketti • Docker run: Potkaistaan käyntiin • Docker push: Julkaistaan repositoryyn • Docker pull: Noudetaan paketti repositorystä
  • 11.
    DOCKERFILE FROM openjdk:8 VOLUME /tmp ADDtarget/indexserver.jar app.jar RUN sh -c 'touch /app.jar'ENTRYPOINT ["java","- Djava.security.egd=file:/dev/./urandom","- Dspring.profiles.active=docker","-Xmx1024m","- jar","/app.jar"]
  • 12.
    DOCKERFILE FROM nginx COPY nginx.conf/etc/nginx/nginx.conf ENV NGINX_HOST foobar.com ENV NGINX_PORT 80 EXPOSE 80 CMD nginx”, “-g”, “’daemon off;’”]
  • 13.
    DOCKERFILE FROM dockerfile/ubuntu RUN add-apt-repository-y ppa:nginx/stable && apt-get update && apt-get install -y nginx && rm -rf /var/lib/apt/lists/* && echo "ndaemon off;" >> /etc/nginx/nginx.conf && chown -R www-data:www-data /var/lib/nginx VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"] WORKDIR /etc/nginx CMD ["nginx"] EXPOSE 80 EXPOSE 443
  • 14.
    DOCKER REGISTRY › Hah,sille on tietysti oma image › Voit pullia sen ja alkaa ajamaan omaa priva-registryä jonne voi pushia ja pullia Docker kontteja ja imageita › docker pull registry › docker run –d –p5000:5000 registry
  • 15.
    DOCKER-COMPOSE › Docker-compose auttaahallitsemaan useammasta containerista koostuvia kokonaisuuksia, jotka pitäisi käynnistää yhdessä › Versio 1 ja 2 välillä suuria eroja, esim. linkitys vs dependency ja network asetukset https://github.com/vegasbrianc/docker-compose-demo
  • 16.
    DOCKER-COMPOSE version: '2’ services: elasticsearch: build: ./elastic environment: -ES_HEAP_SIZE=4g command: elasticsearch -Des.network.host=0.0.0.0 ports: - "9200:9200” - "9300:9300” volumes: - ./elastic/esdata:/usr/share/elasticsearch/data pdfindexer: build: ./indexserver ports: - "8080:8080” depends_on: - elasticsearch volumes: - ./indexserver/pdf-files:/pdf-files:ro
  • 17.
    DOCKER + STACK ›Tulossa Docker 1.13 versiossa › Kuten nimi vihjaa, kokoelma yhteenkuuluvia palveluita › docker-cloud.yml › Containerien sijasta luo palveluita (Service) › Kuten docker-compose, mutta hieman enemmän ympäristönhallintaa • Deploy strategy, dns servers, restart-on-stop, roles, etc • Eri stack tiedosto dev, staging, production, jne https://docs.docker.com/docker-cloud/apps/stacks/
  • 18.
    DOCKER SWARM › Nytpäästään asiaan: Miten saada docker-ympäristöön mukaan redundanssia, miten ajaa docker-kokonaisuuksia useampia rinnan? › Docker Swarm on Docker-suunnalta tuleva ratkaisu tähän › Service = edustapalvelin/proxy abstraktio https://docs.docker.com/swarm/install-manual/
  • 19.
  • 20.
    DOCKER SWARM › Swarmmuodostuu virtuaalikoneiden klusterista, ainakin yksi manager node ja yksi tai useampi worker node • Paikallisessa sandboxissa helpointa testata docker-machine virtuaalikoneilla
  • 21.
    OSX TESTAILUA: VALMISTELU docker-machinecreate --driver virtualbox manager1 docker-machine create --driver virtualbox worker1 docker-machine create --driver virtualbox worker2 https://github.com/docker/labs/tree/master/swarm-mode/beginner-tutorial
  • 22.
    OSX TESTAILUA: SWARMLUONTI docker-machine ssh manager1 "docker swarm init --listen-addr $(docker- machine ip manager1) --advertise-addr $(docker-machine ip manager1)” export worker_token=`docker-machine ssh manager1 "docker swarm join-token worker -q"` docker-machine ssh worker1 "docker swarm join --token $worker_token -- listen-addr $(docker-machine ip worker1) --advertise-addr $(docker-machine ip worker1) $(docker-machine ip manager1):2377" docker-machine ssh worker2 "docker swarm join --token $worker_token -- listen-addr $(docker-machine ip worker2) --advertise-addr $(docker-machine ip worker2) $(docker-machine ip manager1):2377"
  • 23.
    OSX TESTAILUA: KÄYTTÖ docker-machinessh manager1 docker node ls docker-machine ssh worker1 docker swarm leave docker-machine ssh worker2 docker swarm leave docker-machine ssh manager1 docker swarm leave --force
  • 24.
    KUBERNETES › Googlella onollut suuria tarpeita containerien käyttöön ja heidän täytyi pystyä hallitsemaan niitä jo ennen kuin Docker Swarm saatiin aikaan › Apuna hallinnassa on väline nimeltä Kubernetes: Sillä on päällekkäisyyttä Docker-compose ja Docker Swarm kanssa › Erillinen CLI, erillinen API, erilliset yaml tiedostot › Alunperin suosittu, mutta Swam kirii kiinni kovaa vauhtia… http://kubernetes.io/ https://github.com/TheNewNormal/kube-cluster-osx
  • 25.
    OPENSHIFT › OpenShift onRedHat tekosia: Lisää työkaluja Docker ja Kubernetes hallintaan › Voisi ajatella, että tämä tuo abstraktion Kuberneteksen päälle, lisää hallintatyökaluja ja automatiikkaa › OpenShift on sekä ympäristö (Openshift online) että työkalupakki, jota voi käyttää erillään, vaikka lokaalisti
  • 26.
  • 27.
    DOCKER MONITOROINTI › Dockerinomat kilkkeet • docker logs, docker ps, docker inspect, docker stats • echo -e "GET /containers/[CONTAINER_NAME]/stats HTTP/1.0rn" | nc -U /var/run/docker.sock › CAdvisor, Prometheus, Sensu, Logz.io › Scout, Data Dog, Sysdig, New Relic, Dynatrace, SignalFx
  • 28.
    TIPSUT JA TRIXXUT ›Imageissa löytyy useita vaihtoehtoja, on esim. erityisiä ‘lean java’ imageita joissa vain minimit › Kun image muodostuu layereistä, on fiksua ajaa aina cleanupit saman layer- komennon yhteydessä › Containereille on hyvä aina antaa labeleita, jotta ne löytää helposti › Labeleilla voi ryhmitellä containereita nopeasti eri suunnista, esim. • env=dev,staging,prod • layer=front,backend,db
  • 29.
    TIPSUT JA TRIXXUT ›Image-kansion voi siirtää eri paikkaan tilansäästömielessä, esim. muistikortilla • Paitsi nykyisessä Docker for Mac versiossa… • Teoriassa mahdollista linkittää… • mv ~/Library/Containers/com.docker.docker/Data/com.docker.drive r.amd64-linux/Docker.qcow2 /LargeDrive/Docker/Docker.qcow2 • ln -s /LargeDrive/Docker/Docker.qcow2 ~/Library/Containers/com.docker.docker/Data/com.docker.drive r.amd64-linux/Docker.qcow2
  • 30.
    TIPSUT JA TRIXXUT ›Jos filu kasvaa lihavaksi, voi sen poistaa – huom siinä lähtee kaikki imaget! • Quit Docker via menu • rm ~/Library/Containers/com.docker.docker/Data/com.docker.drive r.amd64-linux/Docker.qcow2 • Start Docker via Finder
  • 31.
    TIPSUT JA TRIXXUT ›Miten kaikki/käyttämättömät imaget saa poistoon? • docker rmi $(docker images –q) • docker rmi $(docker images --filter "dangling=true" -q --no-trunc) • docker system prune (Docker 1.13)
  • 32.
    DOCKER TUHMUUKSIA –ÄLÄ TEE! › Dataa tai logeja containerin sisällä – käytä volume mappingiä! › Kovakoodattuja viittauksia ip-osoitteisiin, containerien välillä – käytä linkkejä, networkkejä, serviceitä! › Uber containerit, jotka tekevät montaa asiaa yhtä aikaa – separation of concerns! › Fatit imaget, paljon tarpeettomia välivaiheita ja kerroksia, lihava pohjaimage › Credentiaaleja kontissa – sama kuin yleensä gitin kanssa myös
  • 33.
    KIITOS! › Palautetta, lisäänäkökantoja? https://github.com/crystoll/kontitpomppimaan