Usando redes no Docker Compose file

1

Estou tentando entender como os contêineres conversam entre si com o Docker Compose.

Estou trabalhando em uma VM sem nome de domínio, então eu uso o endereço IP: porta.

Eu quero um aplicativo Wordpress simples usando as imagens padrão: wordpress:php5.6-fpm-alpine , mariadb , nginx . Além disso, quero um contêiner phpMyAdmin com seu próprio docker-compose.yml , vinculando ao contêiner MariaDB.

história curta

Consegui fazê-lo funcionar com links .

Depois tentei configurar, mas recebi um erro dizendo que eles não estão na mesma rede. Eu sei que provavelmente poderia ter ido com --link na linha de comando, mas isso não é divertido.

Então, percebi que as diretivas networks servem para isso e reescrevi meu docker-compose.yml .

Aqui está o trabalho docker-compose.yml para o meu aplicativo Wordpress (apenas o material relevante)

services:
    blog:
        (skip)
        networks:
          - maria_net
          - app_net

    db:
        (skip)
        networks:
          - maria_net

    web:
        (skip)
        networks:
         - app_net

networks:
    app_net:
    maria_net:

O aplicativo expõe a porta 8080, onde o nginx está escutando.

Eu preciso dizer ao nginx para solicitações php de proxy no contêiner blog , onde php-fpm está escutando na porta 9000.

Os arquivos conf para nginx são enviados no /etc/nginx/conf.d do contêiner.

O que faz:

  • define um upstream apontando para a porta 9000 do contêiner blog ( php-fpm ),
  • define root para arquivos estáticos em / var / www / html, que é um volume compartilhado com o contêiner blog
  • solicita proxies em arquivos php para o upstream

amostra nginx/conf.d/default.conf

upstream backend {
    server blog:9000;
}

server {
    listen 80;

    root /var/www/html;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        (...more fastcgi_param...)
        fastcgi_pass backend;
    }
}

Com essa configuração, o Docker cuida de tornar os contêineres na mesma rede visíveis um para o outro em seus nomes de serviço e, quando eu acessei o IP da minha VM na porta 8080, chego à instalação do Wordpress.

phpmyadmin

Agora tento conectar um contêiner phpMyAdmin ao MariaDB.

docker-compose.yml

version: '3'

services:
    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        networks:
          - maria_net
        environment:
         - PMA_ARBITRARY=1
        restart: always
        ports:
         - 8081:80
        volumes:
         - /sessions
        environment:
          - PMA_HOST='db'
          - PMA_USER=root
          - PMA_PASSWORD=azerty

networks:
    maria_net:

phpMyAdmin realmente escuta no @ 8081, mas ele diz que não pode se conectar ao host db .

O que é normal, como descobri:

user@host $ docker network ls
NETWORK ID          NAME                   DRIVER              SCOPE
3fbb92bac6dc        blog_app_net           bridge              local
fa0ef0ee1a64        blog_maria_net         bridge              local
3b4cd3956119        bridge                 bridge              local
820bc4c6c844        host                   host                local
17b010e55091        none                   null                local
79bcc3149270        phpmyadmin_maria_net   bridge              local

phpMyAdmin e MariaDB têm seus mariadb_net ...

Eu RTFM novamente e descobri que de dentro do Docker Compose, você precisa especificar que deseja se conectar a uma rede existente com external (o nome real da rede conforme listado por docker network ls ):

networks:
    maria_net:
      external:
        name: blog_maria_net

Agora os containers phpmyadmin e mariadb estão na mesma rede:

$ docker network inspect blog_maria_net
[
    {
        "Name": "blog_maria_net",
        "Id": "fa0ef0ee1a6479fba0ed60dc01480a5f2200ff1ab37de511f9a2e55caa238bb1",
        "Created": "2017-07-02T13:01:08.473871818+02:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "Containers": {
            "1b0241ed5609f541e60f23717d1cfd55ded4a272536ad417c33e57c573ffec72": {
                "Name": "blog_blog_1",
                "EndpointID": "9e4fd814799cce653299f0751af51482e9f40e15d73bc213af9f120bd7d0f143",
                "MacAddress": "02:42:ac:13:00:03",
                "IPv4Address": "172.19.0.3/16",
                "IPv6Address": ""
            },
            "af6a790c667ba6576ebd056f8166a46d8da7cd1d2704a91e45b93d6d7c945e28": {
                "Name": "blog_db_1",
                "EndpointID": "a9e5d3489f8b156385d1c81c34b6b712708715803080f8b75651ba1bc8fdd039",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            },
            "ccaf49d12d928a455c50be33e607e731bb1045f2afe9003c4d22a914af604923": {
                "Name": "phpmyadmin_phpmyadmin_1",
                "EndpointID": "8cfc3efa3654040fdaaa4ffa16643cfab838602d9eead3d14d40c0dd8fd45fe8",
                "MacAddress": "02:42:ac:13:00:04",
                "IPv4Address": "172.19.0.4/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "maria_net",
            "com.docker.compose.project": "blog"
        }
    }
]

E o contêiner mariadb é aliased db conforme o nome do serviço:

$ docker inspect blog_db_1
(...)
"Networks": {
    "blog_maria_net": {
        "IPAMConfig": null,
        "Links": null,
        "Aliases": [
            "af6a790c667b",
            "db"
        ],
        "NetworkID": "fa0ef0ee1a6479fba0ed60dc01480a5f2200ff1ab37de511f9a2e55caa238bb1",
        "EndpointID": "a9e5d3489f8b156385d1c81c34b6b712708715803080f8b75651ba1bc8fdd039",
        "Gateway": "172.19.0.1",
        "IPAddress": "172.19.0.2",
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "MacAddress": "02:42:ac:13:00:02"
    }
}

Mas o phpMyAdmin ainda não consegue se conectar ao host db:

MySQL a répondu : Documentation

#2005 - Unknown MySQL server host ''db'' (-2)

A aspa dupla pode ser o problema ...

    
por Manumie 02.07.2017 / 12:30

1 resposta

0

Na verdade, foi a citação: eu configurei a variável de ambiente para o db com aspas, que são escapadas pelo phpmyadmin, então, em vez de conectar ao host db , ele tenta se conectar a 'db' :

- PMA_HOST='db'

Deve ser:

- PMA_HOST=db

Esse foi um problema bem manco, mas a coisa toda sobre as redes no Compose não está muito clara, e eu espero que finalmente conseguir um conf trabalhando ajude os outros.

    
por 02.07.2017 / 13:39