https://github.com/giljr/docker_review
Updated this project #01 https://medium.com/jungletronics/docker-on-ubuntu-project-1-511817acaa88
https://github.com/giljr/docker_review
docker docker-compose mysql-database nodejs php
Last synced: about 1 month ago
JSON representation
Updated this project #01 https://medium.com/jungletronics/docker-on-ubuntu-project-1-511817acaa88
- Host: GitHub
- URL: https://github.com/giljr/docker_review
- Owner: giljr
- Created: 2026-04-26T17:57:59.000Z (2 months ago)
- Default Branch: main
- Last Pushed: 2026-04-26T19:10:35.000Z (2 months ago)
- Last Synced: 2026-04-26T21:14:33.792Z (2 months ago)
- Topics: docker, docker-compose, mysql-database, nodejs, php
- Language: PHP
- Homepage: https://medium.com/jungletronics/docker-on-ubuntu-project-1-511817acaa88
- Size: 26.4 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# 🚀 Guia Completo: Docker Compose (MySQL + Node API + PHP)
Este guia mostra passo a passo como subir um ambiente full-stack usando Docker Compose com:
* MySQL
* API Node.js
* PHP (Apache)
---
# 📁 Estrutura do Projeto
```
proj_01/
├── api/
│ ├── src/
│ │ └── index.js
│ ├── db/
│ │ └── script.sql
│ └── package.json
├── website/
│ └── index.php
└── docker-compose.yml
```
---
# ⚙️ docker-compose.yml
```yaml
services:
db:
image: mysql:8.0
container_name: mysql-container
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: jaythree
volumes:
- db-data:/var/lib/mysql
restart: always
api:
image: node:18
container_name: node-container
working_dir: /home/node/app
volumes:
- ./api:/home/node/app
command: sh -c "npm install && node src/index.js"
ports:
- "9001:9001"
depends_on:
- db
web:
image: php:8.2-apache
container_name: php-container
restart: always
volumes:
- ./website:/var/www/html
ports:
- "8888:80"
depends_on:
- db
- api
volumes:
db-data:
```
---
# 🧠 Passo 1 — Criar estrutura
```bash
mkdir proj_01 && cd proj_01
mkdir -p api/src api/db website
```
---
# 📦 Passo 2 — API Node
```bash
cd api
npm init -y
npm install express mysql
```
## 📄 src/index.js
```js
const express = require('express')
const mysql = require('mysql')
const app = express()
let connection
function connectWithRetry() {
connection = mysql.createConnection({
host: 'db',
user: 'root',
password: 'jaythree',
database: 'outfit_db'
})
connection.connect((err) => {
if (err) {
console.log('MySQL não pronto, tentando novamente...')
setTimeout(connectWithRetry, 3000)
} else {
console.log('Conectado ao MySQL')
}
})
}
connectWithRetry()
app.get('/products', (req, res) => {
connection.query('SELECT * FROM products', (err, results) => {
if (err) return res.status(500).json(err)
res.json(results)
})
})
app.listen(9001, '0.0.0.0', () => {
console.log('API rodando na porta 9001')
})
```
---
# 🗄️ Passo 3 — Script SQL
## api/db/script.sql
```sql
CREATE DATABASE IF NOT EXISTS outfit_db;
USE outfit_db;
CREATE TABLE IF NOT EXISTS products (
id INT AUTO_INCREMENT PRIMARY KEY,
sales_code INT NOT NULL,
date DATE NOT NULL,
store_id VARCHAR(255),
product VARCHAR(255),
qty INT NOT NULL,
unit_price DECIMAL(10,2)
);
INSERT INTO products (sales_code, date, store_id, product, qty, unit_price) VALUES
(65014, '2019-01-12', 'Shopping Morumbi', 'Aster Pants', 5, 114),
(65014, '2019-01-12', 'Shopping Morumbi', 'Trench Coat', 1, 269),
(65016, '2019-01-12', 'Iguatemi Campinas', 'Peter Pan Collar', 2, 363);
```
---
# 🌐 Passo 4 — PHP
## website/index.php
```php
ProdutoPreço
= $p->product ?>
= $p->unit_price ?>
```
---
# 🚀 Passo 5 — Subir containers
```bash
docker compose down -v
docker compose up --build
```
---
# 🧪 Passo 6 — Popular banco
```bash
docker exec -i mysql-container mysql -uroot -pjaythree outfit_db < api/db/script.sql
```
👉 Confere como **verificar** e **deletar** dados no MySQL de forma correta:
No terminal: `docker exec -it mysql-container mysql -uroot -pjaythree`
#### 🔎 Verificar dados
🔸 Selecionar o banco: `USE outfit_db;`
🔸 Listar tabelas: `SHOW TABLES;`
🔸 Visualizar dados: `SELECT * FROM products;`
#### 🧹 Deletar dados
🔸 Limpar todos os registros (mantém a tabela): `TRUNCATE TABLE products;`
🔸 Deletar registros específicos: `DELETE FROM products WHERE id = 1;`
🔸 Remover a tabela inteira: `DROP TABLE products;`
🔸 Apagar o banco completo: `DROP DATABASE outfit_db;`
### 🫶 Exemplos Pro (direto do terminal)
🔸 Ver tabelas: `docker exec -i mysql-container mysql -uroot -pjaythree outfit_db -e "SHOW TABLES;"`
🔸 Ver dados:`docker exec -i mysql-container mysql -uroot -pjaythree outfit_db -e "SELECT * FROM products;"`
### 🧠 Regra mental
🔸 `docker exec -i mysql [credenciais] [database]`
🔸 mysql = comando
🔸 outfit_db = argumento (banco)
### ✅ Boas práticas
🔸 Use TRUNCATE para reset rápido
🔸 Use DELETE quando precisar de controle fino
🔸 Evite usar DROP DATABASE sem necessidade
🔸 Sempre valide com SELECT antes e depois
# 🔎 Passo 7 — Testes
## API
```bash
curl http://localhost:9001/products
```
## Web
```
http://localhost:8888
```
---
# 🧠 Dicas importantes
* Nunca use `localhost` entre containers → use nome do serviço (`db`, `api`)
* Use volume Docker para MySQL (evita erro de permissão)
* Sempre reinicie após mudanças:
```bash
docker compose restart api
```
---
# 🏁 Resultado final
Você terá:
* API Node conectada ao MySQL
* PHP consumindo API
* Dados reais sendo exibidos
👉 Setup completo de ambiente full-stack com Docker 🚀