几个php docker容器之间的通信

时间:2019-01-15 15:03:13

标签: php docker nginx docker-compose containers

我有几个php服务器,我们将它们命名为api1,api2。我已经设置了docker-compose文件,该文件可以与nginx链接成功运行它们,因此可以从主机访问它们并且工作正常。

这是我的docker-compose.yml的示例:

version: "3.5"
services:
nginx:
    user: "root:root"
    image: nginx:stable
    container_name: nginx
    ports:
        - "80:80"
        - "443:443"
    volumes:
        - ./cert:/etc/nginx/ssl/
        - ./vhosts/:/etc/nginx/conf.d/:cached
        - ./logs/nginx:/var/log/nginx:cached
        - ${ACCOUNT_PATH}:/var/www/api1:cached
        - ${ACCOUNT_API_PATH}:/var/www/api2:cached
api1:
    image: php-fpm-image
    build:
        context: "."
        dockerfile: "./images/api1/Dockerfile"
    user: "root:root"
    container_name: account
    working_dir:  /var/www/api1/
    volumes:
        - api1path/:/var/www/api1
api2:
    image: php-fpm-image
    build:
        context: "."
        dockerfile: "./images/api2/Dockerfile"
    user: "root:root"
    container_name: api2
    working_dir:  /var/www/api2/
    volumes:
        - api2:/var/www/api2:cached
networks:
    default:
       name: domain.com
       driver: bridge

与此docker-compose文件关联以进行功能测试:

     version: '3.5'
     services:
        apitests:
           image: apitests:latest
           container_name: api_tests
           volumes:
             - ./config/:/opt/project/config/
             - ./test_reports/screenshots:/root/.selene/screenshots/
     networks:
       default:
       driver: bridge
       external:
          name: domain.com

可以从主机访问以下域:

  

api1.domain.com 127.0.0.1

     

api2.domain.com 127.0.0.1

我的问题是如何直接在docker内部连接它们,因为我需要执行从api1到api2,从apitests到api1,api2的请求。

当我请求时,他们的域直接解析到了他们的容器,所以我收到下一个错误

  

无法连接到远程主机(172.21.0.8):连接被拒绝

来自任何容器。

如您所知,我需要将其域解析为NGINX容器,以便它可以正常工作,并且php-fpm可以通过nginx将结果返回给我。

我该如何实现?

2 个答案:

答案 0 :(得分:2)

您的问题似乎是,当您的要求是为nginx容器分配此域名时,您已将php容器命名为api1.domain.com。

您可以在容器网络中为nginx分配api1 / api2别名。

services:
   nginx:
      networks:
        default:
          aliases:
            - api1
            - api2

答案 1 :(得分:0)

如果我说对了,则您有几个docker-compose.yml文件,需要它们提供服务才能彼此交互。逻辑建议是建立一个全球定义的网络,

docker network create testapis

并已将所有服务链接到它:

docker-compose.yml

...
networks:
  default:
    external: 
      name: testapis

在这种情况下,所有docker-compose文件中的所有服务都将以其主机名(api1api2等)相互查看,并且不需要暴露端口(除非您希望使用该网外的服务)