1
0
forked from pms/ium

Zajecia 04

This commit is contained in:
Tomasz Ziętkiewicz 2021-03-29 01:12:24 +02:00
parent fd7b4bd9ed
commit 9feb07844d
8 changed files with 11211 additions and 0 deletions

503
IUM_04.Konteneryzacja.ipynb Normal file
View File

@ -0,0 +1,503 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Konteneryzacja\n",
"Plan na dziś\n",
"\n",
"1. Konteneryzacja i Docker\n",
"2. Integracja Docker-Jenkins"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. Konteneryzacja\n",
"- Konteneryzacja to metoda tworzenia lekkich, odizolowanych środowisk uruchomieniowych\n",
"- Różnica między konteneryzacją a maszynami wirtualnymi:\n",
" - Wirtualizacja na poziomie systemu operacyjnego a nie sprzętu\n",
" - Konteneryzacja jest lżejsza: kontener używa tego samego jądra (kernel) co system hosta - mniejszy narzut\n",
" - Konteneryzacja zapewnia gorszy stopień izolacji od hosta\n",
" - Dzięki dostępnym narzędziom i infrastrukturze kontenery są łatwiejsze w utrzymywaniu i bardziej przenośne\n",
"- Ułatwiają:\n",
" - rozwój,\n",
" - uruchamianie\n",
" - i dostarczanie\n",
"aplikacji.\n",
"- Konteneryzacja to nie tylko Docker:\n",
" - chroot\n",
" - Solaris Containers\n",
" - LXC (Linux Containers)\n",
" - OpenVZ\n",
" - Windows containers\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1.1 Docker\n",
"- Najpopularniejszy obecnie system konteneryzacji\n",
"- Działa w m.in. na systemach Linux, Windows i Max OS\n",
"- Udostępnia narzędzia i serwisy ułatwiające korzystanie, zarządzanie i dzielenie się kontenerami\n",
"- Docker umożliwia stworzenie paczki zawierającej sam program jak i środowisko, w którym ma być on uruchomiony\n",
" \n",
"- Dokumentacja: https://docs.docker.com/get-started/\n",
"</br><img style=\"height: 50px;\" src=\"img/environments/docker.png\"/>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1.1 Terminologia\n",
" - *Container* (kontener) - instancja obrazu. Może być uruchomiona, zatrzymana. Stan kontenera można zapisać tworząc nowy obraz. Uruchomienie kontenera zazwyczaj zajmuje mało czasu.\n",
" - *Image* (obraz) - niezmienny (readonly) przepis na stworzenie kontenera. Obrazy można ściągnąć lub udostępnić za pośrednictem *rejestru*. Budowanie obrazu trwa zazwyczaj długo.\n",
" - *Dockerfile* - plik tekstowy zawierający przepis na zbudowanie obrazu\n",
" - *Docker registry* - rodzaj repozytorium, przechowującego obrazy dockera\n",
" - *Docker Hub* - publiczne *Docker registry*, z którego każdy może pobrać potrzebne mu obrazy oraz publikować swoje"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1.2 Jak zacząć?\n",
" - Na komputerach w laboratoriach: https://laboratoria.wmi.amu.edu.pl/en/issues/docker/\n",
" - Lokalnie: [instalacja](https://docs.docker.com/engine/install/)\n",
" - Możliwa zarówno pod Linux, Windows i MacOS.\n",
" - Kontenery Linuxowe można uruchamiać również pod Windowsem (za pomocą Docker Desktop lub WSL 2 (Windows Subsystem for Linux). Pod spodem oba używają maszyny wirtualnej (Hyper-V) z Linuxem, w której uruchamiane są kontenery [link](https://www.docker.com/blog/docker-hearts-wsl-2/)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1.3 Podstawowe polecenia\n",
"- ```docker help [polecenie]``` - wyświetla listę dostępnych poleceń dockera lub opis podanego polecenia. Rozbudowana dokumentacja poleceń: https://docs.docker.com/engine/reference/commandline/docker/\n",
"- ```docker run``` - uruchamia istniejący obraz tworząc kontener. Przykładowe wywołania:\n",
" - ```docker run -i -t ubuntu```<br>\n",
" Uruchamia kontener z obrazu \"ubuntu\", allokuje terminal (`-t`) i ustawia tryb \"interaktywny\" (`-i`), dzięki czemu dostajemy terminal \"wenątrz\" kontenera i możemy wywoływać w nim polecenia\n",
"\n",
" - ```docker run -p 8080:8080 jenkins/jenkins:lts```<br>\n",
" Uruchomi kontener z Jenkinsem, w wersji \"LTS\". Jeśli obraz Jenkins nie był wcześniej zbudowany/pobrany na lokalną maszynę, automatycznie zostanie pobrany z [Docker Hub](https://hub.docker.com/r/jenkins/jenkins).\n",
" Port 8080 konenera zostanie powiązany z portem 8080 hosta. Dzięki temu będziemy mogli w przeglądarce dostać się do Jenkinsa pod adresem http://localhost:8080\n",
" Ważne: po zatrzymaniu kontenera \n",
"- ```docker build [OPTIONS] PATH | URL | -``` - buduje obraz na podstawie pliku Dockerfile i kontekstu (plików dostępnych podczas budowania). Przykład:<br>\n",
" - ```docker build -t tzietkiewicz/helloworld:1.0 .```<br>\n",
" buduje obraz przekazując bieżący katalog (`.`) jako kontekst i korzystając z pliku Dockerfile znajdującego się tamże. Obraz zostanie otagowany (`-t`) tagiem `tzietkiewicz/helloworld` z wersją `1.0`\n",
"- ```docker images``` - listuje dostępne lokalnie obrazy\n",
"- ```docker ps``` - listuje uruchomione/zatrzymane kontenery\n",
"- ```docker stop CONTAINER_ID``` - zatrzymuje kontener. Uruchomione w nim procesy zostają wyłączone (`SIGTERM` -> `SIGKILL`)\n",
"- ```docker start CONTAINER_ID``` - uruchamia ponownie kontener\n",
"- ```docker system prune``` - usuwa nieużywane obrazy i kontenery, zazwyczaj zwalniając sporo miejsca na dysku"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1.4 Interakcja/komunikacja z kontenerem\n",
" - Poprzez terminal\n",
" - Poprzez `docker exec` - wywołanie polecenia w działającym kontenerze\n",
" - Poprzez port zmapowany przez flagę `-p` (np. REST API albo interfejs w przegląrce)\n",
" - Przez system plików: podmontowanie katalogów hosta w kontenerze poprzez flagę `-v` [dokumentacja](https://docs.docker.com/engine/reference/commandline/run/#mount-volume--v---read-only)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Zadanie 1 [na zajęciach]\n",
"1. Zainstaluj Docker (lub skorzystaj z https://laboratoria.wmi.amu.edu.pl/en/issues/docker/)\n",
"2. Uruchom obraz `ubuntu` w trybie interaktywnym z terminalem (`docker run -ti ubuntu`)\n",
"\n",
"Poniższe punkty wywołujemy wewnątrz kontenera (w otwartym właśnie terminalu):\n",
"\n",
"3. Jaka wersja Ubuntu działa w kontenerze? (polecenie `cat /etc/issue`)\n",
"4. Jaki użytkownik wywołuje polecenia? (polecenie `whoami`)\n",
"5. Jaki jest bieżący katalog? (polecenie `pwd`)\n",
"5. Jaki procesor jest widoczny w środku kontenera? Czy jest to procesor Twojej maszyny? (`lscpu`)\n",
"6. Ile wolnego miejsca na dysku jest widoczne wewnątrz kontenera (`df -h`)? Czy jest to zgodne z tym, co pokazuje maszyna hosta?\n",
"7. Sprawdź ile dostępnej pamięci RAM widać w konenerze (`free -h`). Czy zgadza się to z wynikiem na maszynie hosta?\n",
"8. Spróbuj uruchomić jedno z popularnych narzędzi Linuksowych, dostępnych na maszynie hosta (np. `vim`, `less`, `htop`). Czy udało się je uruchomić?\n",
"9. Zainstaluj w kontenerze jedno z brakujących narzędzi, np: `apt update; apt install htop`\n",
"10. Uruchom następujące polecenie: <br>\n",
"`while true; do date > time.log; sleep 1; done`\n",
"będzie ono co sekundę zapisywać bieżący timestamp w pliku time.log\n",
"\n",
"Poniższe polecenia wykonujemy na zewnątrz kontenera (otwórz w tym celu nową konsolę):\n",
"\n",
"11. Sprawdź ID uruchomionego kontenera (`docker ps`) i zatrzymaj go (`docker stop`)\n",
"12. Sprawdź co się stało w oknie z konsolą kontenera\n",
"13. Uruchom kontener jeszcze raz (`docker start`). Gdzie jest nasza konsola?!!\n",
"14. Żeby otrzymać konsolę, wykonaj jedno z poniższych:\n",
" - zatrzymaj kontener i uruchom jeszcze raz z flagą `-i`\n",
" - uruchom polecenie \"bash\" w kontenerze za pomocą polecenia `docker exec -ti CONTAINER_ID bash` - pozwala ono uruchomić dowolne polecenie w działającym kontenerze.\n",
"15. Czy polecenie `while true; do date > time.log; sleep 1; done` wciąż działa? Sprawdź ostatni timestamp zapisany do pliku `time.log`"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1.4 Dockerfile\n",
"\n",
" - Dokumentacja: https://docs.docker.com/engine/reference/builder/\n",
"\n",
" - Dockerfile składa się z serii poleceń.\n",
" - Polecenia dockera są pisane WIELKIMI LITERAMI\n",
" - Wywołanie każdego polecenia tworzy nową warstwę (*layer*)\n",
" - Jeśli zbudowaliśmy obraz a potem zmieniliśmy jedno z poleceń / dodaliśmy nowe, to przebudowane zostaną tylko warstwy od zmienionej w dół (osczędność czasu i zasobów)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Przykładowy Dockerfile:\n",
"```Dockerfile\n",
"# Nasz obraz będzie dzidziczył z obrazu Ubuntu w wersji latest\n",
"FROM ubuntu:latest\n",
"\n",
"# Instalujemy niezbędne zależności. Zwróć uwagę na flagę \"-y\" (assume yes)\n",
"RUN apt update && apt install -y figlet\n",
"\n",
"# Stwórzmy w kontenerze (jeśli nie istnieje) katalog /app i przejdźmy do niego (wszystkie kolejne polecenia RUN, CMD, ENTRYPOINT, COPY i ADD będą w nim wykonywane)\n",
"WORKDIR /app\n",
"\n",
"# Skopiujmy nasz skrypt do katalogu /app w kontenerze\n",
"COPY ./figlet-loop.sh ./\n",
"\n",
"# Domyślne polecenie, które zostanie uruchomione w kontenerze po jego starcie\n",
"CMD ./figlet-loop.sh\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Zawartość pliku `figlet-loop.sh`:\n",
"```bash\n",
"#!/bin/bash\n",
"while read line; do\n",
"\tfiglet \"$line\"\n",
"done\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Budujemy obraz:\n",
"```bash\n",
"docker build -t figlet-loop .\n",
"```\n",
"\n",
"```\n",
"Sending build context to Docker daemon 3.072kB\n",
"Step 1/5 : FROM ubuntu:latest\n",
" ---> 94e814e2efa8\n",
"Step 2/5 : RUN apt update && apt install -y figlet\n",
"\n",
" ---> Running in ba8b14deeeca\n",
"Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]\n",
"[...]\n",
"Get:18 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [1402 kB]\n",
"Fetched 22.3 MB in 3s (8343 kB/s)\n",
"Reading package lists...\n",
"Building dependency tree...\n",
"Reading state information...\n",
"[...]\n",
"Reading package lists...\n",
"Building dependency tree...\n",
"Reading state information...\n",
"The following NEW packages will be installed:\n",
" figlet\n",
"0 upgraded, 1 newly installed, 0 to remove and 50 not upgraded.\n",
"Need to get 133 kB of archives.\n",
"After this operation, 752 kB of additional disk space will be used.\n",
"Get:1 http://archive.ubuntu.com/ubuntu bionic/universe amd64 figlet amd64 2.2.5-3 [133 kB]\n",
"debconf: delaying package configuration, since apt-utils is not installed\n",
"Fetched 133 kB in 0s (605 kB/s)\n",
"Selecting previously unselected package figlet.\n",
"(Reading database ... 4039 files and directories currently installed.)\n",
"Preparing to unpack .../figlet_2.2.5-3_amd64.deb ...\n",
"Unpacking figlet (2.2.5-3) ...\n",
"Setting up figlet (2.2.5-3) ...\n",
"update-alternatives: using /usr/bin/figlet-figlet to provide /usr/bin/figlet (figlet) in auto mode\n",
"update-alternatives: warning: skip creation of /usr/share/man/man6/figlet.6.gz because associated file /usr/share/man/man6/figlet-figlet.6.gz (of link group figlet) doesn't exist\n",
"Removing intermediate container ba8b14deeeca\n",
" ---> 30470dc0bd47\n",
"Step 3/5 : WORKDIR /app\n",
" ---> Running in 47ca74217790\n",
"Removing intermediate container 47ca74217790\n",
" ---> 0f352dfc965d\n",
"Step 4/5 : COPY ./figlet-loop.sh ./\n",
" ---> 450ba60dc50d\n",
"Step 5/5 : CMD ./figlet-loop.sh\n",
" ---> Running in 38f83a71b1a9\n",
"Removing intermediate container 38f83a71b1a9\n",
" ---> c6d81a065621\n",
"Successfully built figlet-loop:latest\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Uruchamiamy:\n",
"```\n",
"docker run -ti figlet-loop\n",
"Hello World!\n",
" _ _ _ _ __ __ _ _ _ \n",
"| | | | ___| | | ___ \\ \\ / /__ _ __| | __| | |\n",
"| |_| |/ _ \\ | |/ _ \\ \\ \\ /\\ / / _ \\| '__| |/ _` | |\n",
"| _ | __/ | | (_) | \\ V V / (_) | | | | (_| |_|\n",
"|_| |_|\\___|_|_|\\___/ \\_/\\_/ \\___/|_| |_|\\__,_(_)\n",
"\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Zamiast domyślnego polecenia (`figlet-loop.sh`) uruchommy bash, żeby sprawdzić, co jest w naszym kontenerze:\n",
"```bash\n",
"docker run -ti figlet-loop:latest bash\n",
"root@a44c68ce835e:/app# pwd\n",
"/app\n",
"root@a44c68ce835e:/app# ls -l\n",
"total 4\n",
"-rwxrwxr-x 1 root root 53 Mar 28 22:33 figlet-loop.sh\n",
"root@a44c68ce835e:/app# \n",
"\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Zadanie 2. [10 pkt]\n",
"1. Napisz prosty Dockerfile, który zdefinuje środowisko potrzebne do wywołania poleceń stworzonych na zajęciach \"2. Dane\". Przypuszczalnie wystarczy, że zainstalujesz zależności takie jak kaggle czy pandas, np: \n",
"```bash\n",
"!pip install --user kaggle\n",
"!pip install --user pandas\n",
"```\n",
"Niech zdefiniowany przez Ciebie obraz dziedziczy z jakiegoś popoularneg obrazu, np. `ubuntu`\n",
"Umieść Dockerfile w głównym katalogu repozytorium ze skryptami stworzonymi na zajęciach 2.\n",
"\n",
"2. Zbuduj obraz korzystając z polecenia `docker build .`\n",
" Na końcu otrzymasz id obrazu, który powstał\n",
"3. Uruchom kontener z terminalem `docker run -ti IMAGE_ID` podając ID obrazu, które otrzymałeś w poleceniu 2.\n",
"4. Spróbuj uruchomić jeden z twoich skryptów w kontenerze. Jeśli brakuje jakiś zależności: możesz spróbować zainstalować je interaktywnie w konsoli. W ten sposób będziesz wiedział jakie polecenia dodać do Dockerfile.\n",
"5. Utwórz bezpłatne konto na https://hub.docker.com/\n",
"6. Po zalogowaniu stwórz nowe repozytorium (https://hub.docker.com/repository/create), możesz nazwać je np. `ium`\n",
"7. W ustawieniach docker hub wygeneruj \"Access token\" (https://hub.docker.com/settings/security)\n",
"8. Uruchom `docker login --username TWÓJ_DOCKER_ID` i podaj stworzony w poprzednim kroku \"Access token\"\n",
"9. Dodaj tag do obrazu stworzonego 2 punkcie 3. Dzięki temu będzie można go opublikować: `docker tag IMAGE_ID TWÓJ_DOCKER_ID/ium:NUMER_WERSJI`. Mogliśmy otagować obraz na etapie jego budowania (flaga `-t`), ale wtedy nie znaliśmy jeszcze nazwy użytkownika i repozytorium z Docker Hub.\n",
"10. Teraz możesz wypchnąć swój otagowany obraz do repozytorium: `docker push TWÓJ_DOCKER_ID/ium:NUMER_WERSJI`\n",
"11. Twój obraz powinien być widoczny na Docker Hub. Inni mogą go teraz znaleźć na [Docker Hub](https://hub.docker.com/search?q=&type=image), np.:<br>\n",
"https://hub.docker.com/r/tzietkiewicz/ium <br>\n",
"oraz uruchomić wywołując: `docker run TWÓJ_DOCKER_ID/ium:NUMER_WERSJI`, np.:<br>\n",
"```docker run tzietkiewicz/ium```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. Integracja Docker-Jenkins"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.1 Jenkins\n",
"Jenkins może działać na wielu systemach operacyjnych:\n",
" - Linux\n",
" - Windows\n",
" - MacOS"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.1 Jenkins - Terminologia (https://www.jenkins.io/doc/book/glossary/):\n",
" - **Agent**: An agent is typically a machine, or container, which connects to a Jenkins controller and executes tasks when directed by the controller\n",
" - **Controller**: The central, coordinating process which stores configuration, loads plugins, and renders the various user interfaces for Jenkins\n",
" - **Master**: A deprecated term, synonymous with Controller.\n",
" - **Node**: A machine which is part of the Jenkins environment and capable of executing Pipelines or Projects. Both the Controller and Agents are considered to be Nodes.\n",
" - **Executor**: A slot for execution of work defined by a Pipeline or Project on a Node. A Node may have zero or more Executors configured which corresponds to how many concurrent Projects or Pipelines are able to execute on that Node."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Główna instancja Jenkinsa (tzw. *Controller* aka. *Master*) może mieć podłączonych kilka węzłów (\"nodes\") typu \"slave\".\n",
" - *Controller* jest odpowiedzialny za interakcję z użytkownikiem, rozdzielanie zadań dla między agentów\n",
" - Zadania (\"builds\") są wykonywane na jednym z \"Agentów\". Node, na którym jest uruchomiony \"Controller\" może działać również jako \"Agent\"\n",
" - Każdy węzeł może działać pod kontrolą innego systemu operacyjnego. Dzięki temu możemy wykonywać zadania (albo ich części) w różnych środowiskach\n",
" <img style=\"height: 300px;\" src=\"IUM_04/master-slave.png\"/>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" - Do definiowana gdzie może być wykonana dana część pipeline, służy sekcja [agent / node](https://www.jenkins.io/doc/book/pipeline/syntax/#agent). Poniższy kod wywoła sie tylko na węźle/węzłach \"myAgent\":\n",
" ```groovy\n",
" node(\"myAgent\") {\n",
" stage(\"One\"){\n",
" echo 'hello'\n",
" }\n",
"}\n",
" ```"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
" ## 2.2 Docker w Jenkins\n",
" <img style=\"height: 100px;\" src=\"IUM_04/docker-jenkins.png\"/></b>\n",
"\n",
" \n",
" - Więcej informacji: https://www.jenkins.io/doc/book/pipeline/docker/"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.2 Przykłady pipeline\n",
"Używanie gotowego obrazu:\n",
" - Scrippted pipeline:\n",
"```groovy\n",
" node {\n",
" docker.image('ubuntu:latest').inside {\n",
" stage('Test') {\n",
" sh 'cat /etc/issue'\n",
" }\n",
" }\n",
" }\n",
"```\n",
" - Declarative:\n",
" ```groovy\n",
" pipeline {\n",
" agent {\n",
" docker { image 'ubuntu:latest' }\n",
" }\n",
" stages {\n",
" stage('Test') {\n",
" steps {\n",
" sh 'cat /etc/issue'\n",
" }\n",
" }\n",
" }\n",
" }\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.2 Przykłady pipeline\n",
"Budowanie obrazu z Dockerfile:\n",
" - Scrippted pipeline:\n",
" ```groovy\n",
" node {\n",
" checkout scm\n",
" //Pierwszy argument to tag, który zostania nadany zbudowanemu obrazowi\n",
" //Jeśli chcemy użyć Dockerfile z innej ścieżki niż ./Dockerfile, możemy ją podać jako drugi argument\n",
" def testImage = docker.build(\"test-image\", \"./dockerfiles/test\") \n",
"\n",
" //Wszystkie polecenia poniżej wykonają się w kontenerze, z podmontowanym Workspace Jenkinsa\n",
" testImage.inside {\n",
" sh 'make test'\n",
" }\n",
" }\n",
"```\n",
" - Declarative:\n",
" ```groovy\n",
" pipeline {\n",
" agent { \n",
" dockerfile true \n",
" }\n",
" stages {\n",
" stage('Test') {\n",
" steps {\n",
" sh 'cat /etc/issue'\n",
" }\n",
" }\n",
" }\n",
"}\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Zadanie 3. [5 pkt]\n",
"1. Dodaj do stworzonego na poprzednich zajęciach Jenkinsfile opisującego pipeline \"s123456-create-dataset\" sekcję \"Docker\", która spowoduje, że kroki będą wywoływane wewnątrz kontenera zdefiniowanego w pliku Dockerfile stworzonym w zadaniu 2.\n",
"2. Dodaj do stworzonego na poprzednich zajęciach Jenkinsfile opisującego pipeline \"s123456-dataset-stats\" sekcję \"Docker\", która spowoduje, że kroki będą wywoływane wewnątrz kontenera uruchomionego z obrazu, który w zadaniu 2. opublikowałeś na Docker Hub."
]
}
],
"metadata": {
"celltoolbar": "Slideshow",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": false,
"sideBar": false,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": false,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

1
IUM_04/MacOS_logo.svg Normal file
View File

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg version="1.1" viewBox="0 0 42 42" xmlns="http://www.w3.org/2000/svg"><path d="m23.091 14.018v-0.342l-1.063 0.073c-0.301 0.019-0.527 0.083-0.679 0.191-0.152 0.109-0.228 0.26-0.228 0.453 0 0.188 0.075 0.338 0.226 0.449 0.15 0.112 0.352 0.167 0.604 0.167 0.161 0 0.312-0.025 0.451-0.074s0.261-0.118 0.363-0.206c0.102-0.087 0.182-0.191 0.239-0.312 0.058-0.121 0.087-0.254 0.087-0.399zm-2.091-13.768c-11.579 0-20.75 9.171-20.75 20.75 0 11.58 9.171 20.75 20.75 20.75s20.75-9.17 20.75-20.75c0-11.579-9.17-20.75-20.75-20.75zm4.028 12.299c0.098-0.275 0.236-0.511 0.415-0.707s0.394-0.347 0.646-0.453 0.533-0.159 0.842-0.159c0.279 0 0.531 0.042 0.755 0.125 0.225 0.083 0.417 0.195 0.578 0.336s0.289 0.305 0.383 0.493 0.15 0.387 0.169 0.596h-0.833c-0.021-0.115-0.059-0.223-0.113-0.322s-0.125-0.185-0.213-0.258c-0.089-0.073-0.193-0.13-0.312-0.171-0.12-0.042-0.254-0.062-0.405-0.062-0.177 0-0.338 0.036-0.481 0.107-0.144 0.071-0.267 0.172-0.369 0.302s-0.181 0.289-0.237 0.475c-0.057 0.187-0.085 0.394-0.085 0.622 0 0.236 0.028 0.448 0.085 0.634 0.056 0.187 0.136 0.344 0.24 0.473 0.103 0.129 0.228 0.228 0.373 0.296s0.305 0.103 0.479 0.103c0.285 0 0.517-0.067 0.697-0.201s0.296-0.33 0.35-0.588h0.834c-0.024 0.228-0.087 0.436-0.189 0.624s-0.234 0.348-0.396 0.481c-0.163 0.133-0.354 0.236-0.574 0.308s-0.462 0.109-0.725 0.109c-0.312 0-0.593-0.052-0.846-0.155-0.252-0.103-0.469-0.252-0.649-0.445s-0.319-0.428-0.417-0.705-0.147-0.588-0.147-0.935c-2e-3 -0.339 0.047-0.647 0.145-0.923zm-11.853-1.262h0.834v0.741h0.016c0.051-0.123 0.118-0.234 0.2-0.33 0.082-0.097 0.176-0.179 0.284-0.248 0.107-0.069 0.226-0.121 0.354-0.157 0.129-0.036 0.265-0.054 0.407-0.054 0.306 0 0.565 0.073 0.775 0.219 0.211 0.146 0.361 0.356 0.449 0.63h0.021c0.056-0.132 0.13-0.25 0.221-0.354s0.196-0.194 0.314-0.268 0.248-0.13 0.389-0.169 0.289-0.058 0.445-0.058c0.215 0 0.41 0.034 0.586 0.103s0.326 0.165 0.451 0.29 0.221 0.277 0.288 0.455 0.101 0.376 0.101 0.594v2.981h-0.87v-2.772c0-0.287-0.074-0.51-0.222-0.667-0.147-0.157-0.358-0.236-0.632-0.236-0.134 0-0.257 0.024-0.369 0.071-0.111 0.047-0.208 0.113-0.288 0.198-0.081 0.084-0.144 0.186-0.189 0.304-0.046 0.118-0.069 0.247-0.069 0.387v2.715h-0.858v-2.844c0-0.126-0.02-0.24-0.059-0.342s-0.094-0.189-0.167-0.262c-0.072-0.073-0.161-0.128-0.264-0.167-0.104-0.039-0.22-0.059-0.349-0.059-0.134 0-0.258 0.025-0.373 0.075-0.114 0.05-0.212 0.119-0.294 0.207-0.082 0.089-0.146 0.193-0.191 0.314-0.044 0.12-0.116 0.252-0.116 0.394v2.683h-0.825v-4.374zm1.893 20.939c-3.825 0-6.224-2.658-6.224-6.9s2.399-6.909 6.224-6.909 6.215 2.667 6.215 6.909c0 4.241-2.39 6.9-6.215 6.9zm7.082-16.575c-0.141 0.036-0.285 0.054-0.433 0.054-0.218 0-0.417-0.031-0.598-0.093-0.182-0.062-0.337-0.149-0.467-0.262s-0.232-0.249-0.304-0.409c-0.073-0.16-0.109-0.338-0.109-0.534 0-0.384 0.143-0.684 0.429-0.9s0.7-0.342 1.243-0.377l1.18-0.068v-0.338c0-0.252-0.08-0.445-0.24-0.576s-0.386-0.197-0.679-0.197c-0.118 0-0.229 0.015-0.331 0.044-0.102 0.03-0.192 0.072-0.27 0.127s-0.143 0.121-0.193 0.198c-0.051 0.076-0.086 0.162-0.105 0.256h-0.818c5e-3 -0.193 0.053-0.372 0.143-0.536s0.212-0.306 0.367-0.427 0.336-0.215 0.546-0.282 0.438-0.101 0.685-0.101c0.266 0 0.507 0.033 0.723 0.101s0.401 0.163 0.554 0.288 0.271 0.275 0.354 0.451 0.125 0.373 0.125 0.59v3.001h-0.833v-0.729h-0.021c-0.062 0.118-0.14 0.225-0.235 0.32-0.096 0.095-0.203 0.177-0.322 0.244-0.12 0.067-0.25 0.119-0.391 0.155zm5.503 16.575c-2.917 0-4.9-1.528-5.038-3.927h1.899c0.148 1.371 1.473 2.279 3.288 2.279 1.741 0 2.992-0.908 2.992-2.149 0-1.074-0.76-1.723-2.519-2.167l-1.714-0.426c-2.464-0.611-3.584-1.732-3.584-3.575 0-2.269 1.982-3.844 4.807-3.844 2.76 0 4.686 1.584 4.76 3.862h-1.88c-0.13-1.371-1.25-2.214-2.918-2.214-1.658 0-2.806 0.852-2.806 2.084 0 0.972 0.722 1.547 2.482 1.991l1.445 0.361c2.751 0.667 3.881 1.751 3.881 3.696-1e-3 2.482-1.964 4.029-5.095 4.029zm-12.585-12.106c-2.621 0-4.26 2.01-4.26 5.205 0 3.186 1.639 5.196 4.26 5.196 2.612 0 4.26-2.01 4.26-5.196 1e-3 -3.195-1.648-5.205-4.26-5.205z"/></svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

1532
IUM_04/Tux.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 106 KiB

View File

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="88" width="88"> <path style="fill:#f8682c;" d="m0,12.402,35.687-4.8602,0.0156,34.423-35.67,0.20313z"/> <path style="fill:#91c300;" d="m39.996,6.9059,47.318-6.906,0,41.527-47.318,0.37565z"/> <path style="fill:#00b4f1;" d="m35.67,45.931,0.0277,34.453-35.67-4.9041-0.002-29.78z"/> <path style="fill:#ffc300;" d="m87.326,46.255-0.0111,41.34-47.318-6.6784-0.0663-34.739z"/> </svg>

After

Width:  |  Height:  |  Size: 593 B

BIN
IUM_04/docker-jenkins.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

283
IUM_04/jenkins.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 29 KiB

BIN
IUM_04/master-slave.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 KiB

8891
IUM_04/master-slave.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 758 KiB