Docker CLI Plugin for multi-project Docker networking made easy.
Automatically manages:
- Unique subnet allocation per project (prevents conflicts)
- /etc/hosts entries for containers with DOMAIN configuration
- SSL certificates for domains in
SSL_DOMAINS(auto-generated, system trusted) - Smart route setup for macOS (checks connectivity before adding routes)
brew install yejune/tap/bootappHomebrew automatically:
- Downloads and builds the latest version
- Installs as Docker CLI plugin (
docker bootapp) - Installs standalone binary (
bootapp) - Checks dependencies
# Clone the repository
git clone https://github.com/yejune/bootapp.git
cd bootapp
# Run install script
bash install.shThe install script automatically:
- Checks for Go and Docker
- Builds the binary
- Installs to
~/.docker/cli-plugins/bootapp(Docker plugin) - Installs to
/usr/local/bin/bootapp(standalone binary) - Checks platform-specific dependencies
go install github.com/yejune/bootapp@latest
bootapp installOr build locally:
git clone https://github.com/yejune/bootapp.git
cd bootapp
go build
./bootapp installThe install command automatically:
- Copies binary to
~/.docker/cli-plugins/bootapp - Installs standalone binary to
/usr/local/bin/bootapp - Sets executable permissions
- Checks platform dependencies
make build
cp build/bootapp ~/.docker/cli-plugins/bootapp
chmod +x ~/.docker/cli-plugins/bootapp
sudo cp build/bootapp /usr/local/bin/bootapp
sudo chmod +x /usr/local/bin/bootapp# Auto-detect docker-compose.yml
docker bootapp up
# Specify compose file
docker bootapp -f docker-compose.local.yml upIf multiple compose files are found, you'll be prompted to select interactively:
Select compose file:
▸ docker-compose.yml
docker-compose.local.yml
docker-compose.prod.yml
Use ↑/↓ arrows to navigate, Enter to select
Supported file patterns:
docker-compose.yml,docker-compose.yamldocker-compose.*.yml,docker-compose.*.yaml(e.g., docker-compose.local.yml)compose.yml,compose.yaml
Options:
-d, --detach: Run in background (default: true)--no-build: Don't build images--pull: Pull images before starting-F, --force-recreate: Force recreate containers + regenerate SSL certificates
This will:
- Allocate unique subnet for the project (172.18-31.x.x range)
- Parse docker-compose file for DOMAIN/SSL_DOMAINS configuration
- Generate SSL certificates for
SSL_DOMAINS(if not exists) - Install certificates to system trust store (macOS Keychain / Linux ca-certificates)
- Start containers with docker-compose up
- Discover container IPs from default compose network
- Add /etc/hosts entries for containers with domain config
- Setup routing if needed (macOS)
docker bootapp down
docker bootapp -f docker-compose.local.yml downOptions:
-v, --volumes: Remove volumes--remove-orphans: Remove orphan containers--keep-hosts: Keep /etc/hosts entries--remove-config: Remove project from global config
docker bootapp lsAll of these environment variables are used for both:
- Host machine access (/etc/hosts)
- Container-to-container access (Docker network aliases)
Supported variables (duplicates removed, each supports single, comma, space, or newline separated values):
DOMAINDOMAINSSSL_DOMAINSAPP_DOMAINVIRTUAL_HOST(nginx-proxy compatible)
services:
app:
image: nginx
environment:
SSL_DOMAINS: |
myapp.local
www.myapp.local
db:
image: mysql:8
environment:
DOMAIN: db.local db-backup.local
redis:
image: redis
# No DOMAIN = no /etc/hosts entry (IP only)Domains set via DOMAIN/DOMAINS are automatically registered as Docker network aliases, allowing containers to reach each other:
services:
db:
image: mariadb
environment:
DOMAIN: db.local db-delivery.local
api:
image: nginx
environment:
DOMAIN: api.local
# api can reach db via: db.local or db-delivery.local
# db can reach api via: api.localThis replaces the deprecated external_links and works automatically with Docker's built-in DNS.
Traefik router rules are also supported:
services:
web:
image: nginx
labels:
- "traefik.http.routers.web.rule=Host(`web.local`)"
# Multiple hosts supported:
- "traefik.http.routers.api.rule=Host(`api.local`) || Host(`api2.local`)"
# Or comma-separated:
- "traefik.http.routers.app.rule=Host(`app.local`, `www.app.local`)"Only services with explicit domain configuration get /etc/hosts entries:
## bootapp:myproject
172.18.0.2 myapp.local
## bootapp:myproject
172.18.0.2 www.myapp.local
## bootapp:myproject
172.18.0.3 mysql.myapp.local
Services without DOMAIN config (like redis above) are not added to /etc/hosts.
bootapp automatically generates self-signed SSL certificates for domains specified in SSL_DOMAINS:
services:
app:
image: nginx
environment:
SSL_DOMAINS: myapp.test
volumes:
- ./var/certs:/etc/nginx/certs:roCertificates are:
- Generated in
./var/certs/directory (.crt,.key,.pemfiles) - Automatically trusted in system keychain (macOS) or ca-certificates (Linux)
- Valid for 10 years
- Include proper SAN (Subject Alternative Name) for browser compatibility
var/certs/
├── myapp.test.crt # Certificate
├── myapp.test.key # Private key
└── myapp.test.pem # Combined cert + key
To delete and regenerate certificates:
docker bootapp -f docker-compose.local.yml up -FThe -F flag will:
- Remove existing certificates from trust store
- Delete local certificate files
- Generate new certificates
- Install to trust store
- Force recreate containers
server {
listen 443 ssl;
server_name myapp.test;
ssl_certificate /etc/nginx/certs/myapp.test.crt;
ssl_certificate_key /etc/nginx/certs/myapp.test.key;
# ... rest of config
}docker-mac-net-connect is required for direct container IP access on macOS.
Docker Desktop runs containers inside a Linux VM, so macOS cannot directly access container IPs without a network tunnel.
brew install chipmk/tap/docker-mac-net-connect
sudo brew services start docker-mac-net-connectbootapp will check for docker-mac-net-connect and show installation instructions if not found.
✅ All features work natively on Linux!
Linux support includes:
-
Docker Networking
- Unique subnet per container
- Direct container IP access (no additional tools needed)
-
SSL Certificate Auto-generation & Trust
- Debian/Ubuntu:
update-ca-certificates - RHEL/CentOS:
update-ca-trust - Self-signed certificates automatically trusted system-wide
- Debian/Ubuntu:
-
Automatic /etc/hosts Management
- Domain → Container IP mapping
- Auto register/cleanup per project
-
Standalone Binary + Docker Plugin
- Use
bootappordocker bootappcommands
- Use
Installation:
# Requires Go
bash install.sh
# or
make build installUnlike macOS, Linux doesn't need additional network tools (docker-mac-net-connect) - everything works out of the box!
Recommended TLDs:
.test- RFC 2606 reserved for testing ✅.localhost- Local only ✅.internal- Private networks ✅
Avoid:
.local- Conflicts with macOS mDNS (slow DNS lookups).dev- Google-owned, forces HTTPS.app- Google-owned, forces HTTPS
Global configuration is stored in ~/.bootapp/projects.json:
{
"myproject": {
"path": "/path/to/project",
"subnet": "172.18.0.0/16",
"domain": "myproject.local"
},
"another-project": {
"path": "/path/to/another",
"subnet": "172.19.0.0/16",
"domain": "another.local"
}
}Each project gets a unique subnet (172.18.x.x through 172.31.x.x) to prevent IP conflicts between projects.
MIT