Docker Quick Reference
ps,ps -a, images, stop, start, restart, rm, rmi, logs
In docker cmd you have to use container name or id
In docker compose you have to use service name
Tail logs in real-time
docker logs -f <container>
Show last n lines of logs
docker logs --tail <n> <container>
docker logs --tail 50 backend
docker compose logs --tail <n> backendservice
Run command inside container
docker exec -it <container> <cmd>
docker compose exec <service> <cmd>
Interactive psql shell in container
docker exec -it postgres psql -U postgres
Run SQL file inside container
docker exec -i postgres psql -U postgres -d <dbname> < script.sql
Execute backend migration SQL inside container
docker exec -i postgres psql -U postgres -d <dbname> < /app/backend/init.sql
Compose up (rebuild without cache)
docker compose up -d --build --no-cache
Check prod compose service status
docker compose -f docker-compose.prod.yml ps
Port mapping (localhost only)
# bind container port 8000 only to localhost
127.0.0.1:8000:8000
Port mapping
# bind container port 8000 to all interfaces
0.0.0.0:8000:8000 = 8000:8000
# bind container to localhost
127.0.0.1:8000:8000
#bind host port 30000 to container port 3000
30000:3000
#container talks to another container on same network without port mapping through service name easily
backend:3000 #we write this in env vars or config files like postgresql://postgres:user@password:5432/dbname
backend:
...sth...
networks:
- my_network
networks:
my_network:
driver: bridge
EXPOSE port in Dockerfile
EXPOSE <port> # optional; documents which ports the container listens on
Check listening ports
sudo ss -ltnp | grep <port>
Check env vars inside container
docker exec -it <container> printenv | grep <VARNAME>
mount(./sth:./sth) and volumes (sthname:./path)
# We mount a named volume for Postgres data persistence
volumes:
data: ./app:./app
# Bind mounts (host path : container path) auto reflect changes
volumes:
- ./logs:/app/logs
# In dev mode we wanna make smooth code changes without rebuilding container
volumes:
- ./backend:/app/backend
# This is volume for Postgres data persistence not mounting
# named volume for Postgres data persistence but we have to define it below
volumes:
- pgdata:/var/lib/postgresql/data
#**define the volumes**
volumes:
pgdata:
driver: local # optional, local driver by default
## after that we can use docker volume commands
docker volume ls # list all volumes
docker volume inspect pgdata # see details of volume
docker volume rm pgdata # remove volume (careful, deletes data)
Use restart policy (always)
# Ensure services restarts automatically on failure
restart: always
Alias
#create alias
alias dc='docker compose'
dc up -d # shorthand for docker compose up -d
alias dc='docker compose -f docker-compose.prod.yml'
dc up -d # shorthand for docker compose -f docker-compose.prod.yml up -d
alias run_sql='docker exec -i ocpp_postgres psql -U postgres -d mydb <'
# usage
run_sql script.sql
Restart backend when code changed (volume mounted)
docker compose restart backend
Rebuild backend when env or Dockerfile changed
docker compose up -d --build backend
Do not rebuild DB when volume is mounted
# keep data intact; do not rebuild DB service if pgdata volume exists
Depends on
# Ensure DB starts before backend
depends_on:
- db
Create Docker Network
docker network create kushal1o1_caddy_net
Use External Network in Compose
networks:
kushal1o1_caddy_net:
external: true #global check instead of creating new net for each project
Expose Ports in Compose
expose:
- "8000" #inhost machine we can configure cady and use servicesname:port
- "9000"
Key Rule for Ports
# No ports: unless service must be public
# Use expose: for internal services
Backend Project Pattern
services:
backend_service:
image: your-backend-image
expose:
- "8000" #can use backend_service:8000 and other projects can use sameport no conflict
- "9000"
networks:
- kushal1o1_caddy_net
restart: unless-stopped
Restart Policy