Helping Transform Engineering at SterlingTS

Today I had the wonderful pleasure of championing several technology initiatives with my colleagues in Bellevue during an all-hands technology town-hall. We focused specifically on implementing Docker across our teams for our end-to-end development lifecycle, which is going to transform how we build software.

Our teams are doing really amazing work with some of the most talented engineers I have ever had the pleasure to work with. I am really excited for what we are doing this year, and my teams are looking for passionate software engineers who want to build transformative SaaS applications and tackle software challenges across many microservices and legacy applications.

Also posted on LinkedIn.

Docker: `Cannot start service nginx`

While developing amongst many projects, you may encounter this error when using docker; more specifically docker-compose:

ERROR: for {container_name} Cannot start service nginx: driver failed programming external connectivity on endpoint {container_name} ({hash}): Error starting userland proxy: Bind for unexpected error (Failure EADDRINUSE)

As a MAC user, the fix is simply to disable the locally running apache instance, allowing docker to forward port 80 locally from the nginx container (in my case).

Vagrant + Docker

Standardizing a development environment with Docker is challenging for a variety of reasons, the most common being that Docker simply is not the best of friends with Windows; particularly versions before Windows 10.

Regardless, when you’re running a modern development team with engineers and designers who have varying preferences of workstation, your environment needs to support them all.

In the past, we used Vagrant + Virtualbox + Ansible to build a virtual machine and we went from there. These days using Docker we can support an even deeper level of abstraction where you can run the environment natively, or in scenarios like Windows or on remote servers for demo purposes or what-not, we’ll run on a virtual machine or remote server.

All that to say we can now run docker+vagrant together to support this type of workflow. This way if you want to load up an environment on something where Docker isn’t supported well, you can run it through a virtual-machine with Vagrant, and otherwise just natively run docker-compose¬†and be on your way.

First, our docker-compose:

Now, our Vagrantfile:

Third, we’ll want to abstract our configuration values to .env

Finally, application configuration

There will be things you’ll want to configure specific to your application and web-server to take this to the finish line, but if you’ve gotten this far, you know how to do the rest!