December 29, 2025

Install and run Docker on Ubuntu VPS

Prerequisites (Once per server)

Install Docker

curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp docker

Verify:

docker --version
docker compose version

Folder Structure

project_name/
├── public/
│   └── index.php
├── docker/
│   └── php/
│       ├── Dockerfile
│       └── php.ini
├── docker-compose.yml
├── .env.example
└── .gitignore

STEP 4️⃣ PHP 8.2 Dockerfile

📄 docker/php/Dockerfile

FROM php:8.2-fpm

# Install PHP extensions needed for MySQL
RUN docker-php-ext-install pdo pdo_mysql

WORKDIR /var/www/html

COPY php.ini /usr/local/etc/php/conf.d/custom.ini

📄 docker/php/php.ini

memory_limit=256M
display_errors=Off
log_errors=On
error_log=/proc/self/fd/2
max_execution_time=60

STEP 5️⃣ docker-compose.yml

📄 docker-compose.yml

services:
  php:
    build: ./docker/php
    container_name: php82_app
    volumes:
      - .:/var/www/html
    ports:
      - "127.0.0.1:9005:9000"
    restart: unless-stopped
    mem_limit: 512m
    cpus: 1

⚠️ Port 9005 must be unused.
(Use a different port per project.)

STEP 6️⃣ Environment variables (MySQL on host)

📄 .env.example

DB_HOST=127.0.0.1
DB_PORT=3306
DB_NAME=app_db
DB_USER=app_user
DB_PASS=secret

📄 .gitignore

.env
vendor/
node_modules/

Create real env:

cp .env.example .env

Build & start PHP container

docker compose build
docker compose up -d

Check:

docker ps

You should see php82_app.

Restart / rebuild docker

Navigate to the docker project first the apply below commands which need.

# Restart cur docker
docker compose restart

# Docker down and up again when core variable changes
docker compose down
docker compose up -d

# Down rebuild and and up again
docker compose down
docker compose build
docker compose up -d

# Down rebuild and and up again with clear cache
docker compose down
docker compose build --no-cache
docker compose up -d

Docker networks

# Create network
docker network create nameof-network

# Inspect a network
docker network inspect nameof-network

To use a network from the sdasdasd.sdasd file add this code in same label of services:

services:
  ..
  ..
  ..
networks:
  default:
    external: true
    name: nameof-network

To access network container from another container follow this. replace the port with the running app’s port

http://nameof-network:3000/

Essential Commands

# Find docker IP
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' containerName

# List of docker containers
docker ps

# Monitor all container who using how much resource
docker stats

# See log
docker compose logs -f

You should see:

CONTAINER ID   IMAGE          NAMES          PORTS
abcd1234       nginx:alpine   nginx_proxy    0.0.0.0:8080->80/tcp

Down a container

docker-compose down

Up a Docker container

Go the the container directory first then run

docker compose up -d

Down & up again a container

docker compose down
docker compose up -d

Restart a container

docker restart container_name

Open a container

docker exec -it container_name sh
docker exec -it service_status_prismict bash

🔄 Rebuild & start

docker-compose build --no-cache
docker-compose up -d