kontit pomppimaan3
TRANSCRIPT
KONTIT POMPPIMAANDocker, Kubernetes, OpenShift
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ä
DOCKERFILEFROM openjdk:8VOLUME /tmpADD target/indexserver.jar app.jarRUN sh -c 'touch /app.jar'ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dspring.profiles.active=docker","-Xmx1024m","-jar","/app.jar"]
DOCKERFILEFROM nginxCOPY nginx.conf /etc/nginx/nginx.conf
ENV NGINX_HOST foobar.comENV NGINX_PORT 80
EXPOSE 80
CMD nginx”, “-g”, “’daemon off;’”]
DOCKERFILEFROM dockerfile/ubuntuRUN \ 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/nginxVOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]WORKDIR /etc/nginxCMD ["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-COMPOSEversion: '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: VALMISTELUdocker-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 LUONTIdocker-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 leavedocker-machine ssh worker2 docker swarm leavedocker-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.0\r\n" | 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.driver.amd64-linux/Docker.qcow2 /LargeDrive/Docker/Docker.qcow2
• ln -s /LargeDrive/Docker/Docker.qcow2 ~/Library/Containers/com.docker.docker/Data/com.docker.driver.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.driver.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