diff --git a/slides/index.html b/slides/index.html index 2e581e1..d61a31e 100644 --- a/slides/index.html +++ b/slides/index.html @@ -28,48 +28,44 @@ - Coming soon - - - - Docker, focus on airgapped environments - - -

- - - - Scheduled June 8th, 2023 at docker workshop in Apeldoorn. - - - - Kubernetes foundation - - -

- - - - Scheduled June 12th, 2023 at kubernetes workshop part 1 in Apeldoorn. - - - - Kubernetes deployment techniques - - -

- - - - Scheduled June 19th, 2023 at kubernetes workshop part 2 in Apeldoorn. - - - Past workshops + + Kubernetes deployment techniques +
+ + + + + Delivered June 19th, 2023 at kubernetes workshop part 2 in Apeldoorn. + + + + + Kubernetes foundation + + + + + + Delivered June 12th, 2023 at kubernetes workshop part 1 in Apeldoorn. + + + + + Docker, focus on airgapped environments + + + + + + Delivered June 8th, 2023 at docker workshop in Apeldoorn. + + + i share: Improving container security diff --git a/slides/intro-container-security.yml.html b/slides/intro-container-security.yml.html new file mode 100644 index 0000000..5aa47f5 --- /dev/null +++ b/slides/intro-container-security.yml.html @@ -0,0 +1,675 @@ + + + + i share: Introduction Container Security and Hardening + + + + + + + + + + + + + + + diff --git a/slides/intro-fd-docker.yml.html b/slides/intro-fd-docker.yml.html new file mode 100644 index 0000000..969df2b --- /dev/null +++ b/slides/intro-fd-docker.yml.html @@ -0,0 +1,5384 @@ + + + + Introduction to containers in an airgapped environment + + + + + + + + + + + + + + + diff --git a/slides/intro-fd-k8s-deployments.yml.html b/slides/intro-fd-k8s-deployments.yml.html new file mode 100644 index 0000000..a2c8b33 --- /dev/null +++ b/slides/intro-fd-k8s-deployments.yml.html @@ -0,0 +1,4693 @@ + + + + Introduction to Helm and friends + + + + + + + + + + + + + + + diff --git a/slides/intro-fd-k8s.yml.html b/slides/intro-fd-k8s.yml.html new file mode 100644 index 0000000..eb3910d --- /dev/null +++ b/slides/intro-fd-k8s.yml.html @@ -0,0 +1,5789 @@ + + + + Introduction to Kubernetes + + + + + + + + + + + + + + + diff --git a/slides/intro-fullday.yml.html b/slides/intro-fullday.yml.html new file mode 100644 index 0000000..c6ca651 --- /dev/null +++ b/slides/intro-fullday.yml.html @@ -0,0 +1,6954 @@ + + + + Introduction to Containers + + + + + + + + + + + + + + + diff --git a/slides/intro-selfpaced.yml.html b/slides/intro-selfpaced.yml.html new file mode 100644 index 0000000..db261f7 --- /dev/null +++ b/slides/intro-selfpaced.yml.html @@ -0,0 +1,14070 @@ + + + + Introduction to Containers + + + + + + + + + + + + + + + diff --git a/slides/intro-triodos-1-day.yml.html b/slides/intro-triodos-1-day.yml.html new file mode 100644 index 0000000..09227f2 --- /dev/null +++ b/slides/intro-triodos-1-day.yml.html @@ -0,0 +1,12230 @@ + + + + Triodos Introduction to Containers and orchestration with Kubernetes + + + + + + + + + + + + + + + diff --git a/slides/intro-twodays.yml.html b/slides/intro-twodays.yml.html index 749516e..a33e107 100644 --- a/slides/intro-twodays.yml.html +++ b/slides/intro-twodays.yml.html @@ -29,20 +29,35 @@ Introduction
to Containers
.debug[ ``` - M shpod - M slides/intro-selfpaced.yml.html - M slides/intro-triodos-1-day.yml.html + M slides/index.html M slides/intro-twodays.yml.html - D slides/remark.min.js -?? "slides/remark.min.js copy.orig" -?? slides/remark.min.js.new + M slides/kadm-fullday.yml.html + M slides/kadm-twodays.yml.html + M slides/kube-adv.yml.html + M slides/kube-fullday.yml.html + M slides/kube-halfday.yml.html + M slides/kube-selfpaced.yml.html + M slides/kube-twodays.yml.html + M slides/past.html + M slides/swarm-fullday.yml.html + M slides/swarm-halfday.yml.html + M slides/swarm-selfpaced.yml.html + M slides/swarm-video.yml.html +?? slides/intro-container-security.yml.html +?? slides/intro-fd-docker.yml.html +?? slides/intro-fd-k8s-deployments.yml.html +?? slides/intro-fd-k8s.yml.html +?? slides/intro-fullday.yml.html +?? slides/intro-selfpaced.yml.html +?? slides/intro-triodos-1-day.yml.html +?? webhook/nohup.out ``` -These slides have been built from commit: 1f0bc36 +These slides have been built from commit: cb9c397 -[shared/title.md](""/tree/main/slides/shared/title.md)] +[shared/title.md](https://git.verleun.org/training/containers.git/tree/main/slides/shared/title.md)] --- class: title, in-person @@ -64,9 +79,32 @@ Password: **Something** *Thank you!* --> -.debug[[shared/title.md](""/tree/main/slides/shared/title.md)] +.debug[[shared/title.md](https://git.verleun.org/training/containers.git/tree/main/slides/shared/title.md)] --- -## Introductions + +class: pic + +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/Container-Ship-Freighter-Navigation-Elbe-Romance-1782991.jpg)] + +--- + +name: toc-introductions +class: title + + Introductions + +.nav[ +[Previous part](#toc-) +| +[Back to table of contents](#toc-part-1) +| +[Next part](#toc-docker-ft-overview) +] + +.debug[(automatically generated title slide)] + +--- +# Introductions - Let's do a quick intro. @@ -76,7 +114,6 @@ Password: **Something** - Who are you and what do you want to learn? - - + -.debug[[logistics.md](""/tree/main/slides/logistics.md)] +.debug[[logistics.md](https://git.verleun.org/training/containers.git/tree/main/slides/logistics.md)] --- ## Exercises @@ -152,8 +190,8 @@ Password: **Something** (it will help to practice and memorize the content of the day) -- There is a git repo that you have to clone first -.debug[[logistics.md](""/tree/main/slides/logistics.md)] +- There are git repo's that you have to clone to download content. More on this later. +.debug[[logistics.md](https://git.verleun.org/training/containers.git/tree/main/slides/logistics.md)] --- ## A brief introduction @@ -174,7 +212,7 @@ Password: **Something** [StackOverflow](http://stackoverflow.com/questions/tagged/docker), and other outlets -.debug[[containers/intro.md](""/tree/main/slides/containers/intro.md)] +.debug[[containers/intro.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/intro.md)] --- class: self-paced @@ -196,7 +234,7 @@ class: self-paced - If you are doing this on your own:
we will tell you how to install Docker or access a Docker environment -.debug[[containers/intro.md](""/tree/main/slides/containers/intro.md)] +.debug[[containers/intro.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/intro.md)] --- ## Accessing these slides now @@ -214,7 +252,7 @@ class: self-paced (e.g. .../#123 for slide 123) -.debug[[shared/about-slides.md](""/tree/main/slides/shared/about-slides.md)] +.debug[[shared/about-slides.md](https://git.verleun.org/training/containers.git/tree/main/slides/shared/about-slides.md)] --- ## Accessing these slides later @@ -233,7 +271,7 @@ class: self-paced https://container.training/ -.debug[[shared/about-slides.md](""/tree/main/slides/shared/about-slides.md)] +.debug[[shared/about-slides.md](https://git.verleun.org/training/containers.git/tree/main/slides/shared/about-slides.md)] --- ## These slides are open source @@ -256,7 +294,7 @@ class: self-paced ] --> -.debug[[shared/about-slides.md](""/tree/main/slides/shared/about-slides.md)] +.debug[[shared/about-slides.md](https://git.verleun.org/training/containers.git/tree/main/slides/shared/about-slides.md)] --- class: extra-details @@ -277,7 +315,7 @@ class: extra-details - You can review these slides another time if you want, they'll be waiting for you ☺ -.debug[[shared/about-slides.md](""/tree/main/slides/shared/about-slides.md)] +.debug[[shared/about-slides.md](https://git.verleun.org/training/containers.git/tree/main/slides/shared/about-slides.md)] --- ## Chat room @@ -291,13 +329,22 @@ class: extra-details - Say hi in the chat room! -.debug[[shared/chat-room-im.md](""/tree/main/slides/shared/chat-room-im.md)] +.debug[[shared/chat-room-im.md](https://git.verleun.org/training/containers.git/tree/main/slides/shared/chat-room-im.md)] --- name: toc-part-1 ## Part 1 +- [Introductions](#toc-introductions) + + +.debug[(auto-generated TOC)] +--- +name: toc-part-2 + +## Part 2 + - [Docker 30,000ft overview](#toc-docker-ft-overview) - [Our training environment](#toc-our-training-environment) @@ -311,9 +358,9 @@ name: toc-part-1 .debug[(auto-generated TOC)] --- -name: toc-part-2 +name: toc-part-3 -## Part 2 +## Part 3 - [Building images interactively](#toc-building-images-interactively) @@ -328,9 +375,9 @@ name: toc-part-2 .debug[(auto-generated TOC)] --- -name: toc-part-3 +name: toc-part-4 -## Part 3 +## Part 4 - [Tips for efficient Dockerfiles](#toc-tips-for-efficient-dockerfiles) @@ -347,9 +394,9 @@ name: toc-part-3 .debug[(auto-generated TOC)] --- -name: toc-part-4 +name: toc-part-5 -## Part 4 +## Part 5 - [Naming and inspecting containers](#toc-naming-and-inspecting-containers) @@ -364,9 +411,9 @@ name: toc-part-4 .debug[(auto-generated TOC)] --- -name: toc-part-5 +name: toc-part-6 -## Part 5 +## Part 6 - [Container networking basics](#toc-container-networking-basics) @@ -379,9 +426,9 @@ name: toc-part-5 .debug[(auto-generated TOC)] --- -name: toc-part-6 +name: toc-part-7 -## Part 6 +## Part 7 - [Local development workflow with Docker](#toc-local-development-workflow-with-docker) @@ -394,9 +441,9 @@ name: toc-part-6 .debug[(auto-generated TOC)] --- -name: toc-part-7 +name: toc-part-8 -## Part 7 +## Part 8 - [Installing Docker](#toc-installing-docker) @@ -411,9 +458,9 @@ name: toc-part-7 .debug[(auto-generated TOC)] --- -name: toc-part-8 +name: toc-part-9 -## Part 8 +## Part 9 - [Application Configuration](#toc-application-configuration) @@ -424,9 +471,9 @@ name: toc-part-8 .debug[(auto-generated TOC)] --- -name: toc-part-9 +name: toc-part-10 -## Part 9 +## Part 10 - [Links and resources](#toc-links-and-resources) @@ -435,12 +482,12 @@ name: toc-part-9 -.debug[[shared/toc.md](""/tree/main/slides/shared/toc.md)] +.debug[[shared/toc.md](https://git.verleun.org/training/containers.git/tree/main/slides/shared/toc.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/Container-Ship-Freighter-Navigation-Elbe-Romance-1782991.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/ShippingContainerSFBay.jpg)] --- @@ -450,9 +497,9 @@ class: title Docker 30,000ft overview .nav[ -[Previous part](#toc-) +[Previous part](#toc-introductions) | -[Back to table of contents](#toc-part-1) +[Back to table of contents](#toc-part-2) | [Next part](#toc-our-training-environment) ] @@ -476,14 +523,14 @@ We won't actually run Docker or containers in this chapter (yet!). Don't worry, we will get to that fast enough! -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- ## Elevator pitch ### (for your manager, your boss...) -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- ## OK... Why the buzz around containers? @@ -502,7 +549,7 @@ Don't worry, we will get to that fast enough! * multiple environments * quickly scaling out -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- ## Deployment becomes very complex @@ -517,7 +564,7 @@ Don't worry, we will get to that fast enough! * pre-production, QA, staging... * production: on prem, cloud, hybrid -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- class: pic @@ -526,7 +573,7 @@ class: pic ![problem](images/shipping-software-problem.png) -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- class: pic @@ -535,7 +582,7 @@ class: pic ![matrix](images/shipping-matrix-from-hell.png) -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- class: pic @@ -544,7 +591,7 @@ class: pic ![history](images/shipping-industry-problem.png) -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- class: pic @@ -553,7 +600,7 @@ class: pic ![shipping](images/shipping-industry-solution.png) -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- class: pic @@ -562,7 +609,7 @@ class: pic ![shipeco](images/shipping-indsutry-results.png) -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- class: pic @@ -571,7 +618,7 @@ class: pic ![shipapp](images/shipping-software-solution.png) -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- class: pic @@ -580,7 +627,7 @@ class: pic ![elimatrix](images/shipping-matrix-solved.png) -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- ## Results @@ -605,14 +652,14 @@ class: pic * etc. -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- ## Elevator pitch ### (for your fellow devs and ops) -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- ## Escape dependency hell @@ -629,7 +676,7 @@ class: pic Never again "worked in dev - ops problem now!" -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- ## On-board developers and contributors rapidly @@ -649,7 +696,7 @@ docker-compose up With this, you can create development, integration, QA environments in minutes! -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- class: extra-details @@ -666,7 +713,7 @@ class: extra-details Way faster and cheaper than creating VMs each time! -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- class: extra-details @@ -689,7 +736,7 @@ class: extra-details Images contain all the libraries, dependencies, etc. needed to run the app. -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- class: extra-details @@ -706,7 +753,7 @@ class: extra-details Note: this is not covered in this intro level workshop! -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- class: extra-details @@ -715,7 +762,7 @@ class: extra-details ### Docker before/after -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- class: extra-details @@ -738,7 +785,7 @@ Analogy: * Shipping containers are not just steel boxes. * They are steel boxes that are a standard size, with the same hooks and holes. -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- class: extra-details @@ -753,7 +800,7 @@ class: extra-details * Improvement over ad-hoc, in-house, specific tools. -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- class: extra-details @@ -768,7 +815,7 @@ class: extra-details * Base deployment often done from scratch (debootstrap...) and unreliable. -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- class: extra-details @@ -783,7 +830,7 @@ class: extra-details * Save disk, network, memory usage. -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- class: extra-details @@ -799,7 +846,7 @@ Layers: * Application JAR * Configuration -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- class: extra-details @@ -820,7 +867,7 @@ class: extra-details * Shipping code causes frictions and delays. -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- class: extra-details @@ -842,12 +889,12 @@ class: extra-details * Devs can be empowered to make releases themselves more easily. -.debug[[containers/Docker_Overview.md](""/tree/main/slides/containers/Docker_Overview.md)] +.debug[[containers/Docker_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Docker_Overview.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/ShippingContainerSFBay.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/aerial-view-of-containers.jpg)] --- @@ -859,7 +906,7 @@ class: title .nav[ [Previous part](#toc-docker-ft-overview) | -[Back to table of contents](#toc-part-1) +[Back to table of contents](#toc-part-2) | [Next part](#toc-our-first-containers) ] @@ -874,7 +921,7 @@ class: title ![SSH terminal](images/title-our-training-environment.jpg) -.debug[[containers/Training_Environment.md](""/tree/main/slides/containers/Training_Environment.md)] +.debug[[containers/Training_Environment.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Training_Environment.md)] --- ## Our training environment @@ -891,7 +938,7 @@ class: title - use https://www.play-with-docker.com/ to instantly get a training environment -.debug[[containers/Training_Environment.md](""/tree/main/slides/containers/Training_Environment.md)] +.debug[[containers/Training_Environment.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Training_Environment.md)] --- ## Our Docker VM @@ -908,7 +955,7 @@ individual Docker VM.* - It comes pre-loaded with Docker and some other useful tools. -.debug[[containers/Training_Environment.md](""/tree/main/slides/containers/Training_Environment.md)] +.debug[[containers/Training_Environment.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Training_Environment.md)] --- ## What *is* Docker? @@ -925,7 +972,7 @@ individual Docker VM.* - There are many other programs and client libraries which use that API. -.debug[[containers/Training_Environment.md](""/tree/main/slides/containers/Training_Environment.md)] +.debug[[containers/Training_Environment.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Training_Environment.md)] --- ## Why don't we run Docker locally? @@ -946,7 +993,7 @@ individual Docker VM.* - It's better to spend time learning containers than fiddling with the installer! -.debug[[containers/Training_Environment.md](""/tree/main/slides/containers/Training_Environment.md)] +.debug[[containers/Training_Environment.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Training_Environment.md)] --- ## Connecting to your Virtual Machine @@ -967,7 +1014,7 @@ $ ssh @ * MobaXterm (https://mobaxterm.mobatek.net/) -.debug[[containers/Training_Environment.md](""/tree/main/slides/containers/Training_Environment.md)] +.debug[[containers/Training_Environment.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Training_Environment.md)] --- class: in-person @@ -986,7 +1033,7 @@ It should be green when the WebSocket is connected. If it turns red, reloading the page should fix it. -.debug[[containers/Training_Environment.md](""/tree/main/slides/containers/Training_Environment.md)] +.debug[[containers/Training_Environment.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Training_Environment.md)] --- ## Checking your Virtual Machine @@ -1028,12 +1075,12 @@ If this doesn't work, raise your hand so that an instructor can assist you! :EN:- What's a container engine? :FR:- Qu'est-ce qu'un *container engine* ? -.debug[[containers/Training_Environment.md](""/tree/main/slides/containers/Training_Environment.md)] +.debug[[containers/Training_Environment.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Training_Environment.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/aerial-view-of-containers.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/blue-containers.jpg)] --- @@ -1045,7 +1092,7 @@ class: title .nav[ [Previous part](#toc-our-training-environment) | -[Back to table of contents](#toc-part-1) +[Back to table of contents](#toc-part-2) | [Next part](#toc-background-containers) ] @@ -1060,7 +1107,7 @@ class: title ![Colorful plastic tubs](images/title-our-first-containers.jpg) -.debug[[containers/First_Containers.md](""/tree/main/slides/containers/First_Containers.md)] +.debug[[containers/First_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/First_Containers.md)] --- ## Objectives @@ -1071,7 +1118,7 @@ At the end of this lesson, you will have: * Started your first containers. -.debug[[containers/First_Containers.md](""/tree/main/slides/containers/First_Containers.md)] +.debug[[containers/First_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/First_Containers.md)] --- ## Hello World @@ -1086,7 +1133,7 @@ hello world (If your Docker install is brand new, you will also see a few extra lines, corresponding to the download of the `busybox` image.) -.debug[[containers/First_Containers.md](""/tree/main/slides/containers/First_Containers.md)] +.debug[[containers/First_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/First_Containers.md)] --- ## That was our first container! @@ -1097,7 +1144,7 @@ corresponding to the download of the `busybox` image.) * We ran a single process and echo'ed `hello world`. -.debug[[containers/First_Containers.md](""/tree/main/slides/containers/First_Containers.md)] +.debug[[containers/First_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/First_Containers.md)] --- ## A more useful container @@ -1119,7 +1166,7 @@ root@04c0bb0a6c07:/# * `-t` tells Docker that we want a pseudo-terminal. -.debug[[containers/First_Containers.md](""/tree/main/slides/containers/First_Containers.md)] +.debug[[containers/First_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/First_Containers.md)] --- ## Do something in our container @@ -1133,7 +1180,7 @@ bash: figlet: command not found Alright, we need to install it. -.debug[[containers/First_Containers.md](""/tree/main/slides/containers/First_Containers.md)] +.debug[[containers/First_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/First_Containers.md)] --- ## Install a package in our container @@ -1152,7 +1199,7 @@ Reading package lists... Done One minute later, `figlet` is installed! -.debug[[containers/First_Containers.md](""/tree/main/slides/containers/First_Containers.md)] +.debug[[containers/First_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/First_Containers.md)] --- ## Try to run our freshly installed program @@ -1170,7 +1217,7 @@ root@04c0bb0a6c07:/# figlet hello Beautiful! 😍 -.debug[[containers/First_Containers.md](""/tree/main/slides/containers/First_Containers.md)] +.debug[[containers/First_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/First_Containers.md)] --- class: in-person @@ -1190,7 +1237,7 @@ root@04c0bb0a6c07:/# dpkg -l | wc -l How many packages do we have on our host? -.debug[[containers/First_Containers.md](""/tree/main/slides/containers/First_Containers.md)] +.debug[[containers/First_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/First_Containers.md)] --- class: in-person @@ -1211,7 +1258,7 @@ Now, try to: * run `figlet`. Does that work? -.debug[[containers/First_Containers.md](""/tree/main/slides/containers/First_Containers.md)] +.debug[[containers/First_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/First_Containers.md)] --- class: self-paced @@ -1224,7 +1271,7 @@ Now try to run `figlet`. Does that work? (It shouldn't; except if, by coincidence, you are running on a machine where figlet was installed before.) -.debug[[containers/First_Containers.md](""/tree/main/slides/containers/First_Containers.md)] +.debug[[containers/First_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/First_Containers.md)] --- ## Host and containers are independent things @@ -1243,7 +1290,7 @@ Now try to run `figlet`. Does that work? (One exception: Windows containers can only run on Windows hosts; at least for now.) -.debug[[containers/First_Containers.md](""/tree/main/slides/containers/First_Containers.md)] +.debug[[containers/First_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/First_Containers.md)] --- ## Where's our container? @@ -1254,7 +1301,7 @@ Now try to run `figlet`. Does that work? * We will see later how to get back to that container. -.debug[[containers/First_Containers.md](""/tree/main/slides/containers/First_Containers.md)] +.debug[[containers/First_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/First_Containers.md)] --- ## Starting another container @@ -1271,7 +1318,7 @@ bash: figlet: command not found * The basic Ubuntu image was used, and `figlet` is not here. -.debug[[containers/First_Containers.md](""/tree/main/slides/containers/First_Containers.md)] +.debug[[containers/First_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/First_Containers.md)] --- ## Where's my container? @@ -1294,7 +1341,7 @@ bash: figlet: command not found *This puts a strong emphasis on automation and repeatability. Let's see why ...* -.debug[[containers/First_Containers.md](""/tree/main/slides/containers/First_Containers.md)] +.debug[[containers/First_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/First_Containers.md)] --- ## Pets vs. Cattle @@ -1317,7 +1364,7 @@ bash: figlet: command not found * What's the connection with Docker and containers? -.debug[[containers/First_Containers.md](""/tree/main/slides/containers/First_Containers.md)] +.debug[[containers/First_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/First_Containers.md)] --- ## Local development environments @@ -1340,7 +1387,7 @@ bash: figlet: command not found * We don't have a clean, reliable, deterministic way to provision that environment. -.debug[[containers/First_Containers.md](""/tree/main/slides/containers/First_Containers.md)] +.debug[[containers/First_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/First_Containers.md)] --- ## Local development with Docker @@ -1368,12 +1415,12 @@ bash: figlet: command not found :EN:- Running our first container :FR:- Lancer nos premiers conteneurs -.debug[[containers/First_Containers.md](""/tree/main/slides/containers/First_Containers.md)] +.debug[[containers/First_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/First_Containers.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/blue-containers.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/chinook-helicopter-container.jpg)] --- @@ -1385,7 +1432,7 @@ class: title .nav[ [Previous part](#toc-our-first-containers) | -[Back to table of contents](#toc-part-1) +[Back to table of contents](#toc-part-2) | [Next part](#toc-understanding-docker-images) ] @@ -1400,7 +1447,7 @@ class: title ![Background containers](images/title-background-containers.jpg) -.debug[[containers/Background_Containers.md](""/tree/main/slides/containers/Background_Containers.md)] +.debug[[containers/Background_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Background_Containers.md)] --- ## Objectives @@ -1416,7 +1463,7 @@ We will now see how to: * Stop a container. * List stopped containers. -.debug[[containers/Background_Containers.md](""/tree/main/slides/containers/Background_Containers.md)] +.debug[[containers/Background_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Background_Containers.md)] --- ## A non-interactive container @@ -1439,7 +1486,7 @@ Fri Feb 20 00:28:55 UTC 2015 * This image is a user image, created by `jpetazzo`. * We will hear more about user images (and other types of images) later. -.debug[[containers/Background_Containers.md](""/tree/main/slides/containers/Background_Containers.md)] +.debug[[containers/Background_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Background_Containers.md)] --- ## When `^C` doesn't work... @@ -1448,7 +1495,7 @@ Sometimes, `^C` won't be enough. Why? And how can we stop the container in that case? -.debug[[containers/Background_Containers.md](""/tree/main/slides/containers/Background_Containers.md)] +.debug[[containers/Background_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Background_Containers.md)] --- ## What happens when we hit `^C` @@ -1467,7 +1514,7 @@ But there is a special case for PID 1: it ignores all signals! TL,DR: there are many circumstances when `^C` won't stop the container. -.debug[[containers/Background_Containers.md](""/tree/main/slides/containers/Background_Containers.md)] +.debug[[containers/Background_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Background_Containers.md)] --- class: extra-details @@ -1490,7 +1537,7 @@ class: extra-details - That's why it has these extra protections -.debug[[containers/Background_Containers.md](""/tree/main/slides/containers/Background_Containers.md)] +.debug[[containers/Background_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Background_Containers.md)] --- ## How to stop these containers, then? @@ -1501,7 +1548,7 @@ class: extra-details - We'll shortly learn about `docker kill` -.debug[[containers/Background_Containers.md](""/tree/main/slides/containers/Background_Containers.md)] +.debug[[containers/Background_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Background_Containers.md)] --- ## Run a container in the background @@ -1517,7 +1564,7 @@ $ docker run -d jpetazzo/clock * But don't worry: Docker collects that output and logs it! * Docker gives us the ID of the container. -.debug[[containers/Background_Containers.md](""/tree/main/slides/containers/Background_Containers.md)] +.debug[[containers/Background_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Background_Containers.md)] --- ## List running containers @@ -1539,7 +1586,7 @@ Docker tells us: * That our container has been running (`Up`) for a couple of minutes. * Other information (COMMAND, PORTS, NAMES) that we will explain later. -.debug[[containers/Background_Containers.md](""/tree/main/slides/containers/Background_Containers.md)] +.debug[[containers/Background_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Background_Containers.md)] --- ## Starting more containers @@ -1558,7 +1605,7 @@ $ docker run -d jpetazzo/clock Check that `docker ps` correctly reports all 3 containers. -.debug[[containers/Background_Containers.md](""/tree/main/slides/containers/Background_Containers.md)] +.debug[[containers/Background_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Background_Containers.md)] --- ## Viewing only the last container started @@ -1574,7 +1621,7 @@ CONTAINER ID IMAGE ... CREATED STATUS ... 068cc994ffd0 jpetazzo/clock ... 2 minutes ago Up 2 minutes ... ``` -.debug[[containers/Background_Containers.md](""/tree/main/slides/containers/Background_Containers.md)] +.debug[[containers/Background_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Background_Containers.md)] --- ## View only the IDs of the containers @@ -1592,7 +1639,7 @@ $ docker ps -q 47d677dcfba4 ``` -.debug[[containers/Background_Containers.md](""/tree/main/slides/containers/Background_Containers.md)] +.debug[[containers/Background_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Background_Containers.md)] --- ## Combining flags @@ -1613,7 +1660,7 @@ it is better to use `docker run -d`, which we will cover in a bit. else, or another program or script, starts another container just before we run `docker ps -lq`?) -.debug[[containers/Background_Containers.md](""/tree/main/slides/containers/Background_Containers.md)] +.debug[[containers/Background_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Background_Containers.md)] --- ## View the logs of a container @@ -1634,7 +1681,7 @@ Fri Feb 20 00:39:53 UTC 2015 * The `logs` command will output the *entire* logs of the container.
(Sometimes, that will be too much. Let's see how to address that.) -.debug[[containers/Background_Containers.md](""/tree/main/slides/containers/Background_Containers.md)] +.debug[[containers/Background_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Background_Containers.md)] --- ## View only the tail of the logs @@ -1651,7 +1698,7 @@ Fri Feb 20 00:55:37 UTC 2015 * The parameter is the number of lines that we want to see. -.debug[[containers/Background_Containers.md](""/tree/main/slides/containers/Background_Containers.md)] +.debug[[containers/Background_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Background_Containers.md)] --- ## Follow the logs in real time @@ -1670,7 +1717,7 @@ Fri Feb 20 00:57:13 UTC 2015 * Then, it will continue to display the logs in real time. * Use `^C` to exit. -.debug[[containers/Background_Containers.md](""/tree/main/slides/containers/Background_Containers.md)] +.debug[[containers/Background_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Background_Containers.md)] --- ## Stop our container @@ -1690,7 +1737,7 @@ sends `KILL.` Reminder: the `KILL` signal cannot be intercepted, and will forcibly terminate the container. -.debug[[containers/Background_Containers.md](""/tree/main/slides/containers/Background_Containers.md)] +.debug[[containers/Background_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Background_Containers.md)] --- ## Stopping our containers @@ -1712,7 +1759,7 @@ This will take 10 seconds: running, Docker sends the KILL signal; * this terminates the container. -.debug[[containers/Background_Containers.md](""/tree/main/slides/containers/Background_Containers.md)] +.debug[[containers/Background_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Background_Containers.md)] --- ## Killing the remaining containers @@ -1736,7 +1783,7 @@ Let's check that our containers don't show up anymore: $ docker ps ``` -.debug[[containers/Background_Containers.md](""/tree/main/slides/containers/Background_Containers.md)] +.debug[[containers/Background_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Background_Containers.md)] --- ## List stopped containers @@ -1758,12 +1805,12 @@ b13c164401fb ubuntu ... 55 min. ago Exited (130) 53 min. ago :EN:- Foreground and background containers :FR:- Exécution interactive ou en arrière-plan -.debug[[containers/Background_Containers.md](""/tree/main/slides/containers/Background_Containers.md)] +.debug[[containers/Background_Containers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Background_Containers.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/chinook-helicopter-container.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/container-cranes.jpg)] --- @@ -1775,7 +1822,7 @@ class: title .nav[ [Previous part](#toc-background-containers) | -[Back to table of contents](#toc-part-1) +[Back to table of contents](#toc-part-2) | [Next part](#toc-building-images-interactively) ] @@ -1790,7 +1837,7 @@ class: title ![image](images/title-understanding-docker-images.png) -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- ## Objectives @@ -1807,7 +1854,7 @@ In this section, we will explain: * Image tags and when to use them. -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- ## What is an image? @@ -1829,7 +1876,7 @@ In this section, we will explain: * Images can share layers to optimize disk usage, transfer times, and memory use. -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- ## Example for a Java webapp @@ -1846,7 +1893,7 @@ Each of the following items will correspond to one layer: (Note: app config is generally added by orchestration facilities.) -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- class: pic @@ -1855,7 +1902,7 @@ class: pic ![layers](images/container-layers.jpg) -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- ## Differences between containers and images @@ -1871,7 +1918,7 @@ class: pic * `docker run` starts a container from a given image. -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- class: pic @@ -1880,7 +1927,7 @@ class: pic ![layers](images/sharing-layers.jpg) -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- ## Comparison with object-oriented programming @@ -1891,7 +1938,7 @@ class: pic * Containers are conceptually similar to *instances*. -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- ## Wait a minute... @@ -1908,7 +1955,7 @@ If an image is read-only, how do we change it? * A new image is created by stacking the new layer on top of the old image. -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- ## A chicken-and-egg problem @@ -1919,7 +1966,7 @@ If an image is read-only, how do we change it? * Help! -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- ## Creating the first images @@ -1935,7 +1982,7 @@ The `docker import` command loads a tarball into Docker. Note: you will probably never have to do this yourself. -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- ## Creating other images @@ -1952,7 +1999,7 @@ Note: you will probably never have to do this yourself. We will explain both methods in a moment. -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- ## Images namespaces @@ -1973,7 +2020,7 @@ There are three namespaces: Let's explain each of them. -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- ## Root namespace @@ -1994,7 +2041,7 @@ Those images include: * Over 150 at this point! -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- ## User namespace @@ -2019,7 +2066,7 @@ The image name is: clock ``` -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- ## Self-hosted namespace @@ -2046,7 +2093,7 @@ quay.io/coreos/etcd gcr.io/google-containers/hugo ``` -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- ## How do you store and manage images? @@ -2061,7 +2108,7 @@ You can use the Docker client to download (pull) or upload (push) images. To be more accurate: you can use the Docker client to tell a Docker Engine to push and pull images to and from a registry. -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- ## Showing current images @@ -2083,7 +2130,7 @@ training/namer latest 902673acc741 9 months ago 289.3 MB jpetazzo/clock latest 12068b93616f 12 months ago 2.433 MB ``` -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- ## Searching for images @@ -2108,7 +2155,7 @@ tobilg/mongodb-marathon A Docker image to start a ... 4 [OK] * "Automated" images are built automatically by the Docker Hub.
(This means that their build recipe is always available.) -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- ## Downloading images @@ -2119,7 +2166,7 @@ There are two ways to download images. * Implicitly, when executing `docker run` and the image is not found locally. -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- ## Pulling an image @@ -2141,7 +2188,7 @@ d1881793a057: Download complete It is a *version tag*. -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- ## Image and tags @@ -2154,7 +2201,7 @@ d1881793a057: Download complete * The `:latest` tag is generally updated often. -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- ## When to (not) use tags @@ -2174,7 +2221,7 @@ Do specify tags: This is similar to what we would do with `pip install`, `npm install`, etc. -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- class: extra-details @@ -2197,7 +2244,7 @@ class: extra-details - optional fields like `variant` (for arm and arm64), `os.version` (for windows) -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- class: extra-details @@ -2214,7 +2261,7 @@ class: extra-details (automatically on Docker Desktop; with a bit of setup on Linux) -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- ## Section summary @@ -2236,12 +2283,12 @@ We've learned how to: :FR:- La diffΓ©rence entre un conteneur et une image :FR:- La notion de *layer* partagΓ© entre images -.debug[[containers/Initial_Images.md](""/tree/main/slides/containers/Initial_Images.md)] +.debug[[containers/Initial_Images.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Initial_Images.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/container-cranes.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/container-housing.jpg)] --- @@ -2253,7 +2300,7 @@ class: title .nav[ [Previous part](#toc-understanding-docker-images) | -[Back to table of contents](#toc-part-2) +[Back to table of contents](#toc-part-3) | [Next part](#toc-building-docker-images-with-a-dockerfile) ] @@ -2277,7 +2324,7 @@ We will: * Learn about new commands: `docker commit`, `docker tag`, and `docker diff`. -.debug[[containers/Building_Images_Interactively.md](""/tree/main/slides/containers/Building_Images_Interactively.md)] +.debug[[containers/Building_Images_Interactively.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_Interactively.md)] --- ## The plan @@ -2292,7 +2339,7 @@ We will: 5. (Optionally) add tags to the image with `docker tag`. -.debug[[containers/Building_Images_Interactively.md](""/tree/main/slides/containers/Building_Images_Interactively.md)] +.debug[[containers/Building_Images_Interactively.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_Interactively.md)] --- ## Setting up our container @@ -2313,7 +2360,7 @@ root@:#/ apt-get update && apt-get install figlet .... OUTPUT OF APT-GET COMMANDS .... ``` -.debug[[containers/Building_Images_Interactively.md](""/tree/main/slides/containers/Building_Images_Interactively.md)] +.debug[[containers/Building_Images_Interactively.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_Interactively.md)] --- ## Inspect the changes @@ -2334,7 +2381,7 @@ A /usr/bin/figlet ... ``` -.debug[[containers/Building_Images_Interactively.md](""/tree/main/slides/containers/Building_Images_Interactively.md)] +.debug[[containers/Building_Images_Interactively.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_Interactively.md)] --- class: x-extra-details @@ -2353,7 +2400,7 @@ As explained before:
(i.e. starting a container based on a big image doesn't incur a huge copy.) -.debug[[containers/Building_Images_Interactively.md](""/tree/main/slides/containers/Building_Images_Interactively.md)] +.debug[[containers/Building_Images_Interactively.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_Interactively.md)] --- ## Copy-on-write security benefits @@ -2367,7 +2414,7 @@ As explained before: (their root filesystem will be read-only, but they can still have read-write data volumes) -.debug[[containers/Building_Images_Interactively.md](""/tree/main/slides/containers/Building_Images_Interactively.md)] +.debug[[containers/Building_Images_Interactively.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_Interactively.md)] --- ## Commit our changes into a new image @@ -2384,7 +2431,7 @@ The output of the `docker commit` command will be the ID for your newly created We can use it as an argument to `docker run`. -.debug[[containers/Building_Images_Interactively.md](""/tree/main/slides/containers/Building_Images_Interactively.md)] +.debug[[containers/Building_Images_Interactively.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_Interactively.md)] --- ## Testing our new image @@ -2403,7 +2450,7 @@ root@fcfb62f0bfde:/# figlet hello It works! πŸŽ‰ -.debug[[containers/Building_Images_Interactively.md](""/tree/main/slides/containers/Building_Images_Interactively.md)] +.debug[[containers/Building_Images_Interactively.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_Interactively.md)] --- ## Tagging images @@ -2428,7 +2475,7 @@ And then run it using its tag: $ docker run -it figlet ``` -.debug[[containers/Building_Images_Interactively.md](""/tree/main/slides/containers/Building_Images_Interactively.md)] +.debug[[containers/Building_Images_Interactively.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_Interactively.md)] --- ## What's next? @@ -2445,12 +2492,12 @@ process by writing a `Dockerfile`. :EN:- Building our first images interactively :FR:- Fabriquer nos premiΓ¨res images Γ  la main -.debug[[containers/Building_Images_Interactively.md](""/tree/main/slides/containers/Building_Images_Interactively.md)] +.debug[[containers/Building_Images_Interactively.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_Interactively.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/container-housing.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/containers-by-the-water.jpg)] --- @@ -2462,7 +2509,7 @@ class: title .nav[ [Previous part](#toc-building-images-interactively) | -[Back to table of contents](#toc-part-2) +[Back to table of contents](#toc-part-3) | [Next part](#toc-cmd-and-entrypoint) ] @@ -2477,7 +2524,7 @@ class: title ![Construction site with containers](images/title-building-docker-images-with-a-dockerfile.jpg) -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- ## Objectives @@ -2490,7 +2537,7 @@ At the end of this lesson, you will be able to: * Build an image from a `Dockerfile`. -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- ## `Dockerfile` overview @@ -2501,7 +2548,7 @@ At the end of this lesson, you will be able to: * The `docker build` command builds an image from a `Dockerfile`. -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- ## Writing our first `Dockerfile` @@ -2523,7 +2570,7 @@ $ vim Dockerfile Of course, you can use any other editor of your choice. -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- ## Type this into our Dockerfile... @@ -2543,7 +2590,7 @@ RUN apt-get install figlet * In many cases, we will add the `-y` flag to `apt-get`. -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- ## Build it! @@ -2562,7 +2609,7 @@ We will talk more about the build context later. To keep things simple for now: this is the directory where our Dockerfile is located. -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- ## What happens when we build the image? @@ -2581,7 +2628,7 @@ Sending build context to Docker daemon 2.048kB ``` ... then we're using the "classic" or "old-style" builder. -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- ## To BuildKit or Not To BuildKit @@ -2602,7 +2649,7 @@ BuildKit: - can run in non-privileged containers (e.g. on Kubernetes) -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- ## With the classic builder @@ -2633,7 +2680,7 @@ Successfully tagged figlet:latest * The output of the `RUN` commands has been omitted. * Let's explain what this output means. -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- ## Sending the build context to Docker @@ -2656,7 +2703,7 @@ Sending build context to Docker daemon 2.048 kB * Only ignore files that you won't need in the build context! -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- ## Executing each step @@ -2679,7 +2726,7 @@ Removing intermediate container e01b294dbffd * The output of this step will be the base image for the next one. -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- ## With BuildKit @@ -2712,7 +2759,7 @@ Removing intermediate container e01b294dbffd ``` ] -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- ## Understanding BuildKit output @@ -2729,7 +2776,7 @@ Removing intermediate container e01b294dbffd (image definition + collection of layers) -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- class: extra-details @@ -2740,7 +2787,7 @@ class: extra-details - We can see the same output format by using `--progress=plain` -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- ## The caching system @@ -2761,7 +2808,7 @@ If you run the same build again, it will be instantaneous. Why? You can force a rebuild with `docker build --no-cache ...`. -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- ## Running the image @@ -2781,7 +2828,7 @@ root@91f3c974c9a1:/# figlet hello Yay! πŸŽ‰ -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- ## Using image and viewing history @@ -2804,7 +2851,7 @@ f9e8f1642759 About an hour ago /bin/sh -c apt-get install fi 1.627 MB 4 days ago /bin/sh -c #(nop) ADD file:b 187.8 MB ``` -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- class: extra-details @@ -2829,7 +2876,7 @@ class: extra-details (It also takes care of expanding environment variables and special things like `~`.) -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- class: extra-details @@ -2848,7 +2895,7 @@ class: extra-details * This is called the *exec syntax*. -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- ## Shell syntax vs exec syntax @@ -2863,7 +2910,7 @@ Dockerfile commands that execute something can have two forms: We are going to change our Dockerfile to see how it affects the resulting image. -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- ## Using exec syntax in our Dockerfile @@ -2882,7 +2929,7 @@ Then build the new Dockerfile. $ docker build -t figlet . ``` -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- ## History with exec syntax @@ -2904,7 +2951,7 @@ IMAGE CREATED CREATED BY SIZE * Shell syntax specifies a command to be wrapped within `/bin/sh -c "..."`. -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- ## When to use exec syntax and shell syntax @@ -2923,7 +2970,7 @@ IMAGE CREATED CREATED BY SIZE * doesn't create an extra process * doesn't require `/bin/sh` to exist in the container -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- ## Pro-tip: the `exec` shell built-in @@ -2940,7 +2987,7 @@ From a user perspective: - or rather, the shell gets *replaced* by the command. -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- ## Example using `exec` @@ -2963,12 +3010,12 @@ This allows to run processes as PID 1 without using JSON. :FR:- Rendre le processus automatique et reproductible :FR:- Γ‰crire son premier Dockerfile -.debug[[containers/Building_Images_With_Dockerfiles.md](""/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] +.debug[[containers/Building_Images_With_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Building_Images_With_Dockerfiles.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/containers-by-the-water.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/distillery-containers.jpg)] --- @@ -2980,7 +3027,7 @@ class: title .nav[ [Previous part](#toc-building-docker-images-with-a-dockerfile) | -[Back to table of contents](#toc-part-2) +[Back to table of contents](#toc-part-3) | [Next part](#toc-copying-files-during-the-build) ] @@ -2995,7 +3042,7 @@ class: title ![Container entry doors](images/entrypoint.jpg) -.debug[[containers/Cmd_And_Entrypoint.md](""/tree/main/slides/containers/Cmd_And_Entrypoint.md)] +.debug[[containers/Cmd_And_Entrypoint.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Cmd_And_Entrypoint.md)] --- ## Objectives @@ -3008,7 +3055,7 @@ Dockerfile commands: These commands allow us to set the default command to run in a container. -.debug[[containers/Cmd_And_Entrypoint.md](""/tree/main/slides/containers/Cmd_And_Entrypoint.md)] +.debug[[containers/Cmd_And_Entrypoint.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Cmd_And_Entrypoint.md)] --- ## Defining a default command @@ -3025,7 +3072,7 @@ figlet -f script hello * `hello` is the message that we want it to display. -.debug[[containers/Cmd_And_Entrypoint.md](""/tree/main/slides/containers/Cmd_And_Entrypoint.md)] +.debug[[containers/Cmd_And_Entrypoint.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Cmd_And_Entrypoint.md)] --- ## Adding `CMD` to our Dockerfile @@ -3047,7 +3094,7 @@ CMD figlet -f script hello * As a result, while you can have multiple `CMD` lines, it is useless. -.debug[[containers/Cmd_And_Entrypoint.md](""/tree/main/slides/containers/Cmd_And_Entrypoint.md)] +.debug[[containers/Cmd_And_Entrypoint.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Cmd_And_Entrypoint.md)] --- ## Build and test our image @@ -3072,7 +3119,7 @@ $ docker run figlet | |_/|__/|__/|__/\__/ ``` -.debug[[containers/Cmd_And_Entrypoint.md](""/tree/main/slides/containers/Cmd_And_Entrypoint.md)] +.debug[[containers/Cmd_And_Entrypoint.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Cmd_And_Entrypoint.md)] --- ## Overriding `CMD` @@ -3089,7 +3136,7 @@ root@7ac86a641116:/# * It replaced the value of `CMD`. -.debug[[containers/Cmd_And_Entrypoint.md](""/tree/main/slides/containers/Cmd_And_Entrypoint.md)] +.debug[[containers/Cmd_And_Entrypoint.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Cmd_And_Entrypoint.md)] --- ## Using `ENTRYPOINT` @@ -3111,7 +3158,7 @@ $ docker run figlet salut We will use the `ENTRYPOINT` verb in Dockerfile. -.debug[[containers/Cmd_And_Entrypoint.md](""/tree/main/slides/containers/Cmd_And_Entrypoint.md)] +.debug[[containers/Cmd_And_Entrypoint.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Cmd_And_Entrypoint.md)] --- ## Adding `ENTRYPOINT` to our Dockerfile @@ -3133,7 +3180,7 @@ ENTRYPOINT ["figlet", "-f", "script"] Why did we use JSON syntax for our `ENTRYPOINT`? -.debug[[containers/Cmd_And_Entrypoint.md](""/tree/main/slides/containers/Cmd_And_Entrypoint.md)] +.debug[[containers/Cmd_And_Entrypoint.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Cmd_And_Entrypoint.md)] --- ## Implications of JSON vs string syntax @@ -3154,7 +3201,7 @@ This would run the following command in the `figlet` image: sh -c "figlet -f script" salut ``` -.debug[[containers/Cmd_And_Entrypoint.md](""/tree/main/slides/containers/Cmd_And_Entrypoint.md)] +.debug[[containers/Cmd_And_Entrypoint.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Cmd_And_Entrypoint.md)] --- ## Build and test our image @@ -3179,7 +3226,7 @@ $ docker run figlet salut \/ \_/|_/|__/ \_/|_/|_/ ``` -.debug[[containers/Cmd_And_Entrypoint.md](""/tree/main/slides/containers/Cmd_And_Entrypoint.md)] +.debug[[containers/Cmd_And_Entrypoint.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Cmd_And_Entrypoint.md)] --- ## Using `CMD` and `ENTRYPOINT` together @@ -3194,7 +3241,7 @@ Then we will use `ENTRYPOINT` and `CMD` together. * They *both* have to use JSON syntax. -.debug[[containers/Cmd_And_Entrypoint.md](""/tree/main/slides/containers/Cmd_And_Entrypoint.md)] +.debug[[containers/Cmd_And_Entrypoint.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Cmd_And_Entrypoint.md)] --- ## `CMD` and `ENTRYPOINT` together @@ -3216,7 +3263,7 @@ CMD ["hello world"] * Otherwise, our extra command-line arguments are used instead of `CMD`. -.debug[[containers/Cmd_And_Entrypoint.md](""/tree/main/slides/containers/Cmd_And_Entrypoint.md)] +.debug[[containers/Cmd_And_Entrypoint.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Cmd_And_Entrypoint.md)] --- ## Build and test our image @@ -3241,7 +3288,7 @@ $ docker run myfiglet | |_/|__/|__/|__/\__/ \/ \/ \__/ |_/|__/\_/|_/ ``` -.debug[[containers/Cmd_And_Entrypoint.md](""/tree/main/slides/containers/Cmd_And_Entrypoint.md)] +.debug[[containers/Cmd_And_Entrypoint.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Cmd_And_Entrypoint.md)] --- ## Overriding the image default parameters @@ -3259,7 +3306,7 @@ $ docker run myfiglet hola mundo We overrode `CMD` but still used `ENTRYPOINT`. -.debug[[containers/Cmd_And_Entrypoint.md](""/tree/main/slides/containers/Cmd_And_Entrypoint.md)] +.debug[[containers/Cmd_And_Entrypoint.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Cmd_And_Entrypoint.md)] --- ## Overriding `ENTRYPOINT` @@ -3276,7 +3323,7 @@ $ docker run -it --entrypoint bash myfiglet root@6027e44e2955:/# ``` -.debug[[containers/Cmd_And_Entrypoint.md](""/tree/main/slides/containers/Cmd_And_Entrypoint.md)] +.debug[[containers/Cmd_And_Entrypoint.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Cmd_And_Entrypoint.md)] --- ## `CMD` and `ENTRYPOINT` recap @@ -3300,7 +3347,7 @@ root@6027e44e2955:/# | `docker run figlet hola` | `figlet -f script` | `hello` | `figlet -f script hola` ] -.debug[[containers/Cmd_And_Entrypoint.md](""/tree/main/slides/containers/Cmd_And_Entrypoint.md)] +.debug[[containers/Cmd_And_Entrypoint.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Cmd_And_Entrypoint.md)] --- ## When to use `ENTRYPOINT` vs `CMD` @@ -3322,12 +3369,12 @@ Example: `docker run busybox ifconfig` :EN:- CMD and ENTRYPOINT :FR:- CMD et ENTRYPOINT -.debug[[containers/Cmd_And_Entrypoint.md](""/tree/main/slides/containers/Cmd_And_Entrypoint.md)] +.debug[[containers/Cmd_And_Entrypoint.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Cmd_And_Entrypoint.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/distillery-containers.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/lots-of-containers.jpg)] --- @@ -3339,7 +3386,7 @@ class: title .nav[ [Previous part](#toc-cmd-and-entrypoint) | -[Back to table of contents](#toc-part-2) +[Back to table of contents](#toc-part-3) | [Next part](#toc-exercise--writing-dockerfiles) ] @@ -3354,7 +3401,7 @@ class: title ![Monks copying books](images/title-copying-files-during-build.jpg) -.debug[[containers/Copying_Files_During_Build.md](""/tree/main/slides/containers/Copying_Files_During_Build.md)] +.debug[[containers/Copying_Files_During_Build.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Copying_Files_During_Build.md)] --- ## Objectives @@ -3370,7 +3417,7 @@ the Dockerfile. In this chapter, we will learn a new Dockerfile keyword: `COPY`. -.debug[[containers/Copying_Files_During_Build.md](""/tree/main/slides/containers/Copying_Files_During_Build.md)] +.debug[[containers/Copying_Files_During_Build.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Copying_Files_During_Build.md)] --- ## Build some C code @@ -3390,7 +3437,7 @@ Let's create a new directory, and put this file in there. Then we will write the Dockerfile. -.debug[[containers/Copying_Files_During_Build.md](""/tree/main/slides/containers/Copying_Files_During_Build.md)] +.debug[[containers/Copying_Files_During_Build.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Copying_Files_During_Build.md)] --- ## The Dockerfile @@ -3412,7 +3459,7 @@ CMD /hello Create this Dockerfile. -.debug[[containers/Copying_Files_During_Build.md](""/tree/main/slides/containers/Copying_Files_During_Build.md)] +.debug[[containers/Copying_Files_During_Build.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Copying_Files_During_Build.md)] --- ## Testing our C program @@ -3425,7 +3472,7 @@ Create this Dockerfile. Success! -.debug[[containers/Copying_Files_During_Build.md](""/tree/main/slides/containers/Copying_Files_During_Build.md)] +.debug[[containers/Copying_Files_During_Build.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Copying_Files_During_Build.md)] --- ## `COPY` and the build cache @@ -3438,7 +3485,7 @@ Success! * Those steps will not be executed again if the files haven't been changed. -.debug[[containers/Copying_Files_During_Build.md](""/tree/main/slides/containers/Copying_Files_During_Build.md)] +.debug[[containers/Copying_Files_During_Build.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Copying_Files_During_Build.md)] --- ## Details @@ -3459,7 +3506,7 @@ Success! * even better, use the `gcc` official image -.debug[[containers/Copying_Files_During_Build.md](""/tree/main/slides/containers/Copying_Files_During_Build.md)] +.debug[[containers/Copying_Files_During_Build.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Copying_Files_During_Build.md)] --- class: extra-details @@ -3487,12 +3534,12 @@ class: extra-details :EN:- Leveraging the build cache for faster builds :FR:- Tirer parti du cache afin d'optimiser la vitesse de *build* -.debug[[containers/Copying_Files_During_Build.md](""/tree/main/slides/containers/Copying_Files_During_Build.md)] +.debug[[containers/Copying_Files_During_Build.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Copying_Files_During_Build.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/lots-of-containers.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/plastic-containers.JPG)] --- @@ -3504,7 +3551,7 @@ class: title .nav[ [Previous part](#toc-copying-files-during-the-build) | -[Back to table of contents](#toc-part-2) +[Back to table of contents](#toc-part-3) | [Next part](#toc-tips-for-efficient-dockerfiles) ] @@ -3528,7 +3575,7 @@ Let's write Dockerfiles for an existing application! 5. Test them together with the provided Compose file --> -.debug[[containers/Exercise_Dockerfile_Basic.md](""/tree/main/slides/containers/Exercise_Dockerfile_Basic.md)] +.debug[[containers/Exercise_Dockerfile_Basic.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Exercise_Dockerfile_Basic.md)] --- ## Code repository @@ -3551,7 +3598,7 @@ It should look like this: └── src/ ``` -.debug[[containers/Exercise_Dockerfile_Basic.md](""/tree/main/slides/containers/Exercise_Dockerfile_Basic.md)] +.debug[[containers/Exercise_Dockerfile_Basic.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Exercise_Dockerfile_Basic.md)] --- ## Instructions @@ -3577,7 +3624,7 @@ Place each Dockerfile in its own directory, like this: └── src/ ``` -.debug[[containers/Exercise_Dockerfile_Basic.md](""/tree/main/slides/containers/Exercise_Dockerfile_Basic.md)] +.debug[[containers/Exercise_Dockerfile_Basic.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Exercise_Dockerfile_Basic.md)] --- ## Build and test @@ -3616,12 +3663,12 @@ services: Test the whole app by bringin up the stack and connecting to port 8888. -.debug[[containers/Exercise_Dockerfile_Basic.md](""/tree/main/slides/containers/Exercise_Dockerfile_Basic.md)] +.debug[[containers/Exercise_Dockerfile_Basic.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Exercise_Dockerfile_Basic.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/plastic-containers.JPG)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/train-of-containers-1.jpg)] --- @@ -3633,7 +3680,7 @@ class: title .nav[ [Previous part](#toc-exercise--writing-dockerfiles) | -[Back to table of contents](#toc-part-3) +[Back to table of contents](#toc-part-4) | [Next part](#toc-dockerfile-examples) ] @@ -3651,7 +3698,7 @@ We will see how to: * Embed unit testing in the build process. -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- ## Reducing the number of layers @@ -3676,7 +3723,7 @@ And then refactor it trivially before shipping: RUN apt-get install thisthing andthatthing andthatotherone somemorestuff ``` -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- ## Avoid re-installing dependencies at each build @@ -3688,7 +3735,7 @@ RUN apt-get install thisthing andthatthing andthatotherone somemorestuff * Solution: `COPY` dependency lists (`package.json`, `requirements.txt`, etc.) by themselves to avoid reinstalling unchanged dependencies every time. -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- ## Example "bad" `Dockerfile` @@ -3704,7 +3751,7 @@ EXPOSE 5000 CMD ["python", "app.py"] ``` -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- ## Fixed `Dockerfile` @@ -3721,7 +3768,7 @@ EXPOSE 5000 CMD ["python", "app.py"] ``` -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- ## Be careful with `chown`, `chmod`, `mv` @@ -3744,7 +3791,7 @@ CMD ["python", "app.py"] * How can we avoid that? -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- ## Put files on the right place @@ -3764,7 +3811,7 @@ CMD ["python", "app.py"] ... ``` -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- ## Use `COPY --chown` @@ -3788,7 +3835,7 @@ CMD ["python", "app.py"] *(In the container, not on the host!)* -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- ## Set correct permissions locally @@ -3797,7 +3844,7 @@ CMD ["python", "app.py"] * When files are copied with `COPY`, permissions are preserved. -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- ## Embedding unit tests in the build process @@ -3821,12 +3868,12 @@ CMD, EXPOSE ... * If `RUN ` fails, the build doesn't produce an image * If it succeeds, it produces a clean image (without test libraries and data) -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/train-of-containers-1.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/train-of-containers-2.jpg)] --- @@ -3838,7 +3885,7 @@ class: title .nav[ [Previous part](#toc-tips-for-efficient-dockerfiles) | -[Back to table of contents](#toc-part-3) +[Back to table of contents](#toc-part-4) | [Next part](#toc-reducing-image-size) ] @@ -3865,7 +3912,7 @@ But sometimes, we have to use different (and even opposed) practices depending o We are going to show a few examples using very different techniques. -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- ## When to optimize an image @@ -3896,7 +3943,7 @@ RUN curl -o wordpress.tar.gz -SL https://wordpress.org/wordpress-${WORDPRESS_UPS (Source: [Wordpress official image](https://github.com/docker-library/wordpress/blob/618490d4bdff6c5774b84b717979bfe3d6ba8ad1/apache/Dockerfile)) -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- ## When to *not* optimize an image @@ -3917,7 +3964,7 @@ In these cases, just keep things simple! (Next slide: a Dockerfile that can be used to preview a Jekyll / github pages site.) -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- ```dockerfile @@ -3941,7 +3988,7 @@ EXPOSE 4000 CMD ["jekyll", "serve", "--host", "0.0.0.0", "--incremental"] ``` -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- ## Multi-dimensional versioning systems @@ -3964,7 +4011,7 @@ ENV PIP=9.0.3 \ (Source: [Plone official image](https://github.com/plone/plone.docker/blob/master/5.1/5.1.0/alpine/Dockerfile)) -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- ## Entrypoints and wrappers @@ -3982,7 +4029,7 @@ That entrypoint will generally be a script, performing any combination of: - and more. -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- ## A typical entrypoint script @@ -4008,7 +4055,7 @@ That entrypoint will generally be a script, performing any combination of: (Source: [Redis official image](https://github.com/docker-library/redis/blob/d24f2be82673ccef6957210cc985e392ebdc65e4/4.0/alpine/docker-entrypoint.sh)) -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- ## Factoring information @@ -4038,7 +4085,7 @@ RUN ... (Source: [Nodejs official image](https://github.com/nodejs/docker-node/blob/master/10/alpine/Dockerfile)) -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- ## Overrides @@ -4051,7 +4098,7 @@ One way to reconcile both needs is to use Compose to enable these behaviors. Let's look at the [trainingwheels](https://github.com/jpetazzo/trainingwheels) demo app for an example. -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- ## Production image @@ -4071,7 +4118,7 @@ EXPOSE 5000 (Source: [trainingwheels Dockerfile](https://github.com/jpetazzo/trainingwheels/blob/master/www/Dockerfile)) -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- ## Development Compose file @@ -4102,7 +4149,7 @@ services: (Source: [trainingwheels Compose file](https://github.com/jpetazzo/trainingwheels/blob/master/docker-compose.yml)) -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- ## How to know which best practices are better? @@ -4131,12 +4178,12 @@ services: :FR:- RΓ©duire le temps de build :FR:- RΓ©duire la taille des images -.debug[[containers/Dockerfile_Tips.md](""/tree/main/slides/containers/Dockerfile_Tips.md)] +.debug[[containers/Dockerfile_Tips.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Dockerfile_Tips.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/train-of-containers-2.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/two-containers-on-a-truck.jpg)] --- @@ -4148,7 +4195,7 @@ class: title .nav[ [Previous part](#toc-dockerfile-examples) | -[Back to table of contents](#toc-part-3) +[Back to table of contents](#toc-part-4) | [Next part](#toc-multi-stage-builds) ] @@ -4170,7 +4217,7 @@ class: title * We are going to see how to obtain an image without the superfluous components. -.debug[[containers/Multi_Stage_Builds.md](""/tree/main/slides/containers/Multi_Stage_Builds.md)] +.debug[[containers/Multi_Stage_Builds.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Multi_Stage_Builds.md)] --- ## Can't we remove superfluous files with `RUN`? @@ -4189,7 +4236,7 @@ This adds a layer which removes a bunch of files. But the previous layers (which added the files) still exist. -.debug[[containers/Multi_Stage_Builds.md](""/tree/main/slides/containers/Multi_Stage_Builds.md)] +.debug[[containers/Multi_Stage_Builds.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Multi_Stage_Builds.md)] --- ## Removing files with an extra layer @@ -4206,7 +4253,7 @@ When downloading an image, all the layers must be downloaded. Therefore, `RUN rm` does not reduce the size of the image or free up disk space. -.debug[[containers/Multi_Stage_Builds.md](""/tree/main/slides/containers/Multi_Stage_Builds.md)] +.debug[[containers/Multi_Stage_Builds.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Multi_Stage_Builds.md)] --- ## Removing unnecessary files @@ -4223,7 +4270,7 @@ Various techniques are available to obtain smaller images: Let's review them quickly. -.debug[[containers/Multi_Stage_Builds.md](""/tree/main/slides/containers/Multi_Stage_Builds.md)] +.debug[[containers/Multi_Stage_Builds.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Multi_Stage_Builds.md)] --- ## Collapsing layers @@ -4250,7 +4297,7 @@ This `RUN` command gives us a single layer. The files that are added, then removed in the same layer, do not grow the layer size. -.debug[[containers/Multi_Stage_Builds.md](""/tree/main/slides/containers/Multi_Stage_Builds.md)] +.debug[[containers/Multi_Stage_Builds.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Multi_Stage_Builds.md)] --- ## Collapsing layers: pros and cons @@ -4269,7 +4316,7 @@ Cons: - that layer is expensive (slow to build) -.debug[[containers/Multi_Stage_Builds.md](""/tree/main/slides/containers/Multi_Stage_Builds.md)] +.debug[[containers/Multi_Stage_Builds.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Multi_Stage_Builds.md)] --- ## Building binaries outside of the Dockerfile @@ -4293,7 +4340,7 @@ For instance, it can: See for instance the [busybox official image](https://github.com/docker-library/busybox/blob/fe634680e32659aaf0ee0594805f74f332619a90/musl/Dockerfile) or this [older busybox image](https://github.com/jpetazzo/docker-busybox). -.debug[[containers/Multi_Stage_Builds.md](""/tree/main/slides/containers/Multi_Stage_Builds.md)] +.debug[[containers/Multi_Stage_Builds.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Multi_Stage_Builds.md)] --- ## Building binaries outside: pros and cons @@ -4314,7 +4361,7 @@ Cons, if binary is added to code repository: - grows repository size a lot if the binary is updated frequently -.debug[[containers/Multi_Stage_Builds.md](""/tree/main/slides/containers/Multi_Stage_Builds.md)] +.debug[[containers/Multi_Stage_Builds.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Multi_Stage_Builds.md)] --- ## Squashing the final image @@ -4337,7 +4384,7 @@ This can be done in (at least) two ways. docker rmi temp-image ``` -.debug[[containers/Multi_Stage_Builds.md](""/tree/main/slides/containers/Multi_Stage_Builds.md)] +.debug[[containers/Multi_Stage_Builds.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Multi_Stage_Builds.md)] --- ## Squashing the image: pros and cons @@ -4358,7 +4405,7 @@ Cons:
(even if we change just a tiny file, the whole image needs to be re-squashed) -.debug[[containers/Multi_Stage_Builds.md](""/tree/main/slides/containers/Multi_Stage_Builds.md)] +.debug[[containers/Multi_Stage_Builds.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Multi_Stage_Builds.md)] --- ## Multi-stage builds @@ -4369,12 +4416,12 @@ Each stage is a separate image, and can copy files from previous stages. We're going to see how they work in more detail. -.debug[[containers/Multi_Stage_Builds.md](""/tree/main/slides/containers/Multi_Stage_Builds.md)] +.debug[[containers/Multi_Stage_Builds.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Multi_Stage_Builds.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/two-containers-on-a-truck.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/wall-of-containers.jpeg)] --- @@ -4386,7 +4433,7 @@ class: title .nav[ [Previous part](#toc-reducing-image-size) | -[Back to table of contents](#toc-part-3) +[Back to table of contents](#toc-part-4) | [Next part](#toc-publishing-images-to-the-docker-hub) ] @@ -4407,7 +4454,7 @@ class: title * Previous stages are not discarded: they will be used for caching, and can be referenced. -.debug[[containers/Multi_Stage_Builds.md](""/tree/main/slides/containers/Multi_Stage_Builds.md)] +.debug[[containers/Multi_Stage_Builds.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Multi_Stage_Builds.md)] --- ## Multi-stage builds in practice @@ -4429,7 +4476,7 @@ class: title COPY --from=builder /go/bin/mylittlebinary /usr/local/bin/ ``` -.debug[[containers/Multi_Stage_Builds.md](""/tree/main/slides/containers/Multi_Stage_Builds.md)] +.debug[[containers/Multi_Stage_Builds.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Multi_Stage_Builds.md)] --- ## Multi-stage builds for our C program @@ -4446,7 +4493,7 @@ We will change our Dockerfile to: The resulting Dockerfile is on the next slide. -.debug[[containers/Multi_Stage_Builds.md](""/tree/main/slides/containers/Multi_Stage_Builds.md)] +.debug[[containers/Multi_Stage_Builds.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Multi_Stage_Builds.md)] --- ## Multi-stage build `Dockerfile` @@ -4471,7 +4518,7 @@ docker build -t hellomultistage . docker run hellomultistage ``` -.debug[[containers/Multi_Stage_Builds.md](""/tree/main/slides/containers/Multi_Stage_Builds.md)] +.debug[[containers/Multi_Stage_Builds.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Multi_Stage_Builds.md)] --- ## Comparing single/multi-stage build image sizes @@ -4490,7 +4537,7 @@ However, if we use common base images (e.g. if we standardize on `ubuntu`), these common images will be pulled only once per node, so they are virtually "free." -.debug[[containers/Multi_Stage_Builds.md](""/tree/main/slides/containers/Multi_Stage_Builds.md)] +.debug[[containers/Multi_Stage_Builds.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Multi_Stage_Builds.md)] --- ## Build targets @@ -4518,12 +4565,12 @@ virtually "free." :FR:Optimiser les images et leur construction :FR:- Utilisation d'un *multi-stage build* -.debug[[containers/Multi_Stage_Builds.md](""/tree/main/slides/containers/Multi_Stage_Builds.md)] +.debug[[containers/Multi_Stage_Builds.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Multi_Stage_Builds.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/wall-of-containers.jpeg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/catene-de-conteneurs.jpg)] --- @@ -4535,7 +4582,7 @@ class: title .nav[ [Previous part](#toc-multi-stage-builds) | -[Back to table of contents](#toc-part-3) +[Back to table of contents](#toc-part-4) | [Next part](#toc-exercise--writing-better-dockerfiles) ] @@ -4557,7 +4604,7 @@ don't want to force anyone to create one.* is free (and doesn't require a credit card), and hosting public images is free as well.* -.debug[[containers/Publishing_To_Docker_Hub.md](""/tree/main/slides/containers/Publishing_To_Docker_Hub.md)] +.debug[[containers/Publishing_To_Docker_Hub.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Publishing_To_Docker_Hub.md)] --- ## Logging into our Docker Hub account @@ -4573,7 +4620,7 @@ possible) integrate with your system's keyring to store your credentials securely. However, on most Linux servers, it will store your credentials in `~/.docker/config`.] -.debug[[containers/Publishing_To_Docker_Hub.md](""/tree/main/slides/containers/Publishing_To_Docker_Hub.md)] +.debug[[containers/Publishing_To_Docker_Hub.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Publishing_To_Docker_Hub.md)] --- ## Image tags and registry addresses @@ -4596,7 +4643,7 @@ servers, it will store your credentials in `~/.docker/config`.] * `ubuntu` is, in fact, `library/ubuntu`, i.e. `index.docker.io/library/ubuntu` -.debug[[containers/Publishing_To_Docker_Hub.md](""/tree/main/slides/containers/Publishing_To_Docker_Hub.md)] +.debug[[containers/Publishing_To_Docker_Hub.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Publishing_To_Docker_Hub.md)] --- ## Tagging an image to push it on the Hub @@ -4617,7 +4664,7 @@ servers, it will store your credentials in `~/.docker/config`.] * Anybody can now `docker run jpetazzo/figlet` anywhere. -.debug[[containers/Publishing_To_Docker_Hub.md](""/tree/main/slides/containers/Publishing_To_Docker_Hub.md)] +.debug[[containers/Publishing_To_Docker_Hub.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Publishing_To_Docker_Hub.md)] --- ## The goodness of automated builds @@ -4632,7 +4679,7 @@ servers, it will store your credentials in `~/.docker/config`.] * If you work with public repositories, this is free -.debug[[containers/Publishing_To_Docker_Hub.md](""/tree/main/slides/containers/Publishing_To_Docker_Hub.md)] +.debug[[containers/Publishing_To_Docker_Hub.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Publishing_To_Docker_Hub.md)] --- class: extra-details @@ -4651,7 +4698,7 @@ class: extra-details * Click "Save and Build" to build the repository immediately (without waiting for a git push). * Subsequent builds will happen automatically, thanks to GitHub hooks. -.debug[[containers/Publishing_To_Docker_Hub.md](""/tree/main/slides/containers/Publishing_To_Docker_Hub.md)] +.debug[[containers/Publishing_To_Docker_Hub.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Publishing_To_Docker_Hub.md)] --- ## Building on the fly @@ -4679,12 +4726,12 @@ It is possible to view the build logs by setting up an account on [ctr.run](http :EN:- Publishing images to the Docker Hub :FR:- Publier des images sur le Docker Hub -.debug[[containers/Publishing_To_Docker_Hub.md](""/tree/main/slides/containers/Publishing_To_Docker_Hub.md)] +.debug[[containers/Publishing_To_Docker_Hub.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Publishing_To_Docker_Hub.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/catene-de-conteneurs.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/Container-Ship-Freighter-Navigation-Elbe-Romance-1782991.jpg)] --- @@ -4696,7 +4743,7 @@ class: title .nav[ [Previous part](#toc-publishing-images-to-the-docker-hub) | -[Back to table of contents](#toc-part-3) +[Back to table of contents](#toc-part-4) | [Next part](#toc-naming-and-inspecting-containers) ] @@ -4714,12 +4761,12 @@ Use a different tag for these images, so that we can compare their sizes. What's the size difference between single-stage and multi-stage builds? -.debug[[containers/Exercise_Dockerfile_Advanced.md](""/tree/main/slides/containers/Exercise_Dockerfile_Advanced.md)] +.debug[[containers/Exercise_Dockerfile_Advanced.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Exercise_Dockerfile_Advanced.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/Container-Ship-Freighter-Navigation-Elbe-Romance-1782991.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/ShippingContainerSFBay.jpg)] --- @@ -4731,7 +4778,7 @@ class: title .nav[ [Previous part](#toc-exercise--writing-better-dockerfiles) | -[Back to table of contents](#toc-part-4) +[Back to table of contents](#toc-part-5) | [Next part](#toc-labels) ] @@ -4746,7 +4793,7 @@ class: title ![Markings on container door](images/title-naming-and-inspecting-containers.jpg) -.debug[[containers/Naming_And_Inspecting.md](""/tree/main/slides/containers/Naming_And_Inspecting.md)] +.debug[[containers/Naming_And_Inspecting.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Naming_And_Inspecting.md)] --- ## Objectives @@ -4762,7 +4809,7 @@ Naming allows us to: We will also see the `inspect` command, which gives a lot of details about a container. -.debug[[containers/Naming_And_Inspecting.md](""/tree/main/slides/containers/Naming_And_Inspecting.md)] +.debug[[containers/Naming_And_Inspecting.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Naming_And_Inspecting.md)] --- ## Naming our containers @@ -4781,7 +4828,7 @@ $ docker stop thumbnail-worker etc. ``` -.debug[[containers/Naming_And_Inspecting.md](""/tree/main/slides/containers/Naming_And_Inspecting.md)] +.debug[[containers/Naming_And_Inspecting.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Naming_And_Inspecting.md)] --- ## Default names @@ -4797,7 +4844,7 @@ It will be the concatenation of: Examples: `happy_curie`, `clever_hopper`, `jovial_lovelace` ... -.debug[[containers/Naming_And_Inspecting.md](""/tree/main/slides/containers/Naming_And_Inspecting.md)] +.debug[[containers/Naming_And_Inspecting.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Naming_And_Inspecting.md)] --- ## Specifying a name @@ -4813,7 +4860,7 @@ to create the container. This lets us enforce unicity of a given resource. -.debug[[containers/Naming_And_Inspecting.md](""/tree/main/slides/containers/Naming_And_Inspecting.md)] +.debug[[containers/Naming_And_Inspecting.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Naming_And_Inspecting.md)] --- ## Renaming containers @@ -4822,7 +4869,7 @@ This lets us enforce unicity of a given resource. * This allows you to "free up" a name without destroying the associated container. -.debug[[containers/Naming_And_Inspecting.md](""/tree/main/slides/containers/Naming_And_Inspecting.md)] +.debug[[containers/Naming_And_Inspecting.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Naming_And_Inspecting.md)] --- ## Inspecting a container @@ -4839,7 +4886,7 @@ $ docker inspect There are multiple ways to consume that information. -.debug[[containers/Naming_And_Inspecting.md](""/tree/main/slides/containers/Naming_And_Inspecting.md)] +.debug[[containers/Naming_And_Inspecting.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Naming_And_Inspecting.md)] --- ## Parsing JSON with the Shell @@ -4858,7 +4905,7 @@ $ docker inspect | jq . * We will see a better solution which doesn't require extra tools. -.debug[[containers/Naming_And_Inspecting.md](""/tree/main/slides/containers/Naming_And_Inspecting.md)] +.debug[[containers/Naming_And_Inspecting.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Naming_And_Inspecting.md)] --- ## Using `--format` @@ -4889,12 +4936,12 @@ $ docker inspect --format '{{ json .Created }}' :FR:- Obtenir des informations dΓ©taillΓ©es sur un conteneur :FR:- Associer un identifiant unique Γ  un conteneur -.debug[[containers/Naming_And_Inspecting.md](""/tree/main/slides/containers/Naming_And_Inspecting.md)] +.debug[[containers/Naming_And_Inspecting.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Naming_And_Inspecting.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/ShippingContainerSFBay.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/aerial-view-of-containers.jpg)] --- @@ -4906,7 +4953,7 @@ class: title .nav[ [Previous part](#toc-naming-and-inspecting-containers) | -[Back to table of contents](#toc-part-4) +[Back to table of contents](#toc-part-5) | [Next part](#toc-restarting-and-attaching-to-containers) ] @@ -4926,7 +4973,7 @@ class: title * They can also be used as filters with some commands (e.g. `docker ps`). -.debug[[containers/Labels.md](""/tree/main/slides/containers/Labels.md)] +.debug[[containers/Labels.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Labels.md)] --- ## Using labels @@ -4943,7 +4990,7 @@ We didn't specify a value for the `owner` label in the last example. This is equivalent to setting the value to be an empty string. -.debug[[containers/Labels.md](""/tree/main/slides/containers/Labels.md)] +.debug[[containers/Labels.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Labels.md)] --- ## Querying labels @@ -4964,7 +5011,7 @@ We can use the `--format` flag to list the value of a label. $ docker inspect $(docker ps -q) --format 'OWNER={{.Config.Labels.owner}}' ``` -.debug[[containers/Labels.md](""/tree/main/slides/containers/Labels.md)] +.debug[[containers/Labels.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Labels.md)] --- ## Using labels to select containers @@ -4981,7 +5028,7 @@ Or we can list containers having a specific label with a specific value. $ docker ps --filter label=owner=alice ``` -.debug[[containers/Labels.md](""/tree/main/slides/containers/Labels.md)] +.debug[[containers/Labels.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Labels.md)] --- ## Use-cases for labels @@ -5006,12 +5053,12 @@ $ docker ps --filter label=owner=alice :EN:- Using labels to identify containers :FR:- Γ‰tiqueter ses conteneurs avec des mΓ©ta-donnΓ©es -.debug[[containers/Labels.md](""/tree/main/slides/containers/Labels.md)] +.debug[[containers/Labels.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Labels.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/aerial-view-of-containers.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/blue-containers.jpg)] --- @@ -5023,7 +5070,7 @@ class: title .nav[ [Previous part](#toc-labels) | -[Back to table of contents](#toc-part-4) +[Back to table of contents](#toc-part-5) | [Next part](#toc-getting-inside-a-container) ] @@ -5041,7 +5088,7 @@ In this chapter, we will see how to: * Attach to a background container to bring it to the foreground. * Restart a stopped container. -.debug[[containers/Start_And_Attach.md](""/tree/main/slides/containers/Start_And_Attach.md)] +.debug[[containers/Start_And_Attach.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Start_And_Attach.md)] --- ## Background and foreground @@ -5056,7 +5103,7 @@ It is always possible to detach from a container, and to reattach to a container Analogy: attaching to a container is like plugging a keyboard and screen to a physical server. -.debug[[containers/Start_And_Attach.md](""/tree/main/slides/containers/Start_And_Attach.md)] +.debug[[containers/Start_And_Attach.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Start_And_Attach.md)] --- ## Detaching from a container (Linux/macOS) @@ -5074,7 +5121,7 @@ What does `-it` stand for? * `-t` means "allocate a terminal." * `-i` means "connect stdin to the terminal." -.debug[[containers/Start_And_Attach.md](""/tree/main/slides/containers/Start_And_Attach.md)] +.debug[[containers/Start_And_Attach.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Start_And_Attach.md)] --- ## Detaching cont. (Win PowerShell and cmd.exe) @@ -5089,7 +5136,7 @@ What does `-it` stand for? * Both PowerShell and Bash work well in Win 10; just be aware of differences. -.debug[[containers/Start_And_Attach.md](""/tree/main/slides/containers/Start_And_Attach.md)] +.debug[[containers/Start_And_Attach.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Start_And_Attach.md)] --- class: extra-details @@ -5114,7 +5161,7 @@ Check that our container is still running: $ docker ps -l ``` -.debug[[containers/Start_And_Attach.md](""/tree/main/slides/containers/Start_And_Attach.md)] +.debug[[containers/Start_And_Attach.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Start_And_Attach.md)] --- class: extra-details @@ -5139,7 +5186,7 @@ $ docker attach $(docker ps -lq) Check that `^X x` doesn't work, but `^P ^Q` does. -.debug[[containers/Start_And_Attach.md](""/tree/main/slides/containers/Start_And_Attach.md)] +.debug[[containers/Start_And_Attach.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Start_And_Attach.md)] --- ## Detaching from non-interactive containers @@ -5151,7 +5198,7 @@ Check that `^X x` doesn't work, but `^P ^Q` does. * Remember: you can always detach by killing the Docker client. -.debug[[containers/Start_And_Attach.md](""/tree/main/slides/containers/Start_And_Attach.md)] +.debug[[containers/Start_And_Attach.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Start_And_Attach.md)] --- ## Checking container output @@ -5164,7 +5211,7 @@ Check that `^X x` doesn't work, but `^P ^Q` does. $ docker logs --tail 1 --follow ``` -.debug[[containers/Start_And_Attach.md](""/tree/main/slides/containers/Start_And_Attach.md)] +.debug[[containers/Start_And_Attach.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Start_And_Attach.md)] --- ## Restarting a container @@ -5189,7 +5236,7 @@ $ docker attach Use `docker ps -a` to identify the container ID of a previous `jpetazzo/clock` container, and try those commands. -.debug[[containers/Start_And_Attach.md](""/tree/main/slides/containers/Start_And_Attach.md)] +.debug[[containers/Start_And_Attach.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Start_And_Attach.md)] --- ## Attaching to a REPL @@ -5204,7 +5251,7 @@ and try those commands. * Try hitting `^L` or `Enter` -.debug[[containers/Start_And_Attach.md](""/tree/main/slides/containers/Start_And_Attach.md)] +.debug[[containers/Start_And_Attach.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Start_And_Attach.md)] --- class: extra-details @@ -5226,12 +5273,12 @@ class: extra-details :FR:- RedΓ©marrer des anciens conteneurs :FR:- Se dΓ©tacher et rattacher Γ  des conteneurs -.debug[[containers/Start_And_Attach.md](""/tree/main/slides/containers/Start_And_Attach.md)] +.debug[[containers/Start_And_Attach.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Start_And_Attach.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/blue-containers.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/chinook-helicopter-container.jpg)] --- @@ -5243,7 +5290,7 @@ class: title .nav[ [Previous part](#toc-restarting-and-attaching-to-containers) | -[Back to table of contents](#toc-part-4) +[Back to table of contents](#toc-part-5) | [Next part](#toc-limiting-resources) ] @@ -5258,7 +5305,7 @@ class: title ![Person standing inside a container](images/getting-inside.png) -.debug[[containers/Getting_Inside.md](""/tree/main/slides/containers/Getting_Inside.md)] +.debug[[containers/Getting_Inside.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Getting_Inside.md)] --- ## Objectives @@ -5271,7 +5318,7 @@ On a traditional server or VM, we sometimes need to: In this chapter, we will see how to do that with containers. -.debug[[containers/Getting_Inside.md](""/tree/main/slides/containers/Getting_Inside.md)] +.debug[[containers/Getting_Inside.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Getting_Inside.md)] --- ## Getting a shell @@ -5290,7 +5337,7 @@ In an perfect world, this shouldn't be necessary. In the real world, though ... we often need shell access! -.debug[[containers/Getting_Inside.md](""/tree/main/slides/containers/Getting_Inside.md)] +.debug[[containers/Getting_Inside.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Getting_Inside.md)] --- ## Not getting a shell @@ -5311,7 +5358,7 @@ Even without a perfect deployment system, we can do many operations without gett _Let's save logging, volumes ... for later, but let's have a look at process information!_ -.debug[[containers/Getting_Inside.md](""/tree/main/slides/containers/Getting_Inside.md)] +.debug[[containers/Getting_Inside.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Getting_Inside.md)] --- ## Viewing container processes from the host @@ -5330,7 +5377,7 @@ $ ps faux | less * We can use tools like `lsof`, `strace`, `gdb` ... To analyze them. -.debug[[containers/Getting_Inside.md](""/tree/main/slides/containers/Getting_Inside.md)] +.debug[[containers/Getting_Inside.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Getting_Inside.md)] --- class: extra-details @@ -5347,7 +5394,7 @@ class: extra-details _We will give more details about namespaces and cgroups later._ -.debug[[containers/Getting_Inside.md](""/tree/main/slides/containers/Getting_Inside.md)] +.debug[[containers/Getting_Inside.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Getting_Inside.md)] --- ## Getting a shell in a running container @@ -5366,7 +5413,7 @@ $ docker exec -ti ticktock sh * This can also be done "manually" with the tool `nsenter`. -.debug[[containers/Getting_Inside.md](""/tree/main/slides/containers/Getting_Inside.md)] +.debug[[containers/Getting_Inside.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Getting_Inside.md)] --- ## Caveats @@ -5381,7 +5428,7 @@ $ docker exec -ti ticktock sh * What if the container is stopped or crashed? -.debug[[containers/Getting_Inside.md](""/tree/main/slides/containers/Getting_Inside.md)] +.debug[[containers/Getting_Inside.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Getting_Inside.md)] --- ## Getting a shell in a stopped container @@ -5394,7 +5441,7 @@ $ docker exec -ti ticktock sh * How does that translate into the container world? -.debug[[containers/Getting_Inside.md](""/tree/main/slides/containers/Getting_Inside.md)] +.debug[[containers/Getting_Inside.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Getting_Inside.md)] --- ## Analyzing a stopped container @@ -5415,7 +5462,7 @@ First, let's check the status of that container. docker ps -l ``` -.debug[[containers/Getting_Inside.md](""/tree/main/slides/containers/Getting_Inside.md)] +.debug[[containers/Getting_Inside.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Getting_Inside.md)] --- ## Viewing filesystem changes @@ -5432,7 +5479,7 @@ docker diff * The output of `docker diff` shows some interesting log files! -.debug[[containers/Getting_Inside.md](""/tree/main/slides/containers/Getting_Inside.md)] +.debug[[containers/Getting_Inside.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Getting_Inside.md)] --- ## Accessing files @@ -5451,7 +5498,7 @@ cat error.log (The directory `/run/nginx` doesn't exist.) -.debug[[containers/Getting_Inside.md](""/tree/main/slides/containers/Getting_Inside.md)] +.debug[[containers/Getting_Inside.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Getting_Inside.md)] --- ## Exploring a crashed container @@ -5474,7 +5521,7 @@ docker commit debugimage docker run -ti --entrypoint sh debugimage ``` -.debug[[containers/Getting_Inside.md](""/tree/main/slides/containers/Getting_Inside.md)] +.debug[[containers/Getting_Inside.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Getting_Inside.md)] --- class: extra-details @@ -5498,12 +5545,12 @@ This will give a detailed listing of the content of the container. :EN:- Troubleshooting and getting inside a container :FR:- Inspecter un conteneur en dΓ©tail, en *live* ou *post-mortem* -.debug[[containers/Getting_Inside.md](""/tree/main/slides/containers/Getting_Inside.md)] +.debug[[containers/Getting_Inside.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Getting_Inside.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/chinook-helicopter-container.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/container-cranes.jpg)] --- @@ -5515,7 +5562,7 @@ class: title .nav[ [Previous part](#toc-getting-inside-a-container) | -[Back to table of contents](#toc-part-4) +[Back to table of contents](#toc-part-5) | [Next part](#toc-container-networking-basics) ] @@ -5537,7 +5584,7 @@ class: title (Spoiler alert: yes!) -.debug[[containers/Resource_Limits.md](""/tree/main/slides/containers/Resource_Limits.md)] +.debug[[containers/Resource_Limits.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Resource_Limits.md)] --- ## Container processes are normal processes @@ -5564,7 +5611,7 @@ class: title
(That host is running nginx, elasticsearch, and alpine.) -.debug[[containers/Resource_Limits.md](""/tree/main/slides/containers/Resource_Limits.md)] +.debug[[containers/Resource_Limits.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Resource_Limits.md)] --- ## By default: nothing changes @@ -5591,7 +5638,7 @@ class: title (i.e., a process eventually gets killed, possibly in another container.) -.debug[[containers/Resource_Limits.md](""/tree/main/slides/containers/Resource_Limits.md)] +.debug[[containers/Resource_Limits.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Resource_Limits.md)] --- ## Limiting container resources @@ -5610,7 +5657,7 @@ class: title - in that case, it only kills processes in that container. -.debug[[containers/Resource_Limits.md](""/tree/main/slides/containers/Resource_Limits.md)] +.debug[[containers/Resource_Limits.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Resource_Limits.md)] --- ## Limiting memory in practice @@ -5629,7 +5676,7 @@ class: title - We will see two strategies: limiting RAM usage, or limiting both -.debug[[containers/Resource_Limits.md](""/tree/main/slides/containers/Resource_Limits.md)] +.debug[[containers/Resource_Limits.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Resource_Limits.md)] --- ## Limiting RAM usage @@ -5650,7 +5697,7 @@ If the container tries to use more than 100 MB of RAM, *and* swap is available: If we run out of swap, the global OOM killer still intervenes. -.debug[[containers/Resource_Limits.md](""/tree/main/slides/containers/Resource_Limits.md)] +.debug[[containers/Resource_Limits.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Resource_Limits.md)] --- ## Limiting both RAM and swap usage @@ -5665,7 +5712,7 @@ If the container tries to use more than 100 MB of memory, it is killed. On the other hand, the application will never be slowed down because of swap. -.debug[[containers/Resource_Limits.md](""/tree/main/slides/containers/Resource_Limits.md)] +.debug[[containers/Resource_Limits.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Resource_Limits.md)] --- ## When to pick which strategy? @@ -5680,7 +5727,7 @@ On the other hand, the application will never be slowed down because of swap. - Ultimately, this is no different from "do I want swap, and how much?" -.debug[[containers/Resource_Limits.md](""/tree/main/slides/containers/Resource_Limits.md)] +.debug[[containers/Resource_Limits.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Resource_Limits.md)] --- ## Limiting CPU usage @@ -5695,7 +5742,7 @@ On the other hand, the application will never be slowed down because of swap. - They can be used separately or together. -.debug[[containers/Resource_Limits.md](""/tree/main/slides/containers/Resource_Limits.md)] +.debug[[containers/Resource_Limits.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Resource_Limits.md)] --- ## Setting relative priority @@ -5710,7 +5757,7 @@ On the other hand, the application will never be slowed down because of swap. - In other words: a container with `--cpu-shares 2048` will receive twice as much than the default. -.debug[[containers/Resource_Limits.md](""/tree/main/slides/containers/Resource_Limits.md)] +.debug[[containers/Resource_Limits.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Resource_Limits.md)] --- ## Setting a CPU% limit @@ -5725,7 +5772,7 @@ On the other hand, the application will never be slowed down because of swap. `--cpus 10.0` means 10 entire CPUs. -.debug[[containers/Resource_Limits.md](""/tree/main/slides/containers/Resource_Limits.md)] +.debug[[containers/Resource_Limits.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Resource_Limits.md)] --- ## Pinning containers to CPUs @@ -5744,7 +5791,7 @@ On the other hand, the application will never be slowed down because of swap. (They might still be used by other containers, or uncontainerized processes.) -.debug[[containers/Resource_Limits.md](""/tree/main/slides/containers/Resource_Limits.md)] +.debug[[containers/Resource_Limits.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Resource_Limits.md)] --- ## Limiting disk usage @@ -5765,12 +5812,12 @@ On the other hand, the application will never be slowed down because of swap. - Container disk usage can be audited with `docker ps -s` and `docker diff`. -.debug[[containers/Resource_Limits.md](""/tree/main/slides/containers/Resource_Limits.md)] +.debug[[containers/Resource_Limits.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Resource_Limits.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/container-cranes.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/container-housing.jpg)] --- @@ -5782,7 +5829,7 @@ class: title .nav[ [Previous part](#toc-limiting-resources) | -[Back to table of contents](#toc-part-5) +[Back to table of contents](#toc-part-6) | [Next part](#toc-container-network-drivers) ] @@ -5797,7 +5844,7 @@ class: title ![A dense graph network](images/title-container-networking-basics.jpg) -.debug[[containers/Container_Networking_Basics.md](""/tree/main/slides/containers/Container_Networking_Basics.md)] +.debug[[containers/Container_Networking_Basics.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Networking_Basics.md)] --- ## Objectives @@ -5812,7 +5859,7 @@ At the end of this section, you will be able to: * Find a container's IP address. -.debug[[containers/Container_Networking_Basics.md](""/tree/main/slides/containers/Container_Networking_Basics.md)] +.debug[[containers/Container_Networking_Basics.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Networking_Basics.md)] --- ## Running a very simple service @@ -5827,7 +5874,7 @@ At the end of this section, you will be able to: - It serves a default "Welcome to nginx!" page -.debug[[containers/Container_Networking_Basics.md](""/tree/main/slides/containers/Container_Networking_Basics.md)] +.debug[[containers/Container_Networking_Basics.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Networking_Basics.md)] --- ## Running an NGINX server @@ -5847,7 +5894,7 @@ $ docker run -d -P nginx - ...OK, how do we connect to our web server now? -.debug[[containers/Container_Networking_Basics.md](""/tree/main/slides/containers/Container_Networking_Basics.md)] +.debug[[containers/Container_Networking_Basics.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Networking_Basics.md)] --- ## Finding our web server port @@ -5869,7 +5916,7 @@ $ docker run -d -P nginx - Now we need to connect to the Docker host! -.debug[[containers/Container_Networking_Basics.md](""/tree/main/slides/containers/Container_Networking_Basics.md)] +.debug[[containers/Container_Networking_Basics.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Networking_Basics.md)] --- ## Finding the address of the Docker host @@ -5890,7 +5937,7 @@ $ docker run -d -P nginx *use the IP address of the Docker VM* -.debug[[containers/Container_Networking_Basics.md](""/tree/main/slides/containers/Container_Networking_Basics.md)] +.debug[[containers/Container_Networking_Basics.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Networking_Basics.md)] --- ## Connecting to our web server (GUI) @@ -5900,7 +5947,7 @@ shown by `docker ps` for container port 80. ![Screenshot](images/welcome-to-nginx.png) -.debug[[containers/Container_Networking_Basics.md](""/tree/main/slides/containers/Container_Networking_Basics.md)] +.debug[[containers/Container_Networking_Basics.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Networking_Basics.md)] --- ## Connecting to our web server (CLI) @@ -5919,7 +5966,7 @@ $ curl localhost:12345 ... ``` -.debug[[containers/Container_Networking_Basics.md](""/tree/main/slides/containers/Container_Networking_Basics.md)] +.debug[[containers/Container_Networking_Basics.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Networking_Basics.md)] --- ## How does Docker know which port to map? @@ -5945,7 +5992,7 @@ IMAGE CREATED CREATED BY 11 days ago /bin/sh -c #(nop) EXPOSE 80/tcp ``` -.debug[[containers/Container_Networking_Basics.md](""/tree/main/slides/containers/Container_Networking_Basics.md)] +.debug[[containers/Container_Networking_Basics.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Networking_Basics.md)] --- ## Why can't we just connect to port 80? @@ -5962,7 +6009,7 @@ IMAGE CREATED CREATED BY - We'll see later how to force a port number (including port 80!) -.debug[[containers/Container_Networking_Basics.md](""/tree/main/slides/containers/Container_Networking_Basics.md)] +.debug[[containers/Container_Networking_Basics.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Networking_Basics.md)] --- class: extra-details @@ -5985,7 +6032,7 @@ You can do all these things when running Docker directly on Linux. (On other platforms, *generally not*, but there are some exceptions.) -.debug[[containers/Container_Networking_Basics.md](""/tree/main/slides/containers/Container_Networking_Basics.md)] +.debug[[containers/Container_Networking_Basics.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Networking_Basics.md)] --- ## Finding the web server port in a script @@ -5999,7 +6046,7 @@ $ docker port 80 0.0.0.0:12345 ``` -.debug[[containers/Container_Networking_Basics.md](""/tree/main/slides/containers/Container_Networking_Basics.md)] +.debug[[containers/Container_Networking_Basics.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Networking_Basics.md)] --- ## Manual allocation of port numbers @@ -6019,7 +6066,7 @@ $ docker run -d -p 8080:80 -p 8888:80 nginx Note: the convention is `port-on-host:port-on-container`. -.debug[[containers/Container_Networking_Basics.md](""/tree/main/slides/containers/Container_Networking_Basics.md)] +.debug[[containers/Container_Networking_Basics.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Networking_Basics.md)] --- ## Plumbing containers into your infrastructure @@ -6038,7 +6085,7 @@ There are many ways to integrate containers in your network. Orchestrators typically provide mechanisms to enable direct container-to-container communication across hosts, and publishing/load balancing for inbound traffic. -.debug[[containers/Container_Networking_Basics.md](""/tree/main/slides/containers/Container_Networking_Basics.md)] +.debug[[containers/Container_Networking_Basics.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Networking_Basics.md)] --- ## Finding the container's IP address @@ -6057,7 +6104,7 @@ $ docker inspect --format '{{ .NetworkSettings.IPAddress }}' * Here, we provide it with a format string to extract exactly the private IP address of the container. -.debug[[containers/Container_Networking_Basics.md](""/tree/main/slides/containers/Container_Networking_Basics.md)] +.debug[[containers/Container_Networking_Basics.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Networking_Basics.md)] --- ## Pinging our container @@ -6076,7 +6123,7 @@ When running on Linux, we can even ping that IP address directly! (And connect to a container's ports even if they aren't published.) -.debug[[containers/Container_Networking_Basics.md](""/tree/main/slides/containers/Container_Networking_Basics.md)] +.debug[[containers/Container_Networking_Basics.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Networking_Basics.md)] --- ## How often do we use `-p` and `-P` ? @@ -6091,7 +6138,7 @@ When running on Linux, we can even ping that IP address directly! - Or `docker run -p ...` when an image doesn't `EXPOSE` a port correctly -.debug[[containers/Container_Networking_Basics.md](""/tree/main/slides/containers/Container_Networking_Basics.md)] +.debug[[containers/Container_Networking_Basics.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Networking_Basics.md)] --- ## Section summary @@ -6109,12 +6156,12 @@ We've learned how to: :EN:- Exposing single containers :FR:- Exposer un conteneur isolé -.debug[[containers/Container_Networking_Basics.md](""/tree/main/slides/containers/Container_Networking_Basics.md)] +.debug[[containers/Container_Networking_Basics.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Networking_Basics.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/container-housing.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/containers-by-the-water.jpg)] --- @@ -6126,7 +6173,7 @@ class: title .nav[ [Previous part](#toc-container-networking-basics) | -[Back to table of contents](#toc-part-5) +[Back to table of contents](#toc-part-6) | [Next part](#toc-the-container-network-model) ] @@ -6154,7 +6201,7 @@ Each network is managed by a driver. The different drivers are explained with more details on the following slides. -.debug[[containers/Network_Drivers.md](""/tree/main/slides/containers/Network_Drivers.md)] +.debug[[containers/Network_Drivers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Network_Drivers.md)] --- ## The default bridge @@ -6176,7 +6223,7 @@ The different drivers are explained with more details on the following slides. * The container can have its own routes, iptables rules, etc. -.debug[[containers/Network_Drivers.md](""/tree/main/slides/containers/Network_Drivers.md)] +.debug[[containers/Network_Drivers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Network_Drivers.md)] --- ## The null driver @@ -6189,7 +6236,7 @@ The different drivers are explained with more details on the following slides. * Useful for isolated/untrusted workloads. -.debug[[containers/Network_Drivers.md](""/tree/main/slides/containers/Network_Drivers.md)] +.debug[[containers/Network_Drivers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Network_Drivers.md)] --- ## The host driver @@ -6210,7 +6257,7 @@ Use cases: * Peer discovery (e.g. Erlang port mapper, Raft, Serf...) -.debug[[containers/Network_Drivers.md](""/tree/main/slides/containers/Network_Drivers.md)] +.debug[[containers/Network_Drivers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Network_Drivers.md)] --- ## The container driver @@ -6234,12 +6281,12 @@ Use cases: :FR:- Accès transparent au réseau avec le mode "host" :FR:- Partage de la pile réseau avece le mode "container" -.debug[[containers/Network_Drivers.md](""/tree/main/slides/containers/Network_Drivers.md)] +.debug[[containers/Network_Drivers.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Network_Drivers.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/containers-by-the-water.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/distillery-containers.jpg)] --- @@ -6251,7 +6298,7 @@ class: title .nav[ [Previous part](#toc-container-network-drivers) | -[Back to table of contents](#toc-part-5) +[Back to table of contents](#toc-part-6) | [Next part](#toc-service-discovery-with-containers) ] @@ -6266,7 +6313,7 @@ class: title ![A denser graph network](images/title-the-container-network-model.jpg) -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## Objectives @@ -6285,7 +6332,7 @@ At the end of this lesson, you will be able to: We will also explain the principle of overlay networks and network plugins. -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## The Container Network Model @@ -6308,7 +6355,7 @@ New networks can be created (with `docker network create`). (Note: networks `none` and `host` are special; let's set them aside for now.) -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## What's a network? @@ -6329,7 +6376,7 @@ New networks can be created (with `docker network create`). (and each network has its own "domain", "zone", or "scope") -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## Service discovery @@ -6350,7 +6397,7 @@ New networks can be created (with `docker network create`). (i.e. `docker run --name xyz ...` is like `docker run --net-alias xyz ...` -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## Network isolation @@ -6365,7 +6412,7 @@ New networks can be created (with `docker network create`). (`docker run -P ...` makes a container port available to everyone) -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## How to use networks @@ -6382,28 +6429,28 @@ New networks can be created (with `docker network create`). - If we use Docker Compose, this is managed automatically for us -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- class: pic ![Multiple containers on the default bridge network, on a Linux machine](images/docker-networking-default-bridge-linux.png) -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- class: pic ![Multiple containers in multiple bridge networks, on a Linux machine](images/docker-networking-networks-linux.png) -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- class: pic ![Multiple containers in multiple bridge networks, on a Mac/Windows machine](images/docker-networking-networks-macwin.png) -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- class: extra-details @@ -6428,7 +6475,7 @@ class: extra-details - per-namespace service discovery - network isolation requires extra steps (Network Policies) -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## Creating a network @@ -6451,7 +6498,7 @@ eb0eeab782f4 host host 4c1ff84d6d3f dev bridge ``` -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## Placing containers on a network @@ -6465,7 +6512,7 @@ $ docker run -d --name es --net dev elasticsearch:2 8abb80e229ce8926c7223beb69699f5f34d6f1d438bfc5682db893e798046863 ``` -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## Communication between containers @@ -6496,7 +6543,7 @@ root@0ecccdfa45ef:/# ``` ] -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- class: extra-details @@ -6525,12 +6572,12 @@ ff02::2 ip6-allrouters ``` ] -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/distillery-containers.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/lots-of-containers.jpg)] --- @@ -6542,7 +6589,7 @@ class: title .nav[ [Previous part](#toc-the-container-network-model) | -[Back to table of contents](#toc-part-5) +[Back to table of contents](#toc-part-6) | [Next part](#toc-local-development-workflow-with-docker) ] @@ -6561,7 +6608,7 @@ class: title * We will place them both on the `dev` network created before. -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## Running the web server @@ -6582,7 +6629,7 @@ Check the port that has been allocated to it: $ docker ps -l ``` -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## Test the web server @@ -6596,7 +6643,7 @@ $ docker ps -l Note: we're not using a FQDN or an IP address here; just `redis`. -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## Start the data store @@ -6613,7 +6660,7 @@ Start the container: $ docker run --net dev --net-alias redis -d redis ``` -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## Test the web server again @@ -6624,7 +6671,7 @@ $ docker run --net dev --net-alias redis -d redis * When the app tries to resolve `redis`, instead of getting a DNS error, it gets the IP address of our Redis container. -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## A few words on *scope* @@ -6643,7 +6690,7 @@ $ docker run --net dev --net-alias redis -d redis (in that case, we get multiple DNS entries, aka "DNS round robin") -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- class: extra-details @@ -6661,7 +6708,7 @@ Names can be resolved only when containers are on the same network. Containers can contact each other only when they are on the same network (you can try to ping using the IP address to verify). -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- class: extra-details @@ -6680,7 +6727,7 @@ Multiple containers can have the same network alias (even on the same network). Since Docker Engine 1.11, resolving a network alias yields the IP addresses of all containers holding this alias. -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- class: extra-details @@ -6703,7 +6750,7 @@ $ docker run -d --name prod-es-2 --net-alias es --net prod elasticsearch:2 1820087a9c600f43159688050dcc164c298183e1d2e62d5694fd46b10ac3bc3d ``` -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- class: extra-details @@ -6721,7 +6768,7 @@ Address 2: 172.23.0.2 prod-es-1.prod (You can ignore the `can't resolve '(null)'` errors.) -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- class: extra-details @@ -6754,7 +6801,7 @@ $ docker run --rm --net prod centos curl -s es:9200 ``` ] -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## Good to know ... @@ -6775,7 +6822,7 @@ $ docker run --rm --net prod centos curl -s es:9200 * Creation of networks and network aliases is generally automated with tools like Compose. -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- class: extra-details @@ -6794,7 +6841,7 @@ Many factors can affect DNS resolution, and you might see: It's OK to use DNS to discover available endpoints, but remember that you have to re-resolve every now and then to discover new endpoints. -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- class: extra-details @@ -6813,7 +6860,7 @@ When creating a network, extra options can be provided. * `--aux-address` allows specifying a list of reserved addresses (which won't be allocated to containers). -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- class: extra-details @@ -6836,7 +6883,7 @@ b2887adeb5578a01fd9c55c435cad56bbbe802350711d2743691f95743680b09 *I repeat: don't hard code container IP addresses in your code!* -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## Network drivers @@ -6855,7 +6902,7 @@ b2887adeb5578a01fd9c55c435cad56bbbe802350711d2743691f95743680b09 * A network can have a custom IPAM (IP allocator). -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## Overlay networks @@ -6872,7 +6919,7 @@ b2887adeb5578a01fd9c55c435cad56bbbe802350711d2743691f95743680b09 * Once you have an overlay network, *all the features that we've used in this chapter work identically across multiple hosts.* -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- class: extra-details @@ -6891,7 +6938,7 @@ If you want to learn more about Swarm mode, you can check [this video](https://www.youtube.com/watch?v=EuzoEaE6Cqs) or [these slides](https://container.training/swarm-selfpaced.yml.html). -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- class: extra-details @@ -6910,7 +6957,7 @@ General idea: - you can then `docker network create --driver pluginname` -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## Connecting and disconnecting dynamically @@ -6925,7 +6972,7 @@ General idea: * `docker network disconnect ` -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## Dynamically connecting to a network @@ -6948,7 +6995,7 @@ General idea: This doesn't work, but we will change that by connecting the container. -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## Finding the container ID and connecting it @@ -6965,7 +7012,7 @@ General idea: $ docker network connect dev `` ``` -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## Checking what we did @@ -6984,7 +7031,7 @@ General idea: * Interrupt it with Ctrl-C. -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## Looking at the network setup in the container @@ -7014,7 +7061,7 @@ Each network connection is materialized with a virtual network interface. As we can see, we can be connected to multiple networks at the same time. -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- ## Disconnecting from a network @@ -7036,7 +7083,7 @@ As we can see, we can be connected to multiple networks at the same time. ... (nothing happens until we interrupt it with Ctrl-C) ``` -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- class: extra-details @@ -7056,7 +7103,7 @@ class: extra-details * However, we can lookup `es.dev` or `es.prod` if we need to. -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- class: extra-details @@ -7092,7 +7139,7 @@ eth0 Link encap:Ethernet HWaddr 02:42:AC:15:00:03 ``` ] -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- class: extra-details @@ -7122,12 +7169,12 @@ class: extra-details :FR:- Isolation des conteneurs :FR:- *Service discovery* -.debug[[containers/Container_Network_Model.md](""/tree/main/slides/containers/Container_Network_Model.md)] +.debug[[containers/Container_Network_Model.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Network_Model.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/lots-of-containers.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/plastic-containers.JPG)] --- @@ -7139,7 +7186,7 @@ class: title .nav[ [Previous part](#toc-service-discovery-with-containers) | -[Back to table of contents](#toc-part-6) +[Back to table of contents](#toc-part-7) | [Next part](#toc-working-with-volumes) ] @@ -7154,7 +7201,7 @@ class: title ![Construction site](images/title-local-development-workflow-with-docker.jpg) -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- ## Objectives @@ -7165,7 +7212,7 @@ At the end of this section, you will be able to: * Use a simple local development workflow. -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- ## Local development in a container @@ -7180,7 +7227,7 @@ We want to solve the following issues: By using Docker containers, we will get a consistent development environment. -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- ## Working on the "namer" application @@ -7197,7 +7244,7 @@ By using Docker containers, we will get a consistent development environment. $ git clone https://github.com/jpetazzo/namer ``` -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- ## Looking at the code @@ -7216,7 +7263,7 @@ Gemfile Aha, a `Gemfile`! This is Ruby. Probably. We know this. Maybe? -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- ## Looking at the `Dockerfile` @@ -7238,7 +7285,7 @@ EXPOSE 9292 * The application is started with `rackup`. * It is listening on port 9292. -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- ## Building and running the "namer" application @@ -7271,7 +7318,7 @@ $ docker run -dP namer $ docker ps -l ``` -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- ## Connecting to our application @@ -7292,7 +7339,7 @@ $ docker ps -l ![web application 1](images/webapp-in-blue.png) -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- ## Making changes to the code @@ -7315,7 +7362,7 @@ Option 3: * Make changes locally * Changes are reflected in the container -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- ## Our first volume @@ -7338,7 +7385,7 @@ $ docker run -d -v $(pwd):/src -P namer Note: on Windows, replace `$(pwd)` with `%cd%` (or `${pwd}` if you use PowerShell). -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- ## Mounting volumes inside containers @@ -7358,7 +7405,7 @@ The flag structure is: * If you don't specify `rw` or `ro`, it will be `rw` by default. -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- class: extra-details @@ -7382,7 +7429,7 @@ With the new syntax, our command becomes: docker run --mount=type=bind,source=$(pwd),target=/src -dP namer ``` -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- ## Testing the development container @@ -7397,7 +7444,7 @@ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAM * Open the application in your web browser. -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- ## Making a change to our application @@ -7420,7 +7467,7 @@ To: color: red; ``` -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- ## Viewing our changes @@ -7433,7 +7480,7 @@ color: red; ![web application 2](images/webapp-in-red.png) -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- ## Understanding volumes @@ -7456,7 +7503,7 @@ color: red;
(a bit like a network filesystem) -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- class: extra-details @@ -7477,7 +7524,7 @@ class: extra-details (due to e.g. file attribute caching, and other interesting details!) -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- ## Trash your servers and burn your code @@ -7507,7 +7554,7 @@ by Chad Fowler, where he explains the concept of immutable infrastructure.)* * Point our browser to it to confirm that it still works fine. -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- ## Immutable infrastructure in a nutshell @@ -7525,7 +7572,7 @@ by Chad Fowler, where he explains the concept of immutable infrastructure.)* If this pattern sounds interesting, you might want to read about *blue/green deployment* and *canary deployments*. -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- ## Recap of the development workflow @@ -7551,7 +7598,7 @@ and *canary deployments*. 6. When done, commit+push source code changes. -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- class: extra-details @@ -7566,7 +7613,7 @@ If sometimes you find yourself wishing you could SSH into a container: you can u You can get a shell prompt inside an existing container this way, or run an arbitrary process for automation. -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- class: extra-details @@ -7582,7 +7629,7 @@ irb(main):001:0> [0, 1, 2, 3, 4].map {|x| x ** 2}.compact irb(main):002:0> exit ``` -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- class: extra-details @@ -7601,7 +7648,7 @@ And remove it. $ docker rm ``` -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- ## Section summary @@ -7622,12 +7669,12 @@ We've learned how to: :FR:DΓ©velopper au jour le jour :FR:- Β« Containeriser Β» son environnement de dΓ©veloppement -.debug[[containers/Local_Development_Workflow.md](""/tree/main/slides/containers/Local_Development_Workflow.md)] +.debug[[containers/Local_Development_Workflow.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Local_Development_Workflow.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/plastic-containers.JPG)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/train-of-containers-1.jpg)] --- @@ -7639,7 +7686,7 @@ class: title .nav[ [Previous part](#toc-local-development-workflow-with-docker) | -[Back to table of contents](#toc-part-6) +[Back to table of contents](#toc-part-7) | [Next part](#toc-compose-for-development-stacks) ] @@ -7654,7 +7701,7 @@ class: title ![volume](images/title-working-with-volumes.jpg) -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- ## Objectives @@ -7667,7 +7714,7 @@ At the end of this section, you will be able to: * Share a host directory with one or many containers. -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- ## Working with volumes @@ -7686,7 +7733,7 @@ Docker volumes can be used to achieve many things, including: * Using remote storage and custom storage with *volume drivers*. -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- ## Volumes are special directories in a container @@ -7707,7 +7754,7 @@ $ docker run -d -v /uploads myapp In both cases, `/uploads` (inside the container) will be a volume. -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- class: extra-details @@ -7728,7 +7775,7 @@ Volumes act as passthroughs to the host filesystem. * If a container is started with the `--read-only` flag, the volume will still be writable (unless the volume is a read-only volume). -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- class: extra-details @@ -7747,7 +7794,7 @@ This is done using the `--volumes-from` flag for `docker run`. We will see an example in the following slides. -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- class: extra-details @@ -7771,7 +7818,7 @@ Then, from another window, send requests to our Tomcat container: $ curl localhost:8080 ``` -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- ## Volumes exist independently of containers @@ -7793,7 +7840,7 @@ Some of those volume names were explicit (pgdata-prod, pgdata-dev). The others (the hex IDs) were generated automatically by Docker. -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- ## Naming volumes @@ -7814,7 +7861,7 @@ logs Volumes are not anchored to a specific path. -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- ## Populating volumes @@ -7833,7 +7880,7 @@ $ docker run -v webapps:/usr/local/tomcat/webapps.dist tomcat true Note: running `true` will cause the container to exit successfully once the `webapps.dist` directory has been copied to the `webapps` volume, instead of starting tomcat. -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- ## Using our named volumes @@ -7858,7 +7905,7 @@ $ curl localhost:1234 ... (Tomcat tells us how happy it is to be up and running) ... ``` -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- ## Using a volume in another container @@ -7879,7 +7926,7 @@ Vandalize the page, save, exit. Then run `curl localhost:1234` again to see your changes. -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- ## Using custom "bind-mounts" @@ -7904,7 +7951,7 @@ Nice. $ docker run -d -v /path/on/the/host:/path/in/container image ... ``` -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- class: extra-details @@ -7928,7 +7975,7 @@ of an existing container. * Doesn't work across servers, so not usable in clusters (Swarm, Kubernetes). -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- class: extra-details @@ -7956,7 +8003,7 @@ SAVE QUIT ``` -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- class: extra-details @@ -7975,7 +8022,7 @@ Start the new Redis container. $ docker run -d --name redis30 --volumes-from redis28 redis:3.0 ``` -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- class: extra-details @@ -7996,7 +8043,7 @@ INFO server QUIT ``` -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- ## Volumes lifecycle @@ -8012,7 +8059,7 @@ QUIT Ultimately, _you_ are the one responsible for logging, monitoring, and backup of your volumes. -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- class: extra-details @@ -8033,7 +8080,7 @@ $ # docker inspect training/datavol }] ``` -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- class: extra-details @@ -8059,7 +8106,7 @@ $ docker inspect * We can see that our volume is present on the file system of the Docker host. -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- ## Sharing a single file @@ -8078,7 +8125,7 @@ the Docker Engine running on the host. Try `docker ps`! .warning[Since that container has access to the Docker socket, it has root-like access to the host.] -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- ## Volume plugins @@ -8096,7 +8143,7 @@ or providing extra features. For instance: * and much more at the [Docker Store](https://store.docker.com/search?category=volume&q=&type=plugin)! -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- ## Volumes vs. Mounts @@ -8113,7 +8160,7 @@ or providing extra features. For instance: * The former `-v` / `--volume` option is still usable. -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- ## `--mount` syntax @@ -8139,7 +8186,7 @@ $ docker run \ --mount type=tmpfs,destination=/path/in/container,tmpfs-size=1000000 alpine ``` -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- ## Section summary @@ -8152,12 +8199,12 @@ We've learned how to: * Share a host directory with one or many containers. -.debug[[containers/Working_With_Volumes.md](""/tree/main/slides/containers/Working_With_Volumes.md)] +.debug[[containers/Working_With_Volumes.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Working_With_Volumes.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/train-of-containers-1.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/train-of-containers-2.jpg)] --- @@ -8169,7 +8216,7 @@ class: title .nav[ [Previous part](#toc-working-with-volumes) | -[Back to table of contents](#toc-part-6) +[Back to table of contents](#toc-part-7) | [Next part](#toc-exercise--writing-a-compose-file) ] @@ -8189,7 +8236,7 @@ How do we connect them all together? ... Compose solves these use-cases (and a few more). -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Life before Compose @@ -8204,7 +8251,7 @@ Before we had Compose, we would typically write custom scripts to: - rebuild, restart, update these images and containers. -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Life with Compose @@ -8217,14 +8264,14 @@ Compose enables a simple, powerful onboarding workflow: 3. Our app is up and running! -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- class: pic ![composeup](images/composeup.gif) -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Life after Compose @@ -8243,7 +8290,7 @@ class: pic - it needs a Docker Engine (although containerd support might be coming) -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## First rodeo with Compose @@ -8264,7 +8311,7 @@ class: pic (if running in the background, use `docker-compose stop`) -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Iterating @@ -8285,7 +8332,7 @@ When working with interpreted languages: - leverage a `volumes` section instead -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Launching Our First Stack with Compose @@ -8307,7 +8354,7 @@ Watch Compose build and run the app. That Compose stack exposes a web server on port 8000; try connecting to it. -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Launching Our First Stack with Compose @@ -8318,7 +8365,7 @@ We should see a web page like this: Each time we reload, the counter should increase. -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Stopping the app @@ -8327,7 +8374,7 @@ When we hit Ctrl-C, Compose tries to gracefully terminate all of the containers. After ten seconds (or if we press `^C` again) it will forcibly kill them. -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## The `docker-compose.yml` file @@ -8355,7 +8402,7 @@ services: ``` ] -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Compose file structure @@ -8371,7 +8418,7 @@ A Compose file has multiple sections: * `volumes` is optional and can define volumes to be used and/or shared by the containers. -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Compose file versions @@ -8389,7 +8436,7 @@ A Compose file has multiple sections: The [Docker documentation](https://docs.docker.com/compose/compose-file/) has excellent information about the Compose file format if you need to know more about versions. -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Containers in `docker-compose.yml` @@ -8408,7 +8455,7 @@ They encode the parameters that you would typically add to `docker run`. Sometimes they have several minor improvements. -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Container parameters @@ -8423,7 +8470,7 @@ Sometimes they have several minor improvements. For the full list, check: https://docs.docker.com/compose/compose-file/ -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Environment variables @@ -8442,7 +8489,7 @@ For the full list, check: https://docs.docker.com/compose/compose-file/ (base image versions to use, build and run secrets, port numbers...) -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Configuring a Compose stack @@ -8461,7 +8508,7 @@ For the full list, check: https://docs.docker.com/compose/compose-file/ [12factorconfig]: https://12factor.net/config -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Running multiple copies of a stack @@ -8480,7 +8527,7 @@ For the full list, check: https://docs.docker.com/compose/compose-file/ - Each copy is isolated from the others (runs on a different network) -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Checking stack status @@ -8499,7 +8546,7 @@ Shows the status of all the containers of our stack. Doesn't show the other containers. -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Cleaning up (1) @@ -8521,7 +8568,7 @@ Removing trainingwheels_redis_1... Removing trainingwheels_www_1... ``` -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Cleaning up (2) @@ -8540,7 +8587,7 @@ Removing trainingwheels_redis_1 ... done Use `docker-compose down -v` to remove everything including volumes. -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Special handling of volumes @@ -8559,7 +8606,7 @@ Use `docker-compose down -v` to remove everything including volumes. (e.g. all official images) -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Gotchas with volumes @@ -8580,7 +8627,7 @@ Use `docker-compose down -v` to remove everything including volumes. (but **not** `docker-compose down && docker-compose down -v`!) -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Managing volumes explicitly @@ -8602,7 +8649,7 @@ volumes: - It will correctly be removed with `docker-compose down -v` -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Managing volumes explicitly @@ -8622,7 +8669,7 @@ services: - Won't be removed by `docker-compose down -v` -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Managing complex stacks @@ -8645,7 +8692,7 @@ services: [profiles]: https://docs.docker.com/compose/profiles/ -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- ## Dependencies @@ -8660,7 +8707,7 @@ services: ⚠️ It doesn't make a service "wait" for another one to be up! -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- class: extra-details @@ -8689,12 +8736,12 @@ class: extra-details :FR:- Utiliser Compose pour dΓ©crire son environnement :FR:- Γ‰crire un *Compose file* pour connecter les services entre eux -.debug[[containers/Compose_For_Dev_Stacks.md](""/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] +.debug[[containers/Compose_For_Dev_Stacks.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Compose_For_Dev_Stacks.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/train-of-containers-2.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/two-containers-on-a-truck.jpg)] --- @@ -8706,7 +8753,7 @@ class: title .nav[ [Previous part](#toc-compose-for-development-stacks) | -[Back to table of contents](#toc-part-6) +[Back to table of contents](#toc-part-7) | [Next part](#toc-installing-docker) ] @@ -8720,12 +8767,12 @@ Let's write a Compose file for the wordsmith app! The code is at: https://github.com/jpetazzo/wordsmith -.debug[[containers/Exercise_Composefile.md](""/tree/main/slides/containers/Exercise_Composefile.md)] +.debug[[containers/Exercise_Composefile.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Exercise_Composefile.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/two-containers-on-a-truck.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/wall-of-containers.jpeg)] --- @@ -8737,7 +8784,7 @@ class: title .nav[ [Previous part](#toc-exercise--writing-a-compose-file) | -[Back to table of contents](#toc-part-7) +[Back to table of contents](#toc-part-8) | [Next part](#toc-docker-engine-and-other-container-engines) ] @@ -8752,7 +8799,7 @@ class: title ![install](images/title-installing-docker.jpg) -.debug[[containers/Installing_Docker.md](""/tree/main/slides/containers/Installing_Docker.md)] +.debug[[containers/Installing_Docker.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Installing_Docker.md)] --- ## Objectives @@ -8768,7 +8815,7 @@ tutorial, you can skip this chapter, since that VM already has Docker installed, and Docker has already been setup to run without `sudo`. -.debug[[containers/Installing_Docker.md](""/tree/main/slides/containers/Installing_Docker.md)] +.debug[[containers/Installing_Docker.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Installing_Docker.md)] --- ## Installing Docker @@ -8783,7 +8830,7 @@ We can arbitrarily distinguish: * Installing Docker on a fleet of cloud VMs -.debug[[containers/Installing_Docker.md](""/tree/main/slides/containers/Installing_Docker.md)] +.debug[[containers/Installing_Docker.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Installing_Docker.md)] --- ## Installing Docker on Linux @@ -8808,7 +8855,7 @@ We can arbitrarily distinguish: curl -fsSL get.docker.com | sh ``` -.debug[[containers/Installing_Docker.md](""/tree/main/slides/containers/Installing_Docker.md)] +.debug[[containers/Installing_Docker.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Installing_Docker.md)] --- class: extra-details @@ -8831,7 +8878,7 @@ class: extra-details … but it is generally worth it! -.debug[[containers/Installing_Docker.md](""/tree/main/slides/containers/Installing_Docker.md)] +.debug[[containers/Installing_Docker.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Installing_Docker.md)] --- ## Installing Docker on macOS and Windows @@ -8852,7 +8899,7 @@ class: extra-details https://docs.docker.com/install/windows/docker-ee/ -.debug[[containers/Installing_Docker.md](""/tree/main/slides/containers/Installing_Docker.md)] +.debug[[containers/Installing_Docker.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Installing_Docker.md)] --- ## Docker Desktop @@ -8869,7 +8916,7 @@ class: extra-details ... but we can use `docker-machine`, the Docker Toolbox, VirtualBox, etc. to get a cluster. -.debug[[containers/Installing_Docker.md](""/tree/main/slides/containers/Installing_Docker.md)] +.debug[[containers/Installing_Docker.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Installing_Docker.md)] --- class: extra-details @@ -8892,7 +8939,7 @@ class: extra-details (we'll talk about this later) -.debug[[containers/Installing_Docker.md](""/tree/main/slides/containers/Installing_Docker.md)] +.debug[[containers/Installing_Docker.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Installing_Docker.md)] --- ## Running Docker on macOS and Windows @@ -8910,7 +8957,7 @@ All communication with the Docker Engine happens over the API. This will also allow to use remote Engines exactly as if they were local. -.debug[[containers/Installing_Docker.md](""/tree/main/slides/containers/Installing_Docker.md)] +.debug[[containers/Installing_Docker.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Installing_Docker.md)] --- ## Important PSA about security @@ -8933,12 +8980,12 @@ This will also allow to use remote Engines exactly as if they were local. sudo docker version ``` -.debug[[containers/Installing_Docker.md](""/tree/main/slides/containers/Installing_Docker.md)] +.debug[[containers/Installing_Docker.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Installing_Docker.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/wall-of-containers.jpeg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/catene-de-conteneurs.jpg)] --- @@ -8950,7 +8997,7 @@ class: title .nav[ [Previous part](#toc-installing-docker) | -[Back to table of contents](#toc-part-7) +[Back to table of contents](#toc-part-8) | [Next part](#toc-init-systems-and-pid-) ] @@ -8964,7 +9011,7 @@ class: title * We will also present other container engines. -.debug[[containers/Container_Engines.md](""/tree/main/slides/containers/Container_Engines.md)] +.debug[[containers/Container_Engines.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Engines.md)] --- class: pic @@ -8973,7 +9020,7 @@ class: pic ![](images/docker-engine-architecture.svg) -.debug[[containers/Container_Engines.md](""/tree/main/slides/containers/Container_Engines.md)] +.debug[[containers/Container_Engines.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Engines.md)] --- ## Docker Engine external architecture @@ -8993,7 +9040,7 @@ Note: strictly speaking, the Docker API is not fully REST. Some operations (e.g. dealing with interactive containers and log streaming) don't fit the REST model. -.debug[[containers/Container_Engines.md](""/tree/main/slides/containers/Container_Engines.md)] +.debug[[containers/Container_Engines.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Engines.md)] --- class: pic @@ -9002,7 +9049,7 @@ class: pic ![](images/dockerd-and-containerd.png) -.debug[[containers/Container_Engines.md](""/tree/main/slides/containers/Container_Engines.md)] +.debug[[containers/Container_Engines.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Engines.md)] --- ## Docker Engine internal architecture @@ -9023,7 +9070,7 @@ class: pic For more details, check [this short presentation by Phil Estes](https://www.slideshare.net/PhilEstes/diving-through-the-layers-investigating-runc-containerd-and-the-docker-engine-architecture). -.debug[[containers/Container_Engines.md](""/tree/main/slides/containers/Container_Engines.md)] +.debug[[containers/Container_Engines.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Engines.md)] --- ## Other container engines @@ -9035,7 +9082,7 @@ Furthermore, we limited the scope to Linux containers. We can also find containers (or things that look like containers) on other platforms like Windows, macOS, Solaris, FreeBSD ... -.debug[[containers/Container_Engines.md](""/tree/main/slides/containers/Container_Engines.md)] +.debug[[containers/Container_Engines.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Engines.md)] --- ## LXC @@ -9054,7 +9101,7 @@ like Windows, macOS, Solaris, FreeBSD ... * Networking has to be set up manually. -.debug[[containers/Container_Engines.md](""/tree/main/slides/containers/Container_Engines.md)] +.debug[[containers/Container_Engines.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Engines.md)] --- ## LXD @@ -9069,7 +9116,7 @@ like Windows, macOS, Solaris, FreeBSD ... * "offers a user experience similar to virtual machines but using Linux containers instead." -.debug[[containers/Container_Engines.md](""/tree/main/slides/containers/Container_Engines.md)] +.debug[[containers/Container_Engines.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Engines.md)] --- ## CRI-O @@ -9088,7 +9135,7 @@ like Windows, macOS, Solaris, FreeBSD ... We're not aware of anyone using it directly (i.e. outside of Kubernetes). -.debug[[containers/Container_Engines.md](""/tree/main/slides/containers/Container_Engines.md)] +.debug[[containers/Container_Engines.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Engines.md)] --- ## systemd @@ -9107,7 +9154,7 @@ We're not aware of anyone using it directly (i.e. outside of Kubernetes). * Network has to be set up manually. -.debug[[containers/Container_Engines.md](""/tree/main/slides/containers/Container_Engines.md)] +.debug[[containers/Container_Engines.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Engines.md)] --- ## Kata containers @@ -9120,7 +9167,7 @@ We're not aware of anyone using it directly (i.e. outside of Kubernetes). * Requires running on bare metal *or* with nested virtualization. -.debug[[containers/Container_Engines.md](""/tree/main/slides/containers/Container_Engines.md)] +.debug[[containers/Container_Engines.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Engines.md)] --- ## gVisor @@ -9139,7 +9186,7 @@ We're not aware of anyone using it directly (i.e. outside of Kubernetes). * ptrace (no requirement, but slower). -.debug[[containers/Container_Engines.md](""/tree/main/slides/containers/Container_Engines.md)] +.debug[[containers/Container_Engines.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Engines.md)] --- ## Overall ... @@ -9162,12 +9209,12 @@ We're not aware of anyone using it directly (i.e. outside of Kubernetes). - If you use Kubernetes, the engine doesn't matter -.debug[[containers/Container_Engines.md](""/tree/main/slides/containers/Container_Engines.md)] +.debug[[containers/Container_Engines.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Container_Engines.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/catene-de-conteneurs.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/Container-Ship-Freighter-Navigation-Elbe-Romance-1782991.jpg)] --- @@ -9179,7 +9226,7 @@ class: title .nav[ [Previous part](#toc-docker-engine-and-other-container-engines) | -[Back to table of contents](#toc-part-7) +[Back to table of contents](#toc-part-8) | [Next part](#toc-advanced-dockerfile-syntax) ] @@ -9195,7 +9242,7 @@ In this chapter, we will consider: - how to avoid some common pitfalls due to the misuse of init systems. -.debug[[containers/Init_Systems.md](""/tree/main/slides/containers/Init_Systems.md)] +.debug[[containers/Init_Systems.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Init_Systems.md)] --- ## What's an init system? @@ -9210,7 +9257,7 @@ In this chapter, we will consider: - reap orphaned zombie processes. -.debug[[containers/Init_Systems.md](""/tree/main/slides/containers/Init_Systems.md)] +.debug[[containers/Init_Systems.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Init_Systems.md)] --- class: extra-details @@ -9231,7 +9278,7 @@ class: extra-details - Init therefore needs to take care of these orphaned processes when they exit. -.debug[[containers/Init_Systems.md](""/tree/main/slides/containers/Init_Systems.md)] +.debug[[containers/Init_Systems.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Init_Systems.md)] --- ## Don't use init systems in containers @@ -9254,7 +9301,7 @@ class: extra-details - Overall, they make it harder to operate troubleshoot containerized apps. -.debug[[containers/Init_Systems.md](""/tree/main/slides/containers/Init_Systems.md)] +.debug[[containers/Init_Systems.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Init_Systems.md)] --- ## Exceptions and workarounds @@ -9273,7 +9320,7 @@ class: extra-details - a pod can have multiple containers. -.debug[[containers/Init_Systems.md](""/tree/main/slides/containers/Init_Systems.md)] +.debug[[containers/Init_Systems.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Init_Systems.md)] --- ## What about these zombie processes? @@ -9290,7 +9337,7 @@ class: extra-details - How can we solve this? -.debug[[containers/Init_Systems.md](""/tree/main/slides/containers/Init_Systems.md)] +.debug[[containers/Init_Systems.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Init_Systems.md)] --- ## Tini to the rescue @@ -9311,7 +9358,7 @@ class: extra-details - We should use it if our application creates subprocess but doesn't reap them. -.debug[[containers/Init_Systems.md](""/tree/main/slides/containers/Init_Systems.md)] +.debug[[containers/Init_Systems.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Init_Systems.md)] --- class: extra-details @@ -9332,12 +9379,12 @@ class: extra-details ... you might have to add `tini` explicitly to your Docker image. -.debug[[containers/Init_Systems.md](""/tree/main/slides/containers/Init_Systems.md)] +.debug[[containers/Init_Systems.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Init_Systems.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/Container-Ship-Freighter-Navigation-Elbe-Romance-1782991.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/ShippingContainerSFBay.jpg)] --- @@ -9349,7 +9396,7 @@ class: title .nav[ [Previous part](#toc-init-systems-and-pid-) | -[Back to table of contents](#toc-part-7) +[Back to table of contents](#toc-part-8) | [Next part](#toc-buildkit) ] @@ -9364,7 +9411,7 @@ class: title ![construction](images/title-advanced-dockerfiles.jpg) -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- ## Objectives @@ -9377,7 +9424,7 @@ and introduce advanced Dockerfile commands that we might come across sometimes; or that we might want to use in some specific scenarios. -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- ## `Dockerfile` usage summary @@ -9399,7 +9446,7 @@ specific scenarios. (As a result, each call to these instructions makes the previous one useless.) -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- ## The `RUN` instruction @@ -9420,7 +9467,7 @@ allows execution in images that don't have `/bin/sh`: RUN [ "apt-get", "update" ] ``` -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- ## More about the `RUN` instruction @@ -9439,7 +9486,7 @@ RUN [ "apt-get", "update" ] If you want to start something automatically when the container runs, you should use `CMD` and/or `ENTRYPOINT`. -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- ## Collapsing layers @@ -9458,7 +9505,7 @@ RUN apt-get update \ && apt-get clean ``` -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- ## The `EXPOSE` instruction @@ -9478,7 +9525,7 @@ EXPOSE 53/tcp 53/udp * The `Dockerfile` doesn't control on which port a service gets exposed. -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- ## Exposing ports @@ -9494,7 +9541,7 @@ A *public port* is reachable from other containers and from outside the host. A *private port* is not reachable from outside. -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- ## The `COPY` instruction @@ -9510,7 +9557,7 @@ This will add the contents of the *build context* (the directory passed as an argument to `docker build`) to the directory `/src` in the container. -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- ## Build context isolation @@ -9529,7 +9576,7 @@ detected and blocked with Docker, and the build will fail. Otherwise, a `Dockerfile` could succeed on host A, but fail on host B. -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- ## `ADD` @@ -9555,7 +9602,7 @@ This would unpack `assets.zip` into `/var/www/htdocs/assets`. *However,* `ADD` will not automatically unpack remote archives. -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- ## `ADD`, `COPY`, and the build cache @@ -9574,7 +9621,7 @@ This would unpack `assets.zip` into `/var/www/htdocs/assets`. (It cannot use, e.g., ETags or If-Modified-Since headers.) -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- ## `VOLUME` @@ -9597,7 +9644,7 @@ It is possible to start a container in "read-only" mode. The container filesystem will be made read-only, but volumes can still have read/write access if necessary. -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- ## The `WORKDIR` instruction @@ -9615,7 +9662,7 @@ WORKDIR /src You can specify `WORKDIR` again to change the working directory for further operations. -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- ## The `ENV` instruction @@ -9640,7 +9687,7 @@ You can also specify environment variables when you use `docker run`. $ docker run -e WEBAPP_PORT=8000 -e WEBAPP_HOST=www.example.com ... ``` -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- ## The `USER` instruction @@ -9650,7 +9697,7 @@ the image. It can be used multiple times to change back to root or to another user. -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- ## The `CMD` instruction @@ -9677,7 +9724,7 @@ We can just do: $ docker run /web_image ``` -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- ## More about the `CMD` instruction @@ -9695,7 +9742,7 @@ The second executes directly, without shell processing: CMD [ "nginx", "-g", "daemon off;" ] ``` -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- class: extra-details @@ -9710,7 +9757,7 @@ $ docker run -it /web_image bash Will run `bash` instead of `nginx -g "daemon off;"`. -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- ## The `ENTRYPOINT` instruction @@ -9733,7 +9780,7 @@ $ docker run training/ls -l Instead of trying to run `-l`, the container will run `/bin/ls -l`. -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- class: extra-details @@ -9750,7 +9797,7 @@ $ docker run -it --entrypoint bash training/ls root@d902fb7b1fc7:/# ``` -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- ## How `CMD` and `ENTRYPOINT` interact @@ -9773,7 +9820,7 @@ $ docker run -d /web_image -t This will override the options `CMD` provided with new flags. -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- ## Advanced Dockerfile instructions @@ -9786,7 +9833,7 @@ This will override the options `CMD` provided with new flags. * `HEALTHCHECK` defines a command assessing the status of the container. * `SHELL` sets the default program to use for string-syntax RUN, CMD, etc. -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- class: extra-details @@ -9811,12 +9858,12 @@ ONBUILD COPY . /src :EN:- Advanced Dockerfile syntax :FR:- Dockerfile niveau expert -.debug[[containers/Advanced_Dockerfiles.md](""/tree/main/slides/containers/Advanced_Dockerfiles.md)] +.debug[[containers/Advanced_Dockerfiles.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Advanced_Dockerfiles.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/ShippingContainerSFBay.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/aerial-view-of-containers.jpg)] --- @@ -9828,7 +9875,7 @@ class: title .nav[ [Previous part](#toc-advanced-dockerfile-syntax) | -[Back to table of contents](#toc-part-7) +[Back to table of contents](#toc-part-8) | [Next part](#toc-application-configuration) ] @@ -9854,7 +9901,7 @@ class: title - Not just for building container images -.debug[[containers/Buildkit.md](""/tree/main/slides/containers/Buildkit.md)] +.debug[[containers/Buildkit.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Buildkit.md)] --- ## Old vs New @@ -9873,7 +9920,7 @@ class: title - doesn't rely on Docker, but on internal runner/snapshotter - can run in "normal" containers (including in Kubernetes pods) -.debug[[containers/Buildkit.md](""/tree/main/slides/containers/Buildkit.md)] +.debug[[containers/Buildkit.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Buildkit.md)] --- ## Parallel execution @@ -9893,7 +9940,7 @@ class: title [before]: https://github.com/jpetazzo/shpod/blob/c6efedad6d6c3dc3120dbc0ae0a6915f85862474/Dockerfile [after]: https://github.com/jpetazzo/shpod/blob/d20887bbd56b5fcae2d5d9b0ce06cae8887caabf/Dockerfile -.debug[[containers/Buildkit.md](""/tree/main/slides/containers/Buildkit.md)] +.debug[[containers/Buildkit.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Buildkit.md)] --- ## Turning it on and off @@ -9910,7 +9957,7 @@ class: title `export DOCKER_BUILDKIT=0` -.debug[[containers/Buildkit.md](""/tree/main/slides/containers/Buildkit.md)] +.debug[[containers/Buildkit.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Buildkit.md)] --- ## Multi-arch support @@ -9933,7 +9980,7 @@ class: title [manifest]: https://docs.docker.com/registry/spec/manifest-v2-2/ -.debug[[containers/Buildkit.md](""/tree/main/slides/containers/Buildkit.md)] +.debug[[containers/Buildkit.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Buildkit.md)] --- ## Why? @@ -9950,7 +9997,7 @@ class: title - ... -.debug[[containers/Buildkit.md](""/tree/main/slides/containers/Buildkit.md)] +.debug[[containers/Buildkit.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Buildkit.md)] --- ## Multi-arch builds in a nutshell @@ -9972,7 +10019,7 @@ docker buildx build … \ [before]: https://github.com/jpetazzo/shpod/blob/d20887bbd56b5fcae2d5d9b0ce06cae8887caabf/Dockerfile [after]: https://github.com/jpetazzo/shpod/blob/c50789e662417b34fea6f5e1d893721d66d265b7/Dockerfile -.debug[[containers/Buildkit.md](""/tree/main/slides/containers/Buildkit.md)] +.debug[[containers/Buildkit.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Buildkit.md)] --- ## Native vs emulated vs cross @@ -9989,7 +10036,7 @@ docker buildx build … \ *x86_64 machine running x86_64 programs building aarch64 images/binaries* -.debug[[containers/Buildkit.md](""/tree/main/slides/containers/Buildkit.md)] +.debug[[containers/Buildkit.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Buildkit.md)] --- ## Native @@ -10004,7 +10051,7 @@ docker buildx build … \ - Requires setting up a build farm -.debug[[containers/Buildkit.md](""/tree/main/slides/containers/Buildkit.md)] +.debug[[containers/Buildkit.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Buildkit.md)] --- ## Emulated @@ -10023,7 +10070,7 @@ docker buildx build … \ - Supports arbitrary architectures thanks to QEMU -.debug[[containers/Buildkit.md](""/tree/main/slides/containers/Buildkit.md)] +.debug[[containers/Buildkit.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Buildkit.md)] --- ## Cross @@ -10036,7 +10083,7 @@ docker buildx build … \ - Doesn't require special machines -.debug[[containers/Buildkit.md](""/tree/main/slides/containers/Buildkit.md)] +.debug[[containers/Buildkit.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Buildkit.md)] --- ## Native builds @@ -10055,7 +10102,7 @@ docker buildx build … \ https://releases.hashicorp.com/terraform/1.1.5/terraform_1.1.5_linux_`amd64`.zip ``` -.debug[[containers/Buildkit.md](""/tree/main/slides/containers/Buildkit.md)] +.debug[[containers/Buildkit.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Buildkit.md)] --- ## Finding the right architecture @@ -10070,7 +10117,7 @@ In Dockerfile, add `ARG TARGETARCH` (or `ARG TARGETPLATFORM`) - `TARGETPLAFORM` β†’ linux/arm/v7, linux/arm64, linux/386, linux/amd64 -.debug[[containers/Buildkit.md](""/tree/main/slides/containers/Buildkit.md)] +.debug[[containers/Buildkit.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Buildkit.md)] --- class: extra-details @@ -10088,7 +10135,7 @@ Linux_x86_64.tar.gz This needs a bit of custom mapping. -.debug[[containers/Buildkit.md](""/tree/main/slides/containers/Buildkit.md)] +.debug[[containers/Buildkit.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Buildkit.md)] --- ## Emulation @@ -10110,7 +10157,7 @@ This needs a bit of custom mapping. ls -l /proc/sys/fs/binfmt_misc ``` -.debug[[containers/Buildkit.md](""/tree/main/slides/containers/Buildkit.md)] +.debug[[containers/Buildkit.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Buildkit.md)] --- class: extra-details @@ -10137,7 +10184,7 @@ class: extra-details [QEMU]: https://www.qemu.org/ [wine]: https://www.winehq.org/ -.debug[[containers/Buildkit.md](""/tree/main/slides/containers/Buildkit.md)] +.debug[[containers/Buildkit.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Buildkit.md)] --- class: extra-details @@ -10154,7 +10201,7 @@ class: extra-details - https://dbhi.github.io/qus/ -.debug[[containers/Buildkit.md](""/tree/main/slides/containers/Buildkit.md)] +.debug[[containers/Buildkit.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Buildkit.md)] --- ## Cross-compilation @@ -10178,7 +10225,7 @@ class: extra-details [xx]: https://github.com/tonistiigi/xx [toni]: https://medium.com/@tonistiigi/faster-multi-platform-builds-dockerfile-cross-compilation-guide-part-1-ec087c719eaf -.debug[[containers/Buildkit.md](""/tree/main/slides/containers/Buildkit.md)] +.debug[[containers/Buildkit.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Buildkit.md)] --- ## Checking runtime capabilities @@ -10202,7 +10249,7 @@ CMD for A in *; do echo "$A => $($A/busybox uname -a)"; done It will indicate which executables can be run on your engine. -.debug[[containers/Buildkit.md](""/tree/main/slides/containers/Buildkit.md)] +.debug[[containers/Buildkit.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Buildkit.md)] --- ## More than builds @@ -10218,12 +10265,12 @@ It will indicate which executables can be run on your engine. [Earthly]: https://earthly.dev/ [Dagger]: https://dagger.io/ -.debug[[containers/Buildkit.md](""/tree/main/slides/containers/Buildkit.md)] +.debug[[containers/Buildkit.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Buildkit.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/aerial-view-of-containers.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/blue-containers.jpg)] --- @@ -10235,7 +10282,7 @@ class: title .nav[ [Previous part](#toc-buildkit) | -[Back to table of contents](#toc-part-8) +[Back to table of contents](#toc-part-9) | [Next part](#toc-logging) ] @@ -10257,7 +10304,7 @@ There is no "best way" β€” it depends on factors like: * frequency of changes in the configuration. -.debug[[containers/Application_Configuration.md](""/tree/main/slides/containers/Application_Configuration.md)] +.debug[[containers/Application_Configuration.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Application_Configuration.md)] --- ## Command-line parameters @@ -10276,7 +10323,7 @@ docker run jpetazzo/hamba 80 www1:80 www2:80 - start the actual service. -.debug[[containers/Application_Configuration.md](""/tree/main/slides/containers/Application_Configuration.md)] +.debug[[containers/Application_Configuration.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Application_Configuration.md)] --- ## Command-line parameters pros and cons @@ -10291,7 +10338,7 @@ docker run jpetazzo/hamba 80 www1:80 www2:80 (These things are still possible, but more cumbersome.) -.debug[[containers/Application_Configuration.md](""/tree/main/slides/containers/Application_Configuration.md)] +.debug[[containers/Application_Configuration.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Application_Configuration.md)] --- ## Environment variables @@ -10305,7 +10352,7 @@ docker run -e ELASTICSEARCH_URL=http://es42:9201/ kibana * The environment variable can be used straight by the program,
or by a script generating a configuration file. -.debug[[containers/Application_Configuration.md](""/tree/main/slides/containers/Application_Configuration.md)] +.debug[[containers/Application_Configuration.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Application_Configuration.md)] --- ## Environment variables pros and cons @@ -10324,7 +10371,7 @@ docker run -e ELASTICSEARCH_URL=http://es42:9201/ kibana * Not great for dynamic configurations. -.debug[[containers/Application_Configuration.md](""/tree/main/slides/containers/Application_Configuration.md)] +.debug[[containers/Application_Configuration.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Application_Configuration.md)] --- ## Baked-in configuration @@ -10342,7 +10389,7 @@ COPY prometheus.conf /etc - extend it (if the code can read multiple configuration files). -.debug[[containers/Application_Configuration.md](""/tree/main/slides/containers/Application_Configuration.md)] +.debug[[containers/Application_Configuration.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Application_Configuration.md)] --- ## Baked-in configuration pros and cons @@ -10361,7 +10408,7 @@ COPY prometheus.conf /etc (Which is great, but requires a registry.) -.debug[[containers/Application_Configuration.md](""/tree/main/slides/containers/Application_Configuration.md)] +.debug[[containers/Application_Configuration.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Application_Configuration.md)] --- ## Configuration volume @@ -10378,7 +10425,7 @@ docker run -v appconfig:/etc/appconfig myapp (But this results in a less "obvious" setup, that needs more documentation.) -.debug[[containers/Application_Configuration.md](""/tree/main/slides/containers/Application_Configuration.md)] +.debug[[containers/Application_Configuration.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Application_Configuration.md)] --- ## Configuration volume pros and cons @@ -10393,7 +10440,7 @@ docker run -v appconfig:/etc/appconfig myapp * Configuration can be generated or edited through another container. -.debug[[containers/Application_Configuration.md](""/tree/main/slides/containers/Application_Configuration.md)] +.debug[[containers/Application_Configuration.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Application_Configuration.md)] --- ## Dynamic configuration volume @@ -10410,7 +10457,7 @@ docker run -v appconfig:/etc/appconfig myapp * The configuration can be shared between multiple services if needed. -.debug[[containers/Application_Configuration.md](""/tree/main/slides/containers/Application_Configuration.md)] +.debug[[containers/Application_Configuration.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Application_Configuration.md)] --- ## Dynamic configuration volume example @@ -10433,7 +10480,7 @@ The configuration could also be updated through e.g. a REST API. (The REST API being itself served from another container.) -.debug[[containers/Application_Configuration.md](""/tree/main/slides/containers/Application_Configuration.md)] +.debug[[containers/Application_Configuration.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Application_Configuration.md)] --- ## Keeping secrets @@ -10456,12 +10503,12 @@ E.g.: - pass the secret using an API endpoint. -.debug[[containers/Application_Configuration.md](""/tree/main/slides/containers/Application_Configuration.md)] +.debug[[containers/Application_Configuration.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Application_Configuration.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/blue-containers.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/chinook-helicopter-container.jpg)] --- @@ -10473,7 +10520,7 @@ class: title .nav[ [Previous part](#toc-application-configuration) | -[Back to table of contents](#toc-part-8) +[Back to table of contents](#toc-part-9) | [Next part](#toc-orchestration-an-overview) ] @@ -10487,7 +10534,7 @@ In this chapter, we will explain the different ways to send logs from containers We will then show one particular method in action, using ELK and Docker's logging drivers. -.debug[[containers/Logging.md](""/tree/main/slides/containers/Logging.md)] +.debug[[containers/Logging.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Logging.md)] --- ## There are many ways to send logs @@ -10508,7 +10555,7 @@ We will then show one particular method in action, using ELK and Docker's loggin *All these methods are available with containers.* -.debug[[containers/Logging.md](""/tree/main/slides/containers/Logging.md)] +.debug[[containers/Logging.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Logging.md)] --- ## Writing on stdout/stderr @@ -10525,7 +10572,7 @@ We will then show one particular method in action, using ELK and Docker's loggin - This can be customized, as we will see later. -.debug[[containers/Logging.md](""/tree/main/slides/containers/Logging.md)] +.debug[[containers/Logging.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Logging.md)] --- ## Writing to local files @@ -10544,7 +10591,7 @@ We will then show one particular method in action, using ELK and Docker's loggin - There are multiple solutions. -.debug[[containers/Logging.md](""/tree/main/slides/containers/Logging.md)] +.debug[[containers/Logging.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Logging.md)] --- ## Using a volume or bind mount @@ -10564,7 +10611,7 @@ We will then show one particular method in action, using ELK and Docker's loggin - The log files will appear on the host and be consumable directly from the host. -.debug[[containers/Logging.md](""/tree/main/slides/containers/Logging.md)] +.debug[[containers/Logging.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Logging.md)] --- ## Using logging services @@ -10581,7 +10628,7 @@ We will then show one particular method in action, using ELK and Docker's loggin - The name `log` will resolve to different addresses in development, production, etc. -.debug[[containers/Logging.md](""/tree/main/slides/containers/Logging.md)] +.debug[[containers/Logging.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Logging.md)] --- ## Using syslog @@ -10600,7 +10647,7 @@ We will then show one particular method in action, using ELK and Docker's loggin - VoilΓ ! -.debug[[containers/Logging.md](""/tree/main/slides/containers/Logging.md)] +.debug[[containers/Logging.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Logging.md)] --- ## Using logging drivers @@ -10619,7 +10666,7 @@ We will then show one particular method in action, using ELK and Docker's loggin - Each plugin can process and forward the logs to another process or system. -.debug[[containers/Logging.md](""/tree/main/slides/containers/Logging.md)] +.debug[[containers/Logging.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Logging.md)] --- ## A word of warning about `json-file` @@ -10641,7 +10688,7 @@ Example: $ docker run --log-opt max-size=10m --log-opt max-file=3 elasticsearch ``` -.debug[[containers/Logging.md](""/tree/main/slides/containers/Logging.md)] +.debug[[containers/Logging.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Logging.md)] --- ## Demo: sending logs to ELK @@ -10659,7 +10706,7 @@ setup; it is just an example. We used ELK in this demo because it's a popular setup and we keep being asked about it; but you will have equal success with Fluent or other logging stacks!* -.debug[[containers/Logging.md](""/tree/main/slides/containers/Logging.md)] +.debug[[containers/Logging.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Logging.md)] --- ## What's in an ELK stack? @@ -10681,7 +10728,7 @@ will have equal success with Fluent or other logging stacks!* - Log entries will be stored in ElasticSearch,
and displayed on Logstash's stdout for debugging -.debug[[containers/Logging.md](""/tree/main/slides/containers/Logging.md)] +.debug[[containers/Logging.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Logging.md)] --- ## Running ELK @@ -10699,7 +10746,7 @@ $ docker-compose up - Let's have a look at the Compose file while it's deploying. -.debug[[containers/Logging.md](""/tree/main/slides/containers/Logging.md)] +.debug[[containers/Logging.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Logging.md)] --- ## Our basic ELK deployment @@ -10720,7 +10767,7 @@ $ docker-compose up - this is a hack so that we don't have to create an image just for the config. -.debug[[containers/Logging.md](""/tree/main/slides/containers/Logging.md)] +.debug[[containers/Logging.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Logging.md)] --- ## Sending logs to ELK @@ -10740,7 +10787,7 @@ $ docker run --log-driver=gelf --log-opt=gelf-address=udp://localhost:12201 \ alpine echo hello world ``` -.debug[[containers/Logging.md](""/tree/main/slides/containers/Logging.md)] +.debug[[containers/Logging.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Logging.md)] --- ## Viewing the logs in ELK @@ -10751,7 +10798,7 @@ $ docker run --log-driver=gelf --log-opt=gelf-address=udp://localhost:12201 \ - Browse http://X.X.X.X:5601. -.debug[[containers/Logging.md](""/tree/main/slides/containers/Logging.md)] +.debug[[containers/Logging.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Logging.md)] --- ## "Configuring" Kibana @@ -10772,7 +10819,7 @@ $ docker run --log-driver=gelf --log-opt=gelf-address=udp://localhost:12201 \ - Our 'hello world' message should be visible there. -.debug[[containers/Logging.md](""/tree/main/slides/containers/Logging.md)] +.debug[[containers/Logging.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Logging.md)] --- ## Important afterword @@ -10796,12 +10843,12 @@ If you want to learn more about the GELF driver, have a look at [this blog post]( https://jpetazzo.github.io/2017/01/20/docker-logging-gelf/). -.debug[[containers/Logging.md](""/tree/main/slides/containers/Logging.md)] +.debug[[containers/Logging.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Logging.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/chinook-helicopter-container.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/container-cranes.jpg)] --- @@ -10813,7 +10860,7 @@ class: title .nav[ [Previous part](#toc-logging) | -[Back to table of contents](#toc-part-8) +[Back to table of contents](#toc-part-9) | [Next part](#toc-links-and-resources) ] @@ -10829,7 +10876,7 @@ In this chapter, we will: * Present (from a high-level perspective) some orchestrators. -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- class: pic @@ -10838,7 +10885,7 @@ class: pic ![Joana Carneiro (orchestra conductor)](images/conductor.jpg) -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- ## What's orchestration? @@ -10859,7 +10906,7 @@ Converged Infrastructure and __dynamic datacenter__ topics.* What does that really mean? -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- ## Example 1: dynamic cloud instances @@ -10874,7 +10921,7 @@ What does that really mean? .center[![Daily variations of traffic](images/traffic-graph.png)] -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- ## Example 1: dynamic cloud instances @@ -10891,7 +10938,7 @@ What does that really mean? (i.e. save big $$$ here) -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- ## Example 1: dynamic cloud instances @@ -10906,7 +10953,7 @@ That's *relatively* easy. Now, how are things for our IAAS provider? -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- ## Example 2: dynamic datacenter @@ -10935,7 +10982,7 @@ Now, how are things for our IAAS provider? - A: obviously not! -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- ## Example 2: dynamic datacenter @@ -10951,7 +10998,7 @@ Now, how are things for our IAAS provider? (e.g. combine two hypervisors with 40% load into 80%+0%,
and shut down the one at 0%) -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- ## Example 2: dynamic datacenter @@ -10973,7 +11020,7 @@ How do we implement this? *Scheduling* becomes more complex. -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- ## What is scheduling? @@ -10995,7 +11042,7 @@ In practice, these goals often conflict. **"Scheduling" = decide which resources to use.** -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- ## Exercise 1 @@ -11016,7 +11063,7 @@ Scheduling = deciding which hypervisor to use for each VM. Difficulty: easy! -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- @@ -11039,7 +11086,7 @@ Scheduling = deciding which hypervisor to use for each VM. Difficulty: ??? -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- @@ -11062,7 +11109,7 @@ Scheduling = deciding which hypervisor to use for each VM. ![Troll face](images/trollface.png) -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- ## Exercise 3 @@ -11075,7 +11122,7 @@ Scheduling = deciding which hypervisor to use for each VM. - Sounds familiar? -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- class: pic @@ -11086,7 +11133,7 @@ class: pic ## We can't fit a job of size 6 :( -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- class: pic @@ -11097,7 +11144,7 @@ class: pic ## ... Now we can! -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- class: pic @@ -11106,7 +11153,7 @@ class: pic .center[![2D bin packing](images/binpacking-2d.gif)] -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- class: pic @@ -11115,7 +11162,7 @@ class: pic .center[![3D bin packing](images/binpacking-3d.gif)] -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- class: pic @@ -11124,7 +11171,7 @@ class: pic .center[![Tangram](images/tangram.gif)] -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- class: pic @@ -11133,7 +11180,7 @@ class: pic .center[![Tetris](images/tetris-1.png)] -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- class: pic @@ -11142,7 +11189,7 @@ class: pic .center[![Big tetris](images/tetris-2.gif)] -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- class: pic @@ -11151,7 +11198,7 @@ class: pic .center[![3D tetris](images/tetris-3.png)] -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- class: pic @@ -11160,7 +11207,7 @@ class: pic .center[![FUUUUUU face](images/fu-face.jpg)] -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- ## TL,DR @@ -11171,7 +11218,7 @@ class: pic * There are literally tons of research papers written on this. -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- ## But our orchestrator also needs to manage ... @@ -11187,7 +11234,7 @@ class: pic (Canary deployments, blue/green deployments...) -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- ## Some orchestrators @@ -11204,7 +11251,7 @@ It depends on: - your pre-existing skills... -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- ## Nomad @@ -11219,7 +11266,7 @@ It depends on: - Less integration with the rest of the container ecosystem. -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- ## Mesos @@ -11240,7 +11287,7 @@ It depends on: - Commercial offering through DC/OS by Mesosphere. -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- ## Rancher @@ -11251,7 +11298,7 @@ It depends on: - Technically not an orchestrator, but it's a popular option. -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- ## Swarm @@ -11268,7 +11315,7 @@ It depends on: - easier to operate. -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- ## Kubernetes @@ -11294,13 +11341,13 @@ It depends on: :EN:- Orchestration overview :FR:- Survol de techniques d'orchestration -.debug[[containers/Orchestration_Overview.md](""/tree/main/slides/containers/Orchestration_Overview.md)] +.debug[[containers/Orchestration_Overview.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/Orchestration_Overview.md)] --- class: title, self-paced Thank you! -.debug[[shared/thankyou.md](""/tree/main/slides/shared/thankyou.md)] +.debug[[shared/thankyou.md](https://git.verleun.org/training/containers.git/tree/main/slides/shared/thankyou.md)] --- class: title, in-person @@ -11309,12 +11356,12 @@ That's all, folks!
Questions? ![end](images/end.jpg) -.debug[[shared/thankyou.md](""/tree/main/slides/shared/thankyou.md)] +.debug[[shared/thankyou.md](https://git.verleun.org/training/containers.git/tree/main/slides/shared/thankyou.md)] --- class: pic -.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/container-cranes.jpg)] +.interstitial[![Image separating from the next part](https://gallant-turing-d0d520.netlify.com/containers/container-housing.jpg)] --- @@ -11326,7 +11373,7 @@ class: title .nav[ [Previous part](#toc-orchestration-an-overview) | -[Back to table of contents](#toc-part-9) +[Back to table of contents](#toc-part-10) | [Next part](#toc-) ] @@ -11347,7 +11394,7 @@ class: title .footnote[These slides (and future updates) are on β†’ https://container.training/] -.debug[[containers/links.md](""/tree/main/slides/containers/links.md)] +.debug[[containers/links.md](https://git.verleun.org/training/containers.git/tree/main/slides/containers/links.md)]