This was my presentation to the Node DC meetup on using Docker for Node JS projects. The code for the demonstration is available at github: https://github.com/lenworthhenry/Docker-Example
Breaking the Kubernetes Kill Chain: Host Path Mount
Introduction to Docker for NodeJs developers at Node DC 2/26/2014
1. Node.js in a Docker Container
Lenworth Henry (lenworth.henry@gmail.com)
2. What is Docker
●
●
Docker is an easy way to create a lightweight
container from any application
The same container you use in development
can be scaled to production on any platform
that supports Linux Containers (Amazon, VMs,
etc)
3. What can you do with Docker
●
Software distribution (app + dependencies)
–
e.g. NodeJs web apps (app+node+mongo+redis)
●
Fast spin-up VMs (no booting)
●
Automated testing and continuous integration/deployment.
●
●
Deploying and scaling databases and back-end services
in a service-oriented environment.
Document what components you need to run your
application
4. Why did I seek out Docker
●
●
●
Every time a new framework or library was
added to our code base the developers got
out of sync and we lost productivity
We needed a way to synchronize our
development environments
I also needed a way to keep track of all the
components that we were using in our
application (i.e. not use history to tell what I
have installed)
5. Why not Vagrant
●
●
●
Vagrant requires each machine to have
VM software like Virtuabox
Vagrant is not designed for creating
containers for production because of
all the overhead
Vagrant wasn't any easier to configure
than docker, but, the container footprint
was larger
6. What you will need
●
A workstation running Linux kernel 3.8
or greater
–
●
Docker containers can run inside VMs like
Virtuabox, but, as Linux containers they
are made for Linux
Knowledge of how to configure your
application on bare hardware
–
There is lots of help for this
9. Docker speak
●
●
●
A container is a running instance of an
image.
You create an image starting with one of
the images found on the index and
adding any customizations either from
inside the running container or using a
Dockerfile
Dockerfile-->(build)-->Image---(run)->Container
10. Two workflows with docker
●
Using commits
–
–
Connect to the shell of the base image and add whatever software,
customizations and your source (e.g. pull a git remote repository)
–
Commit to a new image
–
●
Run a base image
Run that image
Using Dockerfile
–
Create a dockerfile that includes all your configurations,
customizations and access to your source
–
This can all be pulled down from git to a different workstation
–
This is the most reliable option since your Dockerfile should be
rewritten that you can recreate the image with one command.
11. How to create a Docker File
●
If you don't remember all the packages
you installed then you can launch a
shell using a base image and then run
all the steps. Each step can be copied
to the docker file as a “RUN” command
12. Shell for Your Container
●
Once a docker image has been
created you can run it and enter the
bash shell using this command:
–
sudo docker run -t -i --rm ubuntu bash
13. Docker gotchas
●
You can only run one command or entrypoint for a container
–
–
●
●
You only have one cmd or entrypoint. Only one will get executed.
You must create a start script or use something like supervisord
If you change your source on the client you have to rebuild the image to see
those changes on the container.
You can't have long running processes in your Dockerfile
–
Each step is meant to execute and complete
–
Daemon like functionality should be executed when the container is running
14. Two containers
●
●
●
DB container is separate because it
rarely changes
The Node app resides in its own
container
Communication is enabled between
the two containers using linking
–
Linking works the same in production
environment
18. Helpful Docker commands
●
logs (sudo docker logs @containerid)
–
●
Gives a print out of the tty after running
ps (sudo docker ps)
–
–
●
Shows you all running containers
Containers running in daemon mode will show
up here for as long as they are running
stop (sudo docker stop @containerid)
–
Stops a running container
19. Docker Tips
●
Only run in daemon mode (-d) if you have run
it without -d to see if there are any problems
with your configuration
–
●
You will not see errors printed out to stdout while
trying to load the container
Watch your disk space while creating images
and containers
–
Docker creates intermediate containers that can
quickly eat up disk space
–
Use the -rm=true when building