Convert Docker Run to Docker Compose
Moving from docker run commands to docker-compose.yml makes your deployments reproducible and easier to manage. Here is how to map common flags.
The Mapping Guide
| Docker Run Flag | Compose Key | Example |
|---|---|---|
-p 80:80 | ports | - "80:80" |
-v /host:/container | volumes | - /host:/container |
-e KEY=VAL | environment | - KEY=VAL |
--name my-app | container_name | container_name: my-app |
--network my-net | networks | networks: [my-net] |
--restart always | restart | restart: always |
--link other | depends_on | - other |
Example 1: Simple Web Server
Docker Run:
docker run -d -p 8080:80 --name web nginx:latest
Docker Compose:
services:
web:
image: nginx:latest
container_name: web
ports:
- "8080:80"
Example 2: Database with Environment Variables
Docker Run:
docker run -d \
--name db \
-e POSTGRES_PASSWORD=secret \
-v db-data:/var/lib/postgresql/data \
postgres:15
Docker Compose:
services:
db:
image: postgres:15
container_name: db
environment:
POSTGRES_PASSWORD: secret
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
Example 3: Linking Containers
Docker Run:
# Start DB
docker run -d --name db postgres
# Start App linked to DB
docker run -d -p 3000:3000 --link db:db my-app
Docker Compose:
services:
db:
image: postgres
app:
image: my-app
ports:
- "3000:3000"
depends_on:
- db
# No need for 'links', they share a network by default
Tools to Automate
There are tools like Composerize that can automatically convert docker run commands to YAML. However, doing it manually ensures you understand the structure and can optimize it (e.g., by removing unnecessary container names or links).
Stop pasting commands
Once you have your docker-compose.yml, deployment becomes a single click on Hostim.dev.