[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)

Duas aplicações no docker compartilhando o mesmo banco de dados

[Finalizado Pelo Aluno]

Carlos Alexandre Gomes
Criador Carlos Alexandre Gomes 03/07/2024

Olá, 

Estou usando o setup docker que você forneceu.

Rodou sem erros.

Só que surgiu uma necessidade minha de em vez de subir uma aplicação no docker, subir duas aplicações.

A primeira aplicação irá se comunicar com a segunda aplicação consumindo alguns serviços e ambas irão compartilhar o mesmo banco de dados.

Fiz algumas tentativas replicando toda a configuração da primeira aplicação para a segunda aplicação, modificando as portas do nginx.

Até funcionou, mas o banco não.

Você consegue me dizer com base nesse seu setup

Oque eu preciso fazer para rodar as duas aplicações compartilhando o mesmo banco de dados?

Obrigado!

Manager Carlos Ferreira 03/07/2024

Olá, Carlos! Tudo bem?

 

Neste caso, deixo as aplicações na mesma rede:

docker network create example-network;

 

docker-compose.yaml

db:

        image: mysql:8.0

        platform: linux/x86_64

        restart: unless-stopped

        environment:

            MYSQL_ROOT_PASSWORD: root

            MYSQL_ROOT_HOST: "%"

        ports:

            - 3308:3306

        volumes:

            - ./.docker/mysql8/dbdata:/var/lib/mysql8

        networks:

            - example-network

 

networks:

    example-network:

        external: true

        driver: bridge

Carlos Ferreira
Criador Carlos Alexandre Gomes 03/07/2024

Ola Carlos blz!


acho que não compreendi muito bem seu exemplo:
tentei colocar os dois mysql na mesma porta mas deu erro.

coloquei em portas diferentes funcionou porem não é o mesmo banco, são bancos diferentes

o nginx tabem parou de funcionar os dois host, agora so funciona o host app1 

coloquei alguns trechos dos arquivos  da minha configuração, como eu disse os mesmos arquivos que tem em app1 tem em app2, eu so mudei as portas.

host app1

version: "3.7"

services:
    # image project
    app:
        build:
            context: .
            dockerfile: Dockerfile
        restart: unless-stopped
        working_dir: /var/www/
        volumes:
            - ./:/var/www
        depends_on:
            - redis
        networks:
            - laravel

    # nginx
    nginx:
        image: nginx:alpine
        restart: unless-stopped
        ports:
            - "8989:80"
        volumes:
            - ./:/var/www
            - ./docker/nginx/:/etc/nginx/conf.d/
        networks:
            - laravel

 

laravel.conf app 1

location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;

 

host app2

version: "3.7"

services:
    # image project
    app2:
        build:
            context: .
            dockerfile: Dockerfile
        restart: unless-stopped
        working_dir: /var/www/
        volumes:
            - ./:/var/www
        depends_on:
            - redis
        networks:
            - laravel

    # nginx
    nginx:
        image: nginx:alpine
        restart: unless-stopped
        ports:
            - "8990:80"
        volumes:
            - ./:/var/www
            - ./docker/nginx/:/etc/nginx/conf.d/
        networks:
            - laravel


docker-compose.yml app 1

    # db mysql
    db:
        image: mysql:8.0.31
        restart: unless-stopped
        environment:
            MYSQL_DATABASE: ${DB_DATABASE:-banco_teste}          
            MYSQL_PASSWORD: ${DB_PASSWORD:-root}
            MYSQL_USER: ${DB_USERNAME:-adm_docker}
            MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:-root}
            MYSQL_ROOT_HOST: "%"
        volumes:
            - ./.docker/mysql/dbdata:/var/lib/mysql
        ports:
            - "3388:3306"
        networks:
            - laravel

 

docker-compose.yml app 2

    # db mysql
    db2:
        image: mysql:8.0.31
        restart: unless-stopped
        environment:
            MYSQL_DATABASE: ${DB_DATABASE:-banco_teste}          
            MYSQL_PASSWORD: ${DB_PASSWORD:-root}
            MYSQL_USER: ${DB_USERNAME:-adm_docker}
            MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:-root}
            MYSQL_ROOT_HOST: "%"
        volumes:
            - ./.docker/mysql/dbdata:/var/lib/mysql
        ports:
            - "3388:3306"
        networks:
            - laravel

 

 

Carlos Alexandre Gomes
Manager Carlos Ferreira 03/07/2024

A network está certa.

 

Agora em ambos os docker-compose.yml, a network precisa estar dessa forma:

networks:

    laravel:

        external: true

        driver: bridge

 

Dessa forma, vc vai conseguir chamar outro serviço definido no outro docker-compose.yaml

Carlos Ferreira
Criador Carlos Alexandre Gomes 03/07/2024

teste aqui, mas ainda não consegui funcionar

esse é o meu docker-compose.yml
tem a mesma configuração para as duas aplições a unica diferença que na referencia do nginx em cada arquivo esta com portas diferentes.
app1 rodando na porta 8989:80 e app2 rodando na porta 8990:80
http://localhost:8989/ funciona mas http://localhost:8990/ nao funciona   

version: "3.7"

services:
    # image project
    app:
        build:
            context: .
            dockerfile: Dockerfile
        restart: unless-stopped
        working_dir: /var/www/
        volumes:
            - ./:/var/www
        depends_on:
            - redis
        networks:
            - laravel

    # nginx
    nginx:
        image: nginx:alpine
        restart: unless-stopped
        ports:
            - "8990:80"
        volumes:
            - ./:/var/www
            - ./docker/nginx/:/etc/nginx/conf.d/
        networks:
            - laravel
    # queue
    queue:
        build:
            args:
                user: carlos
                uid: 1000
            context: ./
            dockerfile: Dockerfile
        restart: unless-stopped
        command: "php artisan queue:work"
        volumes:
            - ./:/var/www
        depends_on:
            - redis
        networks:
            - laravel    
                   
    # db mysql
    db:
        image: mysql:8.0
        restart: unless-stopped
        environment:
            MYSQL_DATABASE: ${DB_DATABASE:-banco_teste}          
            MYSQL_PASSWORD: ${DB_PASSWORD:-root}
            MYSQL_USER: ${DB_USERNAME:-adm_docker}
            MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:-root}
        volumes:
            - ./.docker/mysql/dbdata:/var/lib/mysql
        ports:
            - "3388:3306"
        networks:
            - laravel

    # PHPMyAdmin
    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        restart: unless-stopped
        ports:
            - "8080:80"
        environment:
            PMA_HOST: db
            PMA_PORT: 3306
            MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:-userpass}
        networks:
            - laravel

    # redis
    redis:
        image: redis:latest
        networks:
            - laravel
networks:
    laravel:
        external: true
        driver: bridge    

 

não sei se tenho que mudar alguma coisa no arquivo laravel.conf de cada aplicação, porque ja alterei as portas do nginx  mas ambas estão assim:

location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

 

 

 

 

 

 

 

 

 

Carlos Alexandre Gomes
Itamar chaves 03/07/2024

nao sei se resolveu seu problema, quando precisei usar mesmo banco com aplicações diferentes no docker eu criei um container mysql separado

Itamar chaves
Manager Carlos Ferreira 03/07/2024

O seu docker-compose.yaml do primeiro projeto está certo, do segundo precisa estar da mesma forma (usando portas diferentes, claro).

É importante deletar os containers primeiro (docker compose down), isso vai remover a antiga network que não é externa.

Em seus arquivos .env o DB_HOST será o mesmo: db

Carlos Ferreira
Criador Carlos Alexandre Gomes 03/07/2024

testei aqui e agora funcionou!


http://localhost:8989/
http://localhost:8990/

tem alguma configuração que eu possa fazer  para invez de usar
http://localhost:8989/
http://localhost:8990/

usar: 
http://application1.local
http://application2.local

obrigado!

Carlos Alexandre Gomes
Manager Carlos Ferreira 03/07/2024

Que bom que deu certo.

 

Até é possível fazer isso, mas vai te dar um bom trabalho, porque precisa criar um virtualhost no seu arquivo de hosts e direcionar através do nginx.

Como é local, recomendo acessar pela porta mesmo, é assim que acesso normalmente.

Carlos Ferreira
Albert Reis da Cruz 03/07/2024

porque voce nao usa o portainer com traefik? Com isso vc consegue rodar várias aplicacoes no mesmo droplet. Geralmente assim: producao.seudominio.com e homologa.seudominio.com;

Albert Reis da Cruz
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!