Docker的Apache和Nginx的端口冲突

描述

我有一个项目,具有以下configuration:

1)主要网站是用PHP编写的

2)API是用NodeJS编写的

由于我在几台运行不同操作系统的机器上开发,所以我决定使用docker,这样我就可以在任何机器上运行项目。

我试图让nginx作为反向代理服务器API和网站在以下方式:

1)example.com – >网站

2)api.example.com – > API

但是,即使我没有暴露它,Apache似乎也自动分配端口80。 这会导致与nginx运行在同一个盒子上的冲突。 有没有办法阻止apache / php自动绑定到主机的端口80。

我试图将端口映射到不同的端口,但是这导致apache / php简单地添加一个额外的端口,如下所示:

docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fc830d3562e4 apache_website "docker-php-entrypoin" 3 seconds ago Up 2 seconds 80/tcp, 0.0.0.0:80->8000/tcp apache_website_run_7 

docker – 撰写文件

 version: '2' services: nginx: build: nginx ports: - "80:80" expose: - "80" restart: always depends_on: - website - api api: image: node command: node /var/www/index.js restart: always website: build: php:7.1-apache ports: - "80:800" restart: unless-stopped 

nginx的dockerfile

  FROM nginx COPY nginx.conf /etc/nginx/nginx.conf EXPOSE 80 

nginxconfiguration文件

 worker_processes 4; events { worker_connections 1024; } http { include mime.types; # fallback in case we can't determine a type default_type application/octet-stream; upstream example.com { server website:80 fail_timeout=0; } server { listen 80; client_max_body_size 4G; keepalive_timeout 5; root /opt/app/public; location / { try_files $uri @proxy_to_app; } server_name example.com; location @proxy_to_app { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://example.com; } error_page 500 502 503 504 /500.html; location = /500.html { root /opt/app/public; } } # API #======================================================================== upstream api.example.com { server api:80 fail_timeout=0; } server { listen 80; client_max_body_size 4G; keepalive_timeout 5; root /opt/app/public; location / { try_files $uri @proxy_to_app; } server_name api.example.com; location @proxy_to_app { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://api.example.com; } error_page 500 502 503 504 /500.html; location = /500.html { root /opt/app/public; } } } 

如何防止Apache / PHP绑定到主机的端口80? 我想保留端口之间的容器间连接,但我不希望该端口暴露给主机。

我想只为nginx公开端口80。

请注意,我知道我们可以通过更改ports.config文件来改变apache的configuration,使其监听不同的端口,因为我认为这是一个黑客攻击。 但是我不想这样做。 如果可能,我想使用docker进行修改。

我不明白为什么在没有我指定在docker-compose文件中的端口被暴露。

https://docs.docker.com/compose/compose-file/#/ports解释主机端口是第一位的。 你是暴露端口80为nginx 为Apache。 对于nginx而言,您将容器80显示为主机80,并将apache容器800显示为端口80。

可能你刚刚得到了相反的数字。