Working with Docker Toolbox on a Mac is great. It makes it very easy to work with Docker continers and setting up interconnected services with Docker Compose. However, since the services are running in a virtual machine, accessing the services from a machine other than the Mac itself is not possible out of the box.
Installing and running HAProxy on the Mac will proxy any traffic from the VM to external hosts looking to access the service. I installed haproxy via homebrew with the command
brew install haproxy.
With HAProxy installed, I set it up to proxy HTTPS traffic over to the VM. In my case, the VM was
192.168.99.100 and my Mac’s IP was
192.168.1.200. I saved the configuration below at
global log 127.0.0.1 local0 log 127.0.0.1 local1 notice maxconn 4096 chroot /usr/local/share/haproxy uid 99 gid 99 defaults log global mode tcp option dontlognull retries 3 option redispatch option http-server-close maxconn 2000 timeout connect 5000 timeout client 50000 timeout server 50000 frontend www_fe bind 192.168.1.200:443 use_backend www backend www timeout server 30s server www1 192.168.99.100:443
With haproxy configured, I placed the launchd configuration at
/Library/LaunchDaemons/com.zymbit.haproxy.plist and ran the command
sudo launchctl load -w /Library/LaunchDaemons/com.zymbit.haproxy.plist:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.zymbit.haproxy</string> <key>ProgramArguments</key> <array> <string>/usr/local/bin/haproxy</string> <string>-db</string> <string>-f</string> <string>/usr/local/etc/haproxy/haproxy.cfg</string> </array> </dict> </plist>
Starting and stopping launchd
Now, whenever I want external access to the Docker service I run the command
launchctl start com.zymbit.haproxy and when I’m done
launchctl stop com.zymbit.haproxy.