Docker curl:(7)无法连接到localhost端口80:连接被拒绝

时间:2017-02-09 15:09:00

标签: docker docker-compose

我从本机主机执行

  

$ curl localhost

     

     

$ curl

     

http://usuariointerno:governance@beneficiarios.dev/app_dev.php/actividad

     

并回应它。

如果从容器名称执行" php"并且:

  

$ curl localhost --ipv4

     

无法连接到localhost端口80:拒绝连接

  

$卷曲   http://usuariointerno:governance@beneficiarios.dev/app_dev.php/actividad

     

卷曲:(7)无法连接到localhost端口80:拒绝连接

当从docker容器faill连接时,如果在docker容器之外连接就可以了,它的问题是什么?

搬运工-撰写:



version: '2'
services:
  php:
    container_name: php
    build: ./php
    volumes:
      - ./www/:/var/www/html/
      - ./php/.bashrc:/root/.bashrc
      - ./php/.gitconfig:/root/.gitconfig
    depends_on:
      - postgres
      - mysql

  nginx:
    container_name: nginx
    image: nginx
    ports:
      - 80:80
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      - ./www/:/var/www/html/
      - ./logs:/var/log/nginx
    depends_on:
      - php
    
  postgres:
    container_name: postgres
    image: postgres:9.5.5
    volumes:
      - ./data/postgresql:/var/lib/postgresql/data
      - ./postgres/dumps:/dumps
    environment: 
     - POSTGRES_PASSWORD=0000
     - POSTGRES_USER=postgres

  mysql:
    container_name: mysql
    image: mysql:5.7.16
    volumes:
      - ./data/mysql:/var/lib/mysql
    environment: 
      - MYSQL_ROOT_PASSWORD=0000




nginx.conf



server {
    listen 80;
    server_name beneficiarios.dev;
    root /var/www/html/beneficiarios/web;
    
    
    add_header Access-Control-Allow-Origin *;

    location / { try_files $uri /app.php$is_args$args;}
   
   #dev
    location ~ ^/(app_dev|config)\.php(/|$) {
        add_header Access-Control-Allow-Origin *;
        fastcgi_buffers 16 256k; 
        fastcgi_buffer_size 256k;
        fastcgi_pass php:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
       
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
    }

    location ~ ^/app\.php(/|$) {
        fastcgi_buffers 16 256k; 
        fastcgi_buffer_size 256k;
        fastcgi_pass php:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
       
        internal;
    }

    location ~ \.php$ {
      return 404;
    }

    error_log /var/log/nginx/project_error.log;
    access_log /var/log/nginx/project_access.log;
}




1 个答案:

答案 0 :(得分:5)

Localhost或127.0.0.1始终表示与当前正在运行的命令相同的主机。因此,在您的主机上,它会调用您的主机,但是当您在容器内运行时,它将调用您的容器。

我将假设您有一个DNS解析器,将.dev域指向localhost。 nginx容器有来自主机的端口80转发给它,所以就像它在主机上运行一样。因此,当您从主机呼叫时,它会成功,因为呼叫将转到主机的端口80。

但是当你在php容器中调用它时,它不会调用你的主机,它正在调用你的php容器的80端口,你没有在你的php容器内运行的web服务器。如果你在你的nginx容器中进行了这个调用,那就可以了。

你应该问问自己为什么你的php容器需要调用你的nginx容器,这听起来很奇怪,因为通常nginx只会将“工作”转发给php。例如,您是否可以创建一个可以执行所需操作的PHP脚本并直接调用它?

如果您确实需要调用nginx,请记住,来自同一docker-compose.yml文件的容器可以按名称相互调用,因此您只需使用nignx作为主机名。