带有多个Nginx实例的Docker共享网络,提供了随机的Nginx实例

时间:2019-05-16 10:39:02

标签: docker docker-compose

我正在使用以下2个docker-compose文件设置以下docker容器:

version:  '3.7'
services:
    mysql:
        image: mysql:5.7
        restart: on-failure
        environment:
            MYSQL_DATABASE: ${MYSQL_DATABASE}
            MYSQL_USER: ${MYSQL_USER}
            MYSQL_PASSWORD: ${MYSQL_PASSWORD}
            MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
        volumes:
            - db_data:/var/lib/mysql:rw
        ports:
            - '${MYSQL_PORT}:3306'
        networks:
            - shared_mysql
    php:
        build:
            context: .
            dockerfile: docker/php/Dockerfile
        restart: on-failure
        volumes:
            - '../:/usr/src/app'
        user: ${LOCAL_USER}
        networks:
            - shared_mysql
    api_nginx:
        image: nginx:1.15.3-alpine
        restart: on-failure
        volumes:
            - '../public/:/usr/src/app'
            - './docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro'
        ports:
            - '21180:80'
        depends_on:
            - php
        networks:
            - shared_mysql
    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        restart: on-failure
        ports:
            - '${PHPMYADMIN_PORT}:80'
        environment:
            PMA_HOST: mysql
            MYSQL_USERNAME: ${MYSQL_USER}
            MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}
        networks:
            - shared_mysql

volumes:
    db_data:

networks:
    shared_mysql:
version:  '3.7'
services:
    php:
        build:
            context: .
            dockerfile: docker/php/Dockerfile
        restart: on-failure
        volumes:
            - '../:/usr/src/app'
        user: ${LOCAL_USER}
        networks:
            - api_21s_shared_mysql
    auth_nginx:
        image: nginx:1.15.3-alpine
        restart: on-failure
        volumes:
            - '../public/:/usr/src/app'
            - './docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro'
        ports:
            - '21181:80'
        depends_on:
            - php
        networks:
            - api_21s_shared_mysql

volumes:
    db_data:

networks:
    api_21s_shared_mysql:
        external: true

访问http://localhost:21181/时,我总是会获得正确的网站。

但是当我访问http://localhost:21182/时,我会随机得到http://localhost:21181/http://localhost:21182/

我试图单独设置网络。

我希望它与端口号一起使用,但我不希望它们混在一起。

我希望有人能帮助我。预先谢谢你。

2 个答案:

答案 0 :(得分:0)

如果您使用Chrome浏览器,则是因为Chrome浏览器缓存页面的方式。如果您使用其他具有已清除缓存的浏览器(例如Firefox),则不会遇到问题。

也可以在隐身(私有)模式下使用Chrome来解决缓存问题。

答案 1 :(得分:0)

使用docker-compose启动服务时,可以通过多种方式在docker网络中发现它们:按服务名称,按容器名称,按IP等。

在您的情况下,请按服务名称使用发现,因为在您的nginx配置中,引用为“ php:9000”。

这时,docker查找名为“ php”的服务并找到2。它将解释为同一服务的副本,并按照轮询模式向其发送流量(第一个请求到服务的第一个实例,第二个请求到服务的第一个实例)服务的第二个实例,第一个实例的第三个实例,第二个实例的第二个实例,等等。

解决方案

以不同的方式命名服务,就像您已经使用nginx服务(auth_nginx和api_nginx)一样。

然后在default.conf中为这两个服务更改对应于php:9000的行。