Skip to content

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#

restart: unless-stopped