如何从dockerised nginx

时间:2016-08-29 09:35:37

标签: nginx docker

我在docker容器中有nginx,在另一个docker容器中有一个nodejs webapp。 可以从端口8080上的主机服务器访问nodejs服务器。

nginx docker容器正在侦听端口80(稍后将执行证书,首先此基础必须正常工作)。

现在我希望将子域名转发到此8080 nodejs应用程序。让我们说app1.example.com

从外面我可以通过te server ip(或主机名)和端口8080到达app,但不能在app1.example.com上访问。它确实适用于app1.example.com:8080(我在主机服务器上打开了端口8080)。

接近app1.example.com时收到错误的网关nginx消息所以我进入第一个nginx容器,但是我如何回到主机服务器代理将其传递到主机服务器的端口8080(而不是nginx容器的端口8080)。寻找反向EXPOSE语法。

主要问题是,当然如果我使用ip和端口127.0.0.1:8080,它将尝试使用nginx容器.... 那么如何让nginx容器路由回到主机127.0.0.1:8080?

我已经尝试过0.0.0.0并定义了一个上游,实际上一直在谷歌搜索,并尝试了很多配置......但还没有找到一个工作....

修改 刚刚发现,这个docker命令可能有所帮助:

sudo docker network inspect bridge

这显示了cotainers中使用的IP地址(在我的情况下为172.17..0.2),但不确定每次docker重启时此地址都保持不变...(例如服务器重启)

修改 我现在接受碱性回答(但仍然没有工作):

我的docker-compose.yml文件:

version: "2"
services:
  nginx:
    container_name: nginx
    image: nginx_img
    build: ../docker-nginx-1/
    ports:
      - "80:80"
    networks:
      - backbone
  nodejs:
    container_name: nodejs
    image: merites/docker-simple-node-server
    build: ../docker-simple-node-server/
    networks:
    - backbone
    expose: 
    - 8080
  networks:
    backbone:
      driver: bridge

和我的nginx(为简单起见,跳过了conf.d文件夹中的包含):

worker_processes 1;

events {worker_connections 1024; }

http {

  sendfile on;

  upstream upsrv {
      server nodejs:8080;
  }

  server {

    listen 80;
    server_name  app1.example.com;

    location / {
        proxy_pass http://upsrv;
    }

  }
}

编辑31-08-2016

这个migth是问题所在,名称不是主干,而是在文件夹启动之后调用来自:

sudo docker network ls

out puts:

NETWORK ID          NAME                       DRIVER              SCOPE
1167c2b0ec31        bridge                     bridge              local               
d06ffaf26fe2        dockerservices1_backbone   bridge              local               
5e4ec13d790a        host                       host                local               
7d1f8c32f259        none                       null                local 

编辑01-09-2016

这可能是由于我的nginx docker容器设置方式造成的?

这是我使用的docker文件:

############################################################
# Dockerfile to build Nginx Installed Containers
# Based on Ubuntu
############################################################

# Set the base image to Ubuntu
FROM ubuntu

# File Author / Maintainer
MAINTAINER Maintaner Name

# Install Nginx

# Add application repository URL to the default sources
# RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main     universe"     >> /etc/apt/sources.list

# Update the repository
RUN apt-get update

# Install necessary tools
RUN apt-get install -y nano wget dialog net-tools

# Download and Install Nginx
RUN apt-get install -y nginx  

# Remove the default Nginx configuration file
RUN rm -v /etc/nginx/nginx.conf

# Copy a configuration file from the current directory
ADD nginx.conf /etc/nginx/

# Append "daemon off;" to the beginning of the configuration
RUN echo "daemon off;" >> /etc/nginx/nginx.conf

# Expose ports
EXPOSE 80

# Set the default command to execute
# when creating a new container
CMD service nginx start

我的最终解决方案1月1日。 2016

我现在使用了这个撰写文件:

version: "2"
services:
    nginx:
      image: nginx
      container_name: nginx
      volumes:
        - ./nginx-configs:/etc/nginx/conf.d
      ports:
        - "80:80"
      networks:
        - backbone
    nodejs:
      container_name: nodejs
      image: merites/docker-simple-node-server
      build: ../docker-simple-node-server/
      networks:
        - backbone
      expose: 
        - 8080
networks:
  backbone:
    driver: bridge

在项目文件夹中,从你运行docker-compose up -d,我添加了一个名为nginx-configs的文件夹。此文件夹将覆盖' nginx容器中名为/etc/nginx/conf.d

的所有文件

因此我在添加此卷装之前从nginx容器复制了default.cfg。使用命令:

docker exec -t -i container_name / bin / bash

而不是cat /etc/nginx/conf.d/default.conf

并使用nginx配置在项目文件夹中添加了相同的default.conf。

除了默认情况,我添加了带有以下内容的app1.conf:

upstream upsrv1 {
    server nodejs:8080;
}

server {

    listen 80;
    server_name  app1.example.com;


    location / {
        proxy_pass http://upsrv1;
    }

}

这样,我可以轻松添加第二个应用程序......第三个等等。

所以基础知识现在正在运作......

1 个答案:

答案 0 :(得分:7)

这是最佳做法。仅将端口80暴露在主机外部。 nodejs app可以位于只能通过nginx访问的专用网络中。

version: "2"
services:
    nginx:
      ...
      ports:
        - "80:80"
      networks:
        - backbone
    nodejs:
      ...
      networks:
        - backbone
      expose: 
        - 8080

networks:
  backbone:
    driver: bridge

在您的nginx.conf文件中,上游服务器可以列为nodejs:8080。 docker守护程序会将其解析为正确的内部IP。