I've been reading tweets about how great Docker is but I've never had the chance to try it out... until... I decided it was my next adventure... and boy am I enjoying it!
I started my Docker journey by buying The Docker Book, it's awesome... I read it in two days just because I couldn't stop.
Then, I started thinking about how I would dockerize all the services I run on my servers... I started a migration a few months ago and I've never got the nerve to complete it... so getting to try Docker to actually do something useful (and finish that migration) sounds like a great plan.
I started by moving gitlab with my nginx server... that's fairly easy and I could either use the built in images or build my own ones using Ubuntu 14.04 (so that I don't have lots of base images)... and it was Asterisk's turn.
I found the dougbtv/asterisk image that honestly does all the heavy lifting... he figured out how to compile it in a docker-compatible way, so all the credits to him... but I wanted to:
- Keep the image size to the minimum <- #1 requirement
- Pick the modules I want to compile (I'm a control freak and it's also related to the previous point)
- Mount the etc, spool and log directories so that I can do modifications and see them on the host
- If the etc folder is empty, copy the default files so that I have something to work with... if it has files, just leave it as it is
Soooo... I ended up building gmcuy/asterisk (you can see the Dockerfile in there).
After several trials and errors (all using different RUNs so that I could reuse the intermediate images and either find out the different menuselect/menuselect options or debug which libraries I was missing) I ended up putting everything on a single run so that:
- The source code is never included in a layer
- wget is never included in a layer
I also put the COPY of the init.sh and default-conf.tgz last so that if I tweak them it reuses the asterisk compiled layer... oh, and as dougbtv suggested... I'm using network_options: host... I was able to map the RTP UDP port range from 10000-10100 by doing '10000-10100/udp' but I couldn't get audio through... I tried fiddling with the nat settings but I couldn't figure it out, so I just exposed it at the host level and that was it. Do I like it? nope... but it still feels better (and way easier to move) than having asterisk compiled on the server (which I've found out is not as a repeatable process as I'd like).
Hope you can at least get some inspiration from here! and if you have something that can be improved, please let me know :)