containers without the magic - codered · thinking in terms of docker • pre-define a docker image...
TRANSCRIPT
![Page 1: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/1.jpg)
CodeRed
ContainersWithout the Magic
Vince Salvino@vincesalvino
slides: coderedcorp.com/resources
PyOhio 2018
@vincesalvino
![Page 2: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/2.jpg)
CodeRed
What is a Container?
@vincesalvino
![Page 3: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/3.jpg)
CodeRed
Common Answer = Dark Magic
Look how “easy” it is to use containers…
@vincesalvino
$ apt-get install docker$ docker run hello-world
![Page 4: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/4.jpg)
CodeRed
Real Answer = Bundle
• Bundle ALL software and system dependencies of your app
• Less overhead and complexity than a virtual machine
• More control than a requirements.txt
@vincesalvino
![Page 5: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/5.jpg)
CodeRed
That’s nice…so why should I care?
@vincesalvino
![Page 6: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/6.jpg)
CodeRed
Running your Python app “normally”
• But wait… which version of python am I using?• But wait… something in my requirements.txt conflicts with a
different version of something else on the system.
@vincesalvino
$ pip install –r requirements.txt
$ python myapp.py
![Page 7: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/7.jpg)
CodeRed
And then the gods created virtualenv
• Now I can run different versions of python in each virtualenv!• Now I can run different versions of EVERYTHING in my
requirements.txt in separate virtualenvs!
@vincesalvino
$ virtualenv myapp
(myapp)$ pip install –r requirements.txt
(myapp)$ python myapp.py
![Page 8: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/8.jpg)
CodeRed
But the gods were still not pleased• My system only comes with python 2.7 and 3.2
• Live with it.• Compile a different version of python for your system.• Install a sketchy binary or PPA from some random dude on the internet.
• My app needs a SYSTEM library installed, that is outside the scope of pip
• Well on fedora you need to install [package]• On ubuntu you can install [package], but that version has a bug that doesn’t work
with our app• Fools! - your app should only be pure python!
@vincesalvino
![Page 9: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/9.jpg)
CodeRed
Some tried to please the gods by sacrificing resources to virtual machines• But nobody wants that mess• Why have we resorted to creating an entire OS image just to run
our app?• Bloatware, USA – now my nice lean app needs multiple
gigabytes of memory and a 20GB disk just to run a copy of the OS and all those system libraries.
@vincesalvino
![Page 10: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/10.jpg)
CodeRed
So the gods created containers
• Actually, the concept of containers has existed for a long time (BSD jails - but only heathens use BSD)
• Containers essentially let you specify a collection of system packages, code, files, etc. and run that all natively on the OS.
• It’s like virtualenv for your entire OS!!!
@vincesalvino
![Page 11: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/11.jpg)
CodeRed
[recap]
That’s nice…so why should I care?
@vincesalvino
![Page 12: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/12.jpg)
CodeRed
• If you ever needed a different version of python…• If you ever had trouble installing a system dependency…• If you ever needed to install your app on multiple systems (or
multiple apps on one system) and found it involving a lot of tedium…
• If you want to easily distribute a fully working version of your app to others…
@vincesalvino
…then you might care about containers.
![Page 13: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/13.jpg)
CodeRed
That’s cool…How do containers actually work?
@vincesalvino
![Page 14: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/14.jpg)
CodeRed
Container Tech Comparison
virtualenv• A very basic containerization
system• Specifically for python• Only handles python packages
@vincesalvino
# requirements.txt
Django==1.11
wagtail==2.0.1
mysqlclient
![Page 15: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/15.jpg)
CodeRed
Container Tech Comparison
What if we had virtualenvfor the whole system?!?!• Install python versions• Manage apache/system
dependencies
@vincesalvino
# super requirements.txt
Django==1.11
wagtail==2.0.1
mysqlclient
Apache==2.4
Python==3.6
mod_wsgi
mod_redirect
imagemagick
![Page 16: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/16.jpg)
CodeRed
… we do! It’s called LXC or Docker
@vincesalvino
![Page 17: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/17.jpg)
CodeRed
Container Tech Comparison
LCX• Linux Containers• Starts from a base image which is like
a lightweight mini-distro (ubuntu, etc.)• Runs all the libraries and code of the
mini-OS natively using the host’s kernel.
• Similar experience to a VM, but much lighter and not actually virtualized.
Docker• Very portable (Windows, Mac, Linux,
cloud-native)• Images only include the exact
software you specify.• Other software dependencies are
handled by docker behind the scenes.• Runs only the libraries and code you
specify directly on the host.
@vincesalvino
![Page 18: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/18.jpg)
CodeRed
Thinking in terms of a LAMP stack
• Start with a pre-defined OS image (Debian 8)
@vincesalvino
![Page 19: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/19.jpg)
CodeRed
Thinking in terms of a LAMP stack
• Start with a pre-defined OS image (Debian 8)• Install my app’s system dependencies (e.g. imagemagik,
libmysqlclient-dev)
@vincesalvino
![Page 20: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/20.jpg)
CodeRed
Thinking in terms of a LAMP stack
• Start with a pre-defined OS image (Debian 8)• Install my app’s system dependencies (e.g. imagemagik,
libmysqlclient-dev)• Install the version(s) of python from OS (2.7 and 3.4)
@vincesalvino
![Page 21: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/21.jpg)
CodeRed
Thinking in terms of a LAMP stack
• Start with a pre-defined OS image (Debian 8)• Install my app’s system dependencies (e.g. imagemagik,
libmysqlclient-dev)• Install the version(s) of python from OS (2.7 and 3.4)• Install virtualenv so I can run more than one python app
@vincesalvino
![Page 22: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/22.jpg)
CodeRed
Thinking in terms of a LAMP stack
• Start with a pre-defined OS image (Debian 8)• Install my app’s system dependencies (e.g. imagemagik,
libmysqlclient-dev)• Install the version(s) of python from OS (2.7 and 3.4)• Install virtualenv so I can run more than one python app• Install the version of Apache from OS (Apache 2.4.12)
@vincesalvino
![Page 23: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/23.jpg)
CodeRed
Thinking in terms of a LAMP stack
• Start with a pre-defined OS image (Debian 8)• Install my app’s system dependencies (e.g. imagemagik,
libmysqlclient-dev)• Install the version(s) of python from OS (2.7 and 3.4)• Install virtualenv so I can run more than one python app• Install the version of Apache from OS (Apache 2.4.12)• Set up a wsgi, jump through hoops, create a virtualenv, set things to
start on boot, etc.
@vincesalvino
![Page 24: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/24.jpg)
CodeRed
Thinking in terms of a LAMP stack• Start with a pre-defined OS image (Debian 8)• Install my app’s system dependencies (e.g. imagemagik,
libmysqlclient-dev)• Install the version(s) of python from OS (2.7 and 3.4)• Install virtualenv so I can run more than one python app• Install the version of Apache from OS (Apache 2.4.12)• Set up a wsgi, jump through hoops, create a virtualenv, set things to
start on boot, etc.• Copy my code to the server and restart Apache
@vincesalvino
![Page 25: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/25.jpg)
CodeRed
Thinking in terms of Docker
• Pre-define a docker image that includes apache, python, and other system dependencies.
@vincesalvino
![Page 26: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/26.jpg)
CodeRed
Thinking in terms of Docker
• Pre-define a docker image that includes apache, python, and other system dependencies.
• Pre-load my code in the docker image.
@vincesalvino
![Page 27: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/27.jpg)
CodeRed
Thinking in terms of Docker
• Pre-define a docker image that includes apache, python, and other system dependencies.
• Pre-load my code in the docker image.• Pre-define what to do when it starts (e.g. start apache)
@vincesalvino
![Page 28: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/28.jpg)
CodeRed
Thinking in terms of Docker
• Pre-define a docker image that includes apache, python, and other system dependencies.
• Pre-load my code in the docker image.• Pre-define what to do when it starts (e.g. start apache)• Run the docker image
@vincesalvino
![Page 29: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/29.jpg)
CodeRed
Thinking in terms of Docker
• Pre-define a docker image that includes apache, python, and other system dependencies.
• Pre-load my code in the docker image.• Pre-define what to do when it starts (e.g. start apache)• Run the docker image
My docker image will now run EXACTLY the same on any OS because all dependencies and files have been pre-defined and are managed by docker, instead of being managed by the OS or manually by the sys admin.
@vincesalvino
![Page 30: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/30.jpg)
CodeRed
Visualized LAMP stack
@vincesalvino
Kernel (system)
ApachePythonWSGI
My App (code)
Giant web of dependencies (system)
![Page 31: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/31.jpg)
CodeRed
My App (docker image)
Visualized Docker stack
@vincesalvino
Kernel (system)
WSGI
Docker (system)
Python Apache My App (code)
![Page 32: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/32.jpg)
CodeRed
Quick Start
@vincesalvino
![Page 33: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/33.jpg)
CodeRed
Let’s Dockerize your Python app
My app looks like this:
@vincesalvino
/myapp/myapp.pyrequirements.txt
![Page 34: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/34.jpg)
CodeRed
Let’s Dockerize your Python app
Now add a Dockerfile. Think of the dockerfile as a requirements.txt for your entire system.
@vincesalvino
/myapp/myapp.pyrequirements.txtDockerfile
![Page 35: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/35.jpg)
CodeRed
Let’s Dockerize your Python app
@vincesalvino
# Dockerfile
FROM python:3.6
COPY . /code/RUN pip install -r /code/requirements.txt
CMD python /code/myapp.py
![Page 36: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/36.jpg)
CodeRed
Let’s Dockerize your Python app
@vincesalvino
# Dockerfile
FROM python:3.6
COPY . /code/RUN pip install -r /code/requirements.txt
CMD python /code/myapp.py
This is a simple example, using the actual python file as the final CMD command.
For something like a LAMP stack, this Dockerfile would include installation of apache and dependencies, and the final CMD command would probably be to start apache.
![Page 37: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/37.jpg)
CodeRed
Let’s Dockerize your Python app
We just created a Dockerfile that defines everything our app needs, and what to execute
Now we build a docker image of our app
@vincesalvino
/myapp $ docker build –t myapp_image
![Page 38: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/38.jpg)
CodeRed
Let’s Dockerize your Python app
• This one command provisions all dependencies we defined for our app, and packages it up into a single container image.
• This image is a binary distributable. Think of it like an “.exe” that contains our app and everything our app needs, and tells the system what to execute.
@vincesalvino
/myapp $ docker build –t myapp_image
![Page 39: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/39.jpg)
CodeRed
It’s all dockerizedNow we have a docker image called myapp_image
@vincesalvino
![Page 40: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/40.jpg)
CodeRed
Run your Python app
Now we can create and run an actual container (instance of our app) from the docker image
@vincesalvino
$ docker run myapp_image
![Page 41: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/41.jpg)
CodeRed
Remember that dark magic from the first slide…Hopefully now it makes a little bit of sense.
@vincesalvino
$ apt-get install docker$ docker run hello-world
![Page 42: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/42.jpg)
CodeRed
Avoiding“New Shiny Syndrome”
@vincesalvino
![Page 43: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/43.jpg)
CodeRed
Containers provide a way of bundling code AND system dependencies into one binary
When to USE containers• App runs on multiple systems• Multiple different apps run on
one system.• Easily distribute a fully
working app to other systems or users.
When NOT TO USE containers• One app per system• System dependencies do not
need upgraded or changed frequently
• The app does not get distributed to other systems or users.
@vincesalvino
![Page 44: Containers Without the Magic - CodeRed · Thinking in terms of Docker • Pre-define a docker image that includes apache, python, and other system dependencies. • Pre-load my code](https://reader033.vdocuments.us/reader033/viewer/2022050113/5f4a11b091bb81620f672a40/html5/thumbnails/44.jpg)
CodeRed
Let’s Talk@vincesalvino
slides: coderedcorp.com/resources
@vincesalvino