Làm cách nào để định cấu hình ánh xạ cổng Docker để sử dụng Nginx làm proxy ngược dòng?


86

Cập nhật II

Bây giờ là ngày 16 tháng 7 năm 2015 và mọi thứ đã thay đổi một lần nữa. Tôi đã phát hiện ra thùng chứa tự động này từ Jason Wilder : https://github.com/jwilder/nginx-proxyvà nó giải quyết vấn đề này trong khoảng thời gian cần đến docker runthùng chứa. Đây là giải pháp tôi đang sử dụng để giải quyết vấn đề này.

Cập nhật

Bây giờ là tháng 7 năm 2015 và mọi thứ đã thay đổi đáng kể liên quan đến việc kết nối các vùng chứa Docker. Hiện nay có nhiều dịch vụ khác nhau giải quyết vấn đề này (theo nhiều cách khác nhau).

Bạn nên sử dụng bài đăng này để hiểu cơ bản về docker --linkcách tiếp cận khám phá dịch vụ, cách tiếp cận này cơ bản nhất, hoạt động rất hiệu quả và thực sự ít đòi hỏi sự cầu kỳ hơn so với hầu hết các giải pháp khác. Nó bị hạn chế ở chỗ khá khó nối mạng các vùng chứa trên các máy chủ riêng biệt trong bất kỳ cụm cụ thể nào và các vùng chứa không thể khởi động lại sau khi được nối mạng, nhưng cung cấp một cách nhanh chóng và tương đối dễ dàng để nối mạng các vùng chứa trên cùng một máy chủ. Đó là một cách hay để biết phần mềm bạn có thể sẽ sử dụng để giải quyết vấn đề này đang thực sự hoạt động như thế nào.

Ngoài ra, có thể bạn cũng sẽ muốn xem phần mới ra đời của Docker network, của Hashicorp consul, Weaveworks weave, Jeff Lindsay's progrium/consul&gliderlabs/registrator và của Google Kubernetes.

Ngoài ra còn có các CoreOS dịch vụ mà sử dụng etcd, fleetflannel.

Và nếu bạn thực sự muốn tổ chức một bữa tiệc, bạn có thể tạo một cụm để chạy Mesosphere, hoặc Deis, hoặc Flynn.

Nếu bạn là người mới sử dụng mạng (như tôi) thì bạn nên lấy kính đọc sách ra, bật "Paint The Sky With Stars - The Best of Enya" trên Wi-Hi-Fi và uống một cốc bia - nó sẽ một thời gian trước khi bạn thực sự hiểu chính xác những gì bạn đang cố gắng làm. Gợi ý: Bạn đang cố gắng triển khai một Service Discovery Layertrong của mình Cluster Control Plane. Đó là một cách rất tốt để dành một đêm thứ Bảy.

Thật là thú vị, nhưng tôi ước mình đã dành thời gian để giáo dục bản thân tốt hơn về mạng nói chung trước khi bắt tay vào làm. Cuối cùng tôi đã tìm thấy một vài bài đăng từ các vị thần Hướng dẫn kỹ thuật số nhân từ: Introduction to Networking TerminologyUnderstanding ... Networking. Tôi khuyên bạn nên đọc những điều đó một vài lần trước khi đi sâu vào.

Chúc vui vẻ!



Bài gốc

Tôi dường như không thể nắm bắt bản đồ cảng cho Dockercác container. Cụ thể là cách chuyển các yêu cầu từ Nginx đến một vùng chứa khác, lắng nghe trên một cổng khác, trên cùng một máy chủ.

Tôi có một Dockerfile cho một vùng chứa Nginx như vậy:

FROM ubuntu:14.04
MAINTAINER Me <me@myapp.com>

RUN apt-get update && apt-get install -y htop git nginx

ADD sites-enabled/api.myapp.com /etc/nginx/sites-enabled/api.myapp.com
ADD sites-enabled/app.myapp.com /etc/nginx/sites-enabled/app.myapp.com
ADD nginx.conf /etc/nginx/nginx.conf

RUN echo "daemon off;" >> /etc/nginx/nginx.conf

EXPOSE 80 443

CMD ["service", "nginx", "start"]



Và sau đó api.myapp.comtệp cấu hình trông giống như sau:

upstream api_upstream{

    server 0.0.0.0:3333;

}


server {

    listen 80;
    server_name api.myapp.com;
    return 301 https://api.myapp.com/$request_uri;

}


server {

    listen 443;
    server_name api.mypp.com;

    location / {

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
        proxy_pass http://api_upstream;

    }

}

Và sau đó nữa app.myapp.comlà tốt.

Và sau đó tôi chạy:

sudo docker run -p 80:80 -p 443:443 -d --name Nginx myusername/nginx


Và tất cả đều ổn, nhưng các yêu cầu không được chuyển đến các container / cảng khác. Và khi tôi vào vùng chứa Nginx và kiểm tra nhật ký, tôi không thấy lỗi nào.

Bất kỳ giúp đỡ?


1
Vui lòng đưa tài liệu trả lời vào câu trả lời của bạn, không đặt trong phần nội dung câu hỏi.
jscs 07/07/16

Câu trả lời:


56

Câu trả lời của @ T0xicCode là đúng, nhưng tôi nghĩ rằng tôi sẽ mở rộng chi tiết vì thực sự tôi mất khoảng 20 giờ để cuối cùng có được một giải pháp hoạt động.

Nếu bạn đang tìm cách chạy Nginx trong vùng chứa của riêng nó và sử dụng nó làm proxy ngược để cân bằng tải nhiều ứng dụng trên cùng một phiên bản máy chủ thì các bước bạn cần làm như sau:

Liên kết các vùng chứa của bạn

Khi bạn docker runcác vùng chứa của bạn, thường bằng cách nhập một tập lệnh shell vào User Data, bạn có thể khai báo các liên kết đến bất kỳ vùng chứa nào đang chạy khác . Điều này có nghĩa là bạn cần khởi động các vùng chứa của mình theo thứ tự và chỉ những vùng chứa sau mới có thể liên kết với những vùng chứa trước đó. Như vậy:

#!/bin/bash
sudo docker run -p 3000:3000 --name API mydockerhub/api
sudo docker run -p 3001:3001 --link API:API --name App mydockerhub/app
sudo docker run -p 80:80 -p 443:443 --link API:API --link App:App --name Nginx mydockerhub/nginx

Vì vậy, trong ví dụ này, vùng APIchứa không được liên kết với bất kỳ người nào khác, nhưng vùng Appchứa được liên kết với APINginxđược liên kết với cả APIApp.

Kết quả của việc này là các thay đổi đối với các envvars và các /etc/hoststệp nằm trong vùng chứa APIApp. Kết quả trông như vậy:

/ etc / hosts

Chạy cat /etc/hoststrong vùng Nginxchứa của bạn sẽ tạo ra những thứ sau:

172.17.0.5  0fd9a40ab5ec
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3  App
172.17.0.2  API



ENV Vars

Chạy envtrong vùng Nginxchứa của bạn sẽ tạo ra những thứ sau:

API_PORT=tcp://172.17.0.2:3000
API_PORT_3000_TCP_PROTO=tcp
API_PORT_3000_TCP_PORT=3000
API_PORT_3000_TCP_ADDR=172.17.0.2

APP_PORT=tcp://172.17.0.3:3001
APP_PORT_3001_TCP_PROTO=tcp
APP_PORT_3001_TCP_PORT=3001
APP_PORT_3001_TCP_ADDR=172.17.0.3

Tôi đã cắt ngắn nhiều vars thực tế, nhưng ở trên là các giá trị chính mà bạn cần để ủy quyền lưu lượng truy cập vào vùng chứa của mình.

Để có được một trình bao để chạy các lệnh trên trong một vùng chứa đang chạy, hãy sử dụng như sau:

sudo docker exec -i -t Nginx bash

Bạn có thể thấy rằng bây giờ bạn có cả /etc/hostsmục nhập tệp và envvars chứa địa chỉ IP cục bộ cho bất kỳ vùng chứa nào được liên kết. Theo như tôi có thể nói, đây là tất cả những gì xảy ra khi bạn chạy các vùng chứa với các tùy chọn liên kết được khai báo. Nhưng bây giờ bạn có thể sử dụng thông tin này để định cấu hình nginxtrong vùng Nginxchứa của mình .



Định cấu hình Nginx

Đây là nơi mà nó có một chút khó khăn và có một vài lựa chọn. Bạn có thể chọn định cấu hình các trang web của mình để trỏ đến một mục nhập trong /etc/hoststệp đã dockertạo hoặc bạn có thể sử dụng các ENVvars và chạy chuỗi thay thế (tôi đã sử dụng sed) trên nginx.conftệp conf của bạn và bất kỳ tệp nào khác có thể nằm trong /etc/nginx/sites-enabledthư mục của bạn để chèn IP các giá trị.



TÙY CHỌN A: Định cấu hình Nginx bằng ENV Vars

Đây là tùy chọn mà tôi đã sử dụng vì tôi không thể làm cho /etc/hoststùy chọn tệp hoạt động. Tôi sẽ sớm thử Tùy chọn B và cập nhật bài đăng này với bất kỳ phát hiện nào.

Sự khác biệt chính giữa tùy chọn này và sử dụng /etc/hoststùy chọn tệp là cách bạn viết Dockerfileđể sử dụng tập lệnh shell làm CMDđối số, từ đó xử lý việc thay thế chuỗi để sao chép các giá trị IP từ ENV(các) tệp conf của bạn.

Đây là tập hợp các tệp cấu hình mà tôi đã kết thúc:

Dockerfile

FROM ubuntu:14.04
MAINTAINER Your Name <you@myapp.com>

RUN apt-get update && apt-get install -y nano htop git nginx

ADD nginx.conf /etc/nginx/nginx.conf
ADD api.myapp.conf /etc/nginx/sites-enabled/api.myapp.conf
ADD app.myapp.conf /etc/nginx/sites-enabled/app.myapp.conf
ADD Nginx-Startup.sh /etc/nginx/Nginx-Startup.sh

EXPOSE 80 443

CMD ["/bin/bash","/etc/nginx/Nginx-Startup.sh"]

nginx.conf

daemon off;
user www-data;
pid /var/run/nginx.pid;
worker_processes 1;


events {
    worker_connections 1024;
}


http {

    # Basic Settings

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 33;
    types_hash_max_size 2048;

    server_tokens off;
    server_names_hash_bucket_size 64;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;


    # Logging Settings
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;


    # Gzip Settings

gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 3;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/xml text/css application/x-javascript application/json;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    # Virtual Host Configs  
    include /etc/nginx/sites-enabled/*;

    # Error Page Config
    #error_page 403 404 500 502 /srv/Splash;


}

LƯU Ý: Điều quan trọng là phải đưa daemon off;vào nginx.conftệp của bạn để đảm bảo rằng vùng chứa của bạn không thoát ngay sau khi khởi chạy.

api.myapp.conf

upstream api_upstream{
    server APP_IP:3000;
}

server {
    listen 80;
    server_name api.myapp.com;
    return 301 https://api.myapp.com/$request_uri;
}

server {
    listen 443;
    server_name api.myapp.com;

    location / {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
        proxy_pass http://api_upstream;
    }

}

Nginx-Startup.sh

#!/bin/bash
sed -i 's/APP_IP/'"$API_PORT_3000_TCP_ADDR"'/g' /etc/nginx/sites-enabled/api.myapp.com
sed -i 's/APP_IP/'"$APP_PORT_3001_TCP_ADDR"'/g' /etc/nginx/sites-enabled/app.myapp.com

service nginx start

Tôi sẽ để bạn làm bài tập về hầu hết các nội dung của nginx.confapi.myapp.conf.

Điều kỳ diệu xảy ra trong Nginx-Startup.sh nơi chúng tôi sử dụng sedđể thay thế chuỗi trên APP_IPtrình giữ chỗ mà chúng tôi đã ghi vào upstreamkhối tệp api.myapp.confapp.myapp.conftệp của chúng tôi .

Câu hỏi ask.ubuntu.com này giải thích nó rất hay: Tìm và thay thế văn bản trong tệp bằng lệnh

GOTCHA Trên OSX, sedxử lý các tùy chọn khác nhau, -icờ cụ thể. Trên Ubuntu, -icờ sẽ xử lý thay thế 'tại chỗ'; nó sẽ mở tệp, thay đổi văn bản và sau đó 'lưu trên' cùng một tệp. Trên OSX, -icờ yêu cầu phần mở rộng tệp mà bạn muốn tệp kết quả có. Nếu bạn đang làm việc với tệp không có phần mở rộng, bạn phải nhập '' làm giá trị cho -icờ.

GOTCHA Để sử dụng các ENV vars trong regex seddùng để tìm chuỗi bạn muốn thay thế, bạn cần đặt var trong dấu ngoặc kép. Vì vậy, cú pháp chính xác, mặc dù trông có vẻ khó hiểu, là như trên.

Do đó, docker đã khởi chạy vùng chứa của chúng tôi và kích hoạt Nginx-Startup.shtập lệnh chạy, tập lệnh này được sử dụng sedđể thay đổi giá trị APP_IPthành ENVbiến tương ứng mà chúng tôi đã cung cấp trong sedlệnh. Bây giờ chúng tôi có các tệp conf trong /etc/nginx/sites-enabledthư mục của chúng tôi có địa chỉ IP từ các ENVvars mà docker đặt khi khởi động vùng chứa. Trong api.myapp.conftệp của bạn, bạn sẽ thấy upstreamkhối đã được thay đổi thành:

upstream api_upstream{
    server 172.0.0.2:3000;
}

Địa chỉ IP bạn thấy có thể khác, nhưng tôi nhận thấy rằng đó là địa chỉ thường 172.0.0.x.

Bây giờ bạn sẽ có mọi thứ định tuyến thích hợp.

GOTCHA Bạn không thể khởi động lại / chạy lại bất kỳ vùng chứa nào khi bạn đã chạy khởi chạy phiên bản đầu tiên. Docker cung cấp cho mỗi vùng chứa một IP mới khi khởi chạy và dường như không sử dụng lại bất kỳ IP nào mà nó đã sử dụng trước đây. Vì vậy, api.myapp.comsẽ nhận được 172.0.0.2 trong lần đầu tiên, nhưng sau đó nhận được 172.0.0.4 vào lần tiếp theo. Nhưng Nginxsẽ đã đặt IP đầu tiên vào các tệp conf của nó hoặc trong /etc/hoststệp của nó , vì vậy nó sẽ không thể xác định IP mới cho api.myapp.com. Giải pháp cho điều này có khả năng sử dụng CoreOSetcddịch vụ của nó , theo sự hiểu biết hạn chế của tôi, hoạt động giống như một dịch vụ dùng chung ENVcho tất cả các máy được đăng ký vào cùng một CoreOScụm. Đây là món đồ chơi tiếp theo mà tôi sẽ chơi với việc sắp đặt.



LỰA CHỌN B: Sử dụng mục nhập /etc/hoststệp

Đây hẳn là cách nhanh hơn, dễ dàng hơn để làm điều này, nhưng tôi không thể làm cho nó hoạt động. Rõ ràng là bạn chỉ cần nhập giá trị của /etc/hostsmục nhập vào tệp api.myapp.confvà của bạn app.myapp.conf, nhưng tôi không thể làm cho phương pháp này hoạt động.

CẬP NHẬT: Xem câu trả lời của @Wes Tod để biết hướng dẫn về cách làm cho phương pháp này hoạt động.

Đây là nỗ lực mà tôi đã thực hiện api.myapp.conf:

upstream api_upstream{
    server API:3000;
}

Xem xét rằng có một mục nhập trong /etc/hoststệp của tôi như vậy: 172.0.0.2 APITôi đã nghĩ rằng nó sẽ chỉ kéo giá trị vào, nhưng dường như không phải vậy.

Tôi cũng gặp một số vấn đề phụ trợ với việc Elastic Load Balancertìm nguồn cung ứng của tôi từ tất cả các AZ nên đó có thể là vấn đề khi tôi thử con đường này. Thay vào đó, tôi phải học cách xử lý việc thay thế các chuỗi trong Linux, điều đó thật thú vị. Tôi sẽ thử cái này trong một thời gian và xem nó diễn ra như thế nào.


2
Một vấn đề khác khi sử dụng liên kết là nếu bạn khởi động lại vùng chứa API, rất có thể nó sẽ nhận được một ip mới. Điều này không được phản ánh trong tệp nginx container / etc / hosts, tệp này sẽ tiếp tục sử dụng ip cũ và do đó cũng phải khởi động lại.
judoole

13

Tôi đã thử sử dụng proxy ngược Jason Wilder phổ biến có mã hoạt động một cách kỳ diệu cho mọi người và biết rằng nó không hoạt động với tất cả mọi người (ví dụ: tôi). Và tôi là thương hiệu mới đối với NGINX, và không thích điều đó, tôi không hiểu những công nghệ tôi đang cố gắng sử dụng.

Tôi muốn thêm 2 xu của tôi, vì cuộc thảo luận ở trên xung quanh linkingcác thùng chứa với nhau hiện đã được cập nhật vì nó là một tính năng không được dùng nữa. Vì vậy, đây là giải thích về cách sử dụng networks. Câu trả lời này là một ví dụ đầy đủ về việc thiết lập nginx làm proxy ngược cho một trang web được phân trang tĩnh bằng cách sử dụng Docker Composevà cấu hình nginx.

TL; DR;

Thêm các dịch vụ cần giao tiếp với nhau vào một mạng được xác định trước. Để thảo luận từng bước về mạng Docker, tôi đã học được một số điều ở đây: https://technologyconversations.com/2016/04/25/docker-networking-and-dns-the-good-the-bad-and- xấu xí/

Xác định mạng

Trước hết, chúng tôi cần một mạng mà trên đó tất cả các dịch vụ phụ trợ của bạn có thể nói chuyện. Tôi đã gọi là của tôi webnhưng nó có thể là bất cứ điều gì bạn muốn.

docker network create web

Xây dựng ứng dụng

Chúng tôi sẽ chỉ làm một ứng dụng trang web đơn giản. Trang web là một trang index.html đơn giản được cung cấp bởi một vùng chứa nginx. Nội dung là một ổ đĩa được gắn vào máy chủ lưu trữ trong một thư mụccontent

DockerFile:

FROM nginx
COPY default.conf /etc/nginx/conf.d/default.conf

default.conf

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /var/www/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

docker-compos.yml

version: "2"

networks:
  mynetwork:
    external:
      name: web

services:
  nginx:
    container_name: sample-site
    build: .
    expose:
      - "80"
    volumes:
      - "./content/:/var/www/html/"
    networks:
      default: {}
      mynetwork:
        aliases:
          - sample-site

Lưu ý rằng chúng ta không cần ánh xạ cổng ở đây nữa. Chúng tôi đơn giản để lộ cổng 80. Điều này rất tiện lợi để tránh va chạm cổng.

Chạy ứng dụng

Kích hoạt trang web này với

docker-compose up -d

Một số kiểm tra thú vị liên quan đến ánh xạ dns cho vùng chứa của bạn:

docker exec -it sample-site bash
ping sample-site

Ping này sẽ hoạt động, bên trong vùng chứa của bạn.

Xây dựng Proxy

Nginx Reverse Proxy:

Dockerfile

FROM nginx

RUN rm /etc/nginx/conf.d/*

Chúng tôi đặt lại tất cả cấu hình máy chủ ảo, vì chúng tôi sẽ tùy chỉnh nó.

docker-compos.yml

version: "2"

networks:
  mynetwork:
    external:
      name: web


services:
  nginx:
    container_name: nginx-proxy
    build: .
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./conf.d/:/etc/nginx/conf.d/:ro
      - ./sites/:/var/www/
    networks:
      default: {}
      mynetwork:
        aliases:
          - nginx-proxy

Chạy Proxy

Kích hoạt proxy bằng cách sử dụng đáng tin cậy của chúng tôi

docker-compose up -d

Giả sử không có vấn đề gì, thì bạn có hai vùng chứa đang chạy có thể nói chuyện với nhau bằng tên của chúng. Hãy kiểm tra nó.

docker exec -it nginx-proxy bash
ping sample-site
ping nginx-proxy

Thiết lập Máy chủ ảo

Chi tiết cuối cùng là thiết lập tệp lưu trữ ảo để proxy có thể hướng lưu lượng truy cập dựa trên tuy nhiên bạn muốn thiết lập đối sánh của mình:

sample-site.conf cho cấu hình lưu trữ ảo của chúng tôi:

  server {
    listen 80;
    listen [::]:80;

    server_name my.domain.com;

    location / {
      proxy_pass http://sample-site;
    }

  }

Dựa trên cách thiết lập proxy, bạn sẽ cần tệp này được lưu trữ trong conf.dthư mục cục bộ mà chúng tôi đã gắn kết qua volumeskhai báo trong docker-composetệp.

Cuối cùng nhưng không kém phần quan trọng, hãy yêu cầu nginx tải lại cấu hình của nó.

docker exec nginx-proxy service nginx reload

Trình tự các bước này là đỉnh điểm của hàng giờ đồng hồ đau đầu khi tôi phải vật lộn với lỗi 502 Bad Gateway từng gây đau đớn và học nginx lần đầu tiên, vì hầu hết kinh nghiệm của tôi là với Apache.

Câu trả lời này là để trình bày cách loại bỏ lỗi 502 Bad Gateway dẫn đến việc các vùng chứa không thể nói chuyện với nhau.

Tôi hy vọng câu trả lời này sẽ cứu ai đó ngoài kia hàng giờ đau đớn, vì việc các container nói chuyện với nhau thực sự khó tìm ra vì lý do gì, mặc dù nó là điều tôi mong đợi là một trường hợp sử dụng rõ ràng. Nhưng rồi một lần nữa, tôi chết lặng. Và vui lòng cho tôi biết cách tôi có thể cải thiện phương pháp này.


Ah! The ole 502 Gateway Error, một tác phẩm kinh điển khét tiếng ngày nay. Cảm ơn @gdbj đã dành thời gian để thúc đẩy cuộc trò chuyện và cung cấp giải pháp chi tiết như vậy.
AJB

Tôi chỉ muốn nói cảm ơn vì đã dành thời gian cho việc này, nó đã giúp tôi tiết kiệm được kha khá rắc rối. Cảm ơn bạn.
Single Entity

10

Sử dụng liên kết docker , bạn có thể liên kết vùng chứa ngược dòng với vùng chứa nginx. Một tính năng bổ sung là docker quản lý tệp máy chủ lưu trữ, có nghĩa là bạn sẽ có thể tham chiếu đến vùng chứa được liên kết bằng cách sử dụng tên thay vì ip ngẫu nhiên tiềm năng.


7

"Lựa chọn B" của AJB có thể hoạt động bằng cách sử dụng hình ảnh Ubuntu cơ sở và tự thiết lập nginx. (Nó không hoạt động khi tôi sử dụng hình ảnh Nginx từ Docker Hub.)

Đây là tệp Docker mà tôi đã sử dụng:

FROM ubuntu
RUN apt-get update && apt-get install -y nginx
RUN ln -sf /dev/stdout /var/log/nginx/access.log
RUN ln -sf /dev/stderr /var/log/nginx/error.log
RUN rm -rf /etc/nginx/sites-enabled/default
EXPOSE 80 443
COPY conf/mysite.com /etc/nginx/sites-enabled/mysite.com
CMD ["nginx", "-g", "daemon off;"]

Cấu hình nginx của tôi (còn gọi là: conf / mysite.com):

server {
    listen 80 default;
    server_name mysite.com;

    location / {
        proxy_pass http://website;
    }
}

upstream website {
    server website:3000;
}

Và cuối cùng, cách tôi bắt đầu các vùng chứa của mình:

$ docker run -dP --name website website
$ docker run -dP --name nginx --link website:website nginx

Điều này giúp tôi bắt đầu và chạy vì vậy nginx của tôi đã hướng ngược dòng đến container docker thứ hai, nơi tiếp xúc với cổng 3000.


Cảm ơn sự hỗ trợ của Wes! Tôi sẽ thử cái này khi tôi trở lại sau kỳ nghỉ.
AJB

Tôi đã gặp một vài vấn đề như thế này với các hình ảnh chính thức. Tôi đã thấy tốt hơn nhiều là căn cứ vào hộp ubuntu và sau đó kéo trực tiếp các dòng từ các tệp docker. Điều này không cần thiết, nhưng than ôi ....
Wes Todd

1
Điều này thật tuyệt, nhưng điều tôi không nhận được là cách cấu hình nginx chỉ biết giá trị của 'trang web'. Phép thuật Nginx hoặc phép thuật docker, hay thứ gì khác?
Kyle Chadha

1
Dòng upstream website {xác định giá trị trang web cho nginx. Đó là những gì bạn sau đó sử dụng trong của bạn proxy_pass. Phần docker của điều này chỉ sử dụng cùng một tên để nhất quán, nhưng không liên quan gì đến thiết lập nginx. Để làm cho nó thêm một chút rõ ràng vượt qua Proxy nên đọc:upstream website { server localhost:3000; }
Wes Todd

2
FYI Tôi đang sử dụng hình ảnh nginx chính thức mới nhất (1.9.2) và có vẻ như nó đang hoạt động với tôi. Vì vậy, có thể họ đã khắc phục sự cố.
Pejvan

6

Câu trả lời của @ gdbj là một lời giải thích tuyệt vời và là câu trả lời cập nhật nhất. Tuy nhiên, đây là một cách tiếp cận đơn giản hơn.

Vì vậy, nếu bạn muốn chuyển hướng tất cả lưu lượng truy cập từ nginx đang lắng nghe 80đến một vùng chứa khác 8080, cấu hình tối thiểu có thể là:

nginx.conf:

server {
    listen 80;

    location / {
        proxy_pass http://client:8080; # this one here
        proxy_redirect off;
    }

}

docker-compos.yml

version: "2"
services:
  entrypoint:
    image: some-image-with-nginx
    ports:
      - "80:80"
    links:
      - client  # will use this one here

  client:
    image: some-image-with-api
    ports:
      - "8080:8080"

Docker tài liệu


Lúc đầu, tôi nghĩ bạn gặp vấn đề với việc va chạm cổng.
gdbj

@gdbj Vấn đề của tôi là độ phân giải url / ip giữa các vùng chứa. Đoán chúng tôi đã có cùng một. Trong trường hợp của bạn, bạn sử dụng các mạng, mạng này cũng hoạt động tốt, trong trường hợp của tôi, tôi chỉ cần liên kết các vùng chứa
Diolor 09/09/18

Tuyệt vời, đó là tất cả những gì tôi cần! Cảm ơn vì câu trả lời đó.
Floran Gmehlin

2

Vừa tìm thấy một bài viết từ Anand Mani Sankar wich cho thấy một cách đơn giản để sử dụng proxy ngược dòng nginx với trình soạn nhạc docker.

Về cơ bản, người ta phải cấu hình liên kết cá thể và các cổng tại tệp docker-comp và cập nhật ngược dòng tại nginx.conf cho phù hợp.


1
Bài viết sử dụng linkskhông được dùng nữa. Sử dụng mạng ngay bây giờ: docs.docker.com/engine/userguide/networking
gdbj

Liệu phép thay thế nginx conf kỳ diệu cũng hoạt động trong trường hợp này chứ?
túc xá
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.