{"id":50675613,"url":"https://github.com/giljr/docker_review","last_synced_at":"2026-06-08T15:33:06.004Z","repository":{"id":354029939,"uuid":"1221810804","full_name":"giljr/docker_review","owner":"giljr","description":"Updated this project #01 https://medium.com/jungletronics/docker-on-ubuntu-project-1-511817acaa88","archived":false,"fork":false,"pushed_at":"2026-04-26T19:10:35.000Z","size":27,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-26T21:14:33.792Z","etag":null,"topics":["docker","docker-compose","mysql-database","nodejs","php"],"latest_commit_sha":null,"homepage":"https://medium.com/jungletronics/docker-on-ubuntu-project-1-511817acaa88","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/giljr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-26T17:57:59.000Z","updated_at":"2026-04-26T19:26:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/giljr/docker_review","commit_stats":null,"previous_names":["giljr/docker_review"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/giljr/docker_review","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/giljr%2Fdocker_review","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/giljr%2Fdocker_review/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/giljr%2Fdocker_review/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/giljr%2Fdocker_review/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/giljr","download_url":"https://codeload.github.com/giljr/docker_review/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/giljr%2Fdocker_review/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34069491,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-08T02:00:07.615Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","docker-compose","mysql-database","nodejs","php"],"created_at":"2026-06-08T15:33:04.289Z","updated_at":"2026-06-08T15:33:05.998Z","avatar_url":"https://github.com/giljr.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🚀 Guia Completo: Docker Compose (MySQL + Node API + PHP)\n\nEste guia mostra passo a passo como subir um ambiente full-stack usando Docker Compose com:\n\n* MySQL\n* API Node.js\n* PHP (Apache)\n\n---\n\n# 📁 Estrutura do Projeto\n\n```\nproj_01/\n├── api/\n│   ├── src/\n│   │   └── index.js\n│   ├── db/\n│   │   └── script.sql\n│   └── package.json\n├── website/\n│   └── index.php\n└── docker-compose.yml\n```\n\n---\n\n# ⚙️ docker-compose.yml\n\n```yaml\nservices:\n  db:\n    image: mysql:8.0\n    container_name: mysql-container\n    command: --default-authentication-plugin=mysql_native_password\n    environment:\n      MYSQL_ROOT_PASSWORD: jaythree\n    volumes:\n      - db-data:/var/lib/mysql\n    restart: always\n\n  api:\n    image: node:18\n    container_name: node-container\n    working_dir: /home/node/app\n    volumes:\n      - ./api:/home/node/app\n    command: sh -c \"npm install \u0026\u0026 node src/index.js\"\n    ports:\n      - \"9001:9001\"\n    depends_on:\n      - db\n\n  web:\n    image: php:8.2-apache\n    container_name: php-container\n    restart: always\n    volumes:\n      - ./website:/var/www/html\n    ports:\n      - \"8888:80\"\n    depends_on:\n      - db\n      - api\n\nvolumes:\n  db-data:\n```\n\n---\n\n# 🧠 Passo 1 — Criar estrutura\n\n```bash\nmkdir proj_01 \u0026\u0026 cd proj_01\nmkdir -p api/src api/db website\n```\n\n---\n\n# 📦 Passo 2 — API Node\n\n```bash\ncd api\nnpm init -y\nnpm install express mysql\n```\n\n## 📄 src/index.js\n\n```js\nconst express = require('express')\nconst mysql = require('mysql')\n\nconst app = express()\nlet connection\n\nfunction connectWithRetry() {\n  connection = mysql.createConnection({\n    host: 'db',\n    user: 'root',\n    password: 'jaythree',\n    database: 'outfit_db'\n  })\n\n  connection.connect((err) =\u003e {\n    if (err) {\n      console.log('MySQL não pronto, tentando novamente...')\n      setTimeout(connectWithRetry, 3000)\n    } else {\n      console.log('Conectado ao MySQL')\n    }\n  })\n}\n\nconnectWithRetry()\n\napp.get('/products', (req, res) =\u003e {\n  connection.query('SELECT * FROM products', (err, results) =\u003e {\n    if (err) return res.status(500).json(err)\n    res.json(results)\n  })\n})\n\napp.listen(9001, '0.0.0.0', () =\u003e {\n  console.log('API rodando na porta 9001')\n})\n```\n\n---\n\n# 🗄️ Passo 3 — Script SQL\n\n## api/db/script.sql\n\n```sql\nCREATE DATABASE IF NOT EXISTS outfit_db;\nUSE outfit_db;\n\nCREATE TABLE IF NOT EXISTS products (\n    id INT AUTO_INCREMENT PRIMARY KEY,\n    sales_code INT NOT NULL,\n    date DATE NOT NULL,\n    store_id VARCHAR(255),\n    product VARCHAR(255),\n    qty INT NOT NULL,\n    unit_price DECIMAL(10,2)\n);\n\nINSERT INTO products (sales_code, date, store_id, product, qty, unit_price) VALUES\n(65014, '2019-01-12', 'Shopping Morumbi', 'Aster Pants', 5, 114),\n(65014, '2019-01-12', 'Shopping Morumbi', 'Trench Coat', 1, 269),\n(65016, '2019-01-12', 'Iguatemi Campinas', 'Peter Pan Collar', 2, 363);\n```\n\n---\n\n# 🌐 Passo 4 — PHP\n\n## website/index.php\n\n```php\n\u003c?php\n$result = file_get_contents(\"http://api:9001/products\");\n$products = json_decode($result);\n?\u003e\n\n\u003ctable border=\"1\"\u003e\n\u003ctr\u003e\u003cth\u003eProduto\u003c/th\u003e\u003cth\u003ePreço\u003c/th\u003e\u003c/tr\u003e\n\u003c?php if ($products): ?\u003e\n\u003c?php foreach($products as $p): ?\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003c?= $p-\u003eproduct ?\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c?= $p-\u003eunit_price ?\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c?php endforeach; ?\u003e\n\u003c?php endif; ?\u003e\n\u003c/table\u003e\n```\n\n---\n\n# 🚀 Passo 5 — Subir containers\n\n```bash\ndocker compose down -v\ndocker compose up --build\n```\n\n---\n\n# 🧪 Passo 6 — Popular banco\n\n```bash\ndocker exec -i mysql-container mysql -uroot -pjaythree outfit_db \u003c api/db/script.sql\n```\n👉 Confere como **verificar** e **deletar** dados no MySQL de forma correta:\n\nNo terminal: `docker exec -it mysql-container mysql -uroot -pjaythree`\n\n#### 🔎 Verificar dados\n\n🔸 Selecionar o banco: `USE outfit_db;`\n\n🔸 Listar tabelas: `SHOW TABLES;`\n\n🔸 Visualizar dados: `SELECT * FROM products;`\n\n #### 🧹 Deletar dados\n🔸 Limpar todos os registros (mantém a tabela): `TRUNCATE TABLE products;`\n\n🔸 Deletar registros específicos: `DELETE FROM products WHERE id = 1;`\n\n🔸 Remover a tabela inteira: `DROP TABLE products;`\n\n🔸 Apagar o banco completo: `DROP DATABASE outfit_db;`\n\n### 🫶  Exemplos Pro (direto do terminal)\n🔸 Ver tabelas: `docker exec -i mysql-container mysql -uroot -pjaythree outfit_db -e \"SHOW TABLES;\"`\n\n🔸 Ver dados:`docker exec -i mysql-container mysql -uroot -pjaythree outfit_db -e \"SELECT * FROM products;\"`\n\n### 🧠 Regra mental\n🔸 `docker exec -i \u003ccontainer\u003e mysql [credenciais] [database]`\n\n🔸 mysql = comando\n\n🔸 outfit_db = argumento (banco)\n\n### ✅ Boas práticas\n\n\n🔸 Use TRUNCATE para reset rápido\n\n🔸 Use DELETE quando precisar de controle fino\n\n🔸 Evite usar DROP DATABASE sem necessidade\n\n🔸 Sempre valide com SELECT antes e depois\n\n# 🔎 Passo 7 — Testes\n\n## API\n\n```bash\ncurl http://localhost:9001/products\n```\n\n## Web\n\n```\nhttp://localhost:8888\n```\n\n---\n\n# 🧠 Dicas importantes\n\n* Nunca use `localhost` entre containers → use nome do serviço (`db`, `api`)\n* Use volume Docker para MySQL (evita erro de permissão)\n* Sempre reinicie após mudanças:\n\n```bash\ndocker compose restart api\n```\n\n---\n\n# 🏁 Resultado final\n\nVocê terá:\n\n* API Node conectada ao MySQL\n* PHP consumindo API\n* Dados reais sendo exibidos\n\n👉 Setup completo de ambiente full-stack com Docker 🚀\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgiljr%2Fdocker_review","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgiljr%2Fdocker_review","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgiljr%2Fdocker_review/lists"}