introduction to docker for nodejs developers at node dc 2/26/2014

Download Introduction to Docker for NodeJs developers at Node DC 2/26/2014

If you can't read please download the document

Upload: lenworthhenry

Post on 16-Apr-2017

3.111 views

Category:

Technology


2 download

TRANSCRIPT

Node.js in a Docker Container

Lenworth Henry ([email protected])

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)

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

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)

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

What you will need

A workstation running Linux kernel 3.8 or greaterDocker 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 hardwareThere is lots of help for this

Getting Started With Docker

Simple Docker Example

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

Two work-flows with docker

Using commitsRun a base image

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 that image

Using DockerfileCreate 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.

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

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

Docker gotchas

You can only run one command or entrypoint for a containerYou 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 DockerfileEach step is meant to execute and complete

Daemon like functionality should be executed when the container is running

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 linkingLinking works the same in production environment

Example MEAN Stack app

MongoDB, Express, Angular and NodeUses PassPortJS for authentication

Need to start multiple processes?

Each Dockerfile will have only one entry point

Two options:Create your own shell script that starts up the processes and call that using a CMD or ENTRYPOINT

Use supervisord

Example supervisord.conf

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

Docker Tips

Only run in daemon mode (-d) if you have run it without -d to see if there are any problems with your configurationYou will not see errors printed out to stdout while trying to load the container

Watch your disk space while creating images and containersDocker creates intermediate containers that can quickly eat up disk space

Use the -rm=true when building

Questions and Helpful Links

Main Docker Site: https://docs.docker.io/

Index Site (Prebuilt image search): https://index.docker.io/

How to cleanup docker disk usage: http://sosedoff.com/2013/12/17/cleanup-docker-containers-and-images.html

Docker Networking Details: https://blog.codecentric.de/en/2014/01/docker-networking-made-simple-3-ways-connect-lxc-containers/