使用Docker的Nginx配置出现问题

时间:2019-03-27 11:50:54

标签: docker nginx

我开始使用docker进行一些测试,以设置自己的服务器,但我遇到了一些问题。

我使用nginx-fpm映像,该映像具有设置服务器所需的大多数服务。

这是我为设置基本服务器所做的Dockerfile。我完美地构建了它,没有任何问题,并将其命名为nginx-custom-server

Dockerfile

FROM "richarvey/nginx-php-fpm"

ADD /conf/simple-project.conf /etc/nginx/sites-available/simple-project.conf

RUN mkdir /srv/www/
RUN mkdir /LOGS/
RUN ln -s /etc/nginx/sites-available/simple-project.conf /etc/nginx/sites-enabled/simple-project.conf
RUN rm /etc/nginx/sites-enabled/default.conf

CMD ["/start.sh"]

我通过终端使用以下命令运行它。

docker run --name=server-stack -v /home/ismael/Documentos/docker-nginx/code:/srv/www -v /home/ismael/Documentos/docker-nginx/logs:/LOGS -p 80:80 -d nginx-custom-server:stack

/srv/www文件夹中,有一个简单的hello world php。我想在本地计算机上更改代码,然后使用共享文件夹code将其与docker容器同步。

nginx日志为空,所以我不知道出了什么问题。我在conf中设置了日志,但是nginx并未创建日志,所以我认为我认为一般的nginx conf存在问题。

这是我在打招呼世界中使用的conf。我也将此服务器名称映射到主机的主机中。

simple-project.conf

server {
    listen 0.0.0.0:80;
    server_name simple-project.olive.com;
    root /srv/www/simple-project/;

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

    location ~ ^/index\.php(/|$) {
        # the ubuntu default
        fastcgi_pass   /var/run/php-fpm.sock:9000;

        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;

        fastcgi_param APPLICATION_ENV int;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;
    }

    location ~ \.php$ {
        return 404;
    }

    error_log /LOGS/custom_error.log;
    access_log /LOGS/custom_access.log;
}

EDIT:尝试访问Docker容器内的服务器时出错。

  

bash-4.4#wget localhost:80> /tmp/output.html   --2019-03-27 12:33:11-- http://localhost/正在解析localhost ... 127.0.0.1,:: 1连接到localhost | 127.0.0.1 |:80 ...失败:连接被拒绝。连接到localhost | :: 1 |:80 ...失败:地址   无法使用。重试。

1 个答案:

答案 0 :(得分:2)

据我所知,有两个原因导致您无法访问服务器。

第一个是您不将任何端口从容器转发到主机。您应该在-p 80:80命令中加入docker run参数。

第二个是您正在尝试侦听我假设是容器本身的IP的信息,它不是静态的(默认情况下)。在nginx配置中,应将listen 172.17.0.2:80;替换为listen 0.0.0.0:80;

完成这两个修改后,您应该能够访问服务器。

另一种方法(但不推荐)是使用--network=host参数启动容器。这样,主机的网络实际上可以从容器中看到。在这种情况下,您只需要将nginx配置设置为侦听有效地址即可。

但是,如果问题仍然存在,一种好的方法是在容器运行时运行docker exec -it {$container_id} bash,并查看是否可以从容器本身内部访问服务器。这意味着服务器可以正常运行,但是由于其他原因,端口未正确转发到主机。