Bagaimana cara mengkonfigurasi pemetaan port Docker untuk menggunakan Nginx sebagai proxy upstream?

87

Perbarui II

Sekarang tanggal 16 Juli 2015 dan banyak hal telah berubah lagi. Saya telah menemukan wadah automagical ini dari Jason Wilder : https://github.com/jwilder/nginx-proxydan ini memecahkan masalah ini selama yang dibutuhkan untuk docker runwadah tersebut. Sekarang ini adalah solusi yang saya gunakan untuk mengatasi masalah ini.

Memperbarui

Sekarang Juli 2015 dan banyak hal telah berubah secara drastis sehubungan dengan wadah jaringan Docker. Sekarang ada banyak persembahan berbeda yang memecahkan masalah ini (dengan berbagai cara).

Anda harus menggunakan posting ini untuk mendapatkan pemahaman dasar tentang docker --linkpendekatan penemuan layanan, yang sama mendasarnya dengan yang didapat, berfungsi dengan sangat baik, dan sebenarnya tidak membutuhkan tarian mewah daripada kebanyakan solusi lainnya. Terbatas karena cukup sulit untuk menempatkan wadah jaringan pada host terpisah dalam kluster mana pun, dan wadah tidak dapat dimulai ulang setelah terhubung ke jaringan, tetapi menawarkan cara yang cepat dan relatif mudah untuk wadah jaringan pada host yang sama. Ini adalah cara yang baik untuk mendapatkan gambaran tentang perangkat lunak apa yang kemungkinan akan Anda gunakan untuk mengatasi masalah ini sebenarnya dilakukan di bawah tenda.

Selain itu, Anda mungkin juga ingin melihat Docker yang baru lahir network, Hashicorp consul, Weaveworks weave, Jeff Lindsay's progrium/consul&gliderlabs/registrator , dan Google Kubernetes.

Ada juga CoreOS korban yang memanfaatkan etcd, fleetdan flannel.

Dan jika Anda benar-benar ingin mengadakan pesta, Anda dapat menjalankan cluster untuk dijalankan Mesosphere, atau Deis, atau Flynn.

Jika Anda baru mengenal jaringan (seperti saya) maka Anda harus mengeluarkan kacamata baca Anda, klik "Paint The Sky With Stars - The Best of Enya" di Wi-Hi-Fi, dan minum bir - itu akan menjadi beberapa saat sebelum Anda benar-benar memahami dengan tepat apa yang Anda coba lakukan. Petunjuk: Anda mencoba menerapkan a Service Discovery Layerdi Cluster Control Plane. Ini cara yang sangat menyenangkan untuk menghabiskan Sabtu malam.

Ini sangat menyenangkan, tapi saya berharap saya telah meluangkan waktu untuk mendidik diri saya lebih baik tentang jaringan secara umum sebelum menyelam langsung. Saya akhirnya menemukan beberapa posting dari dewa Tutorial Laut Digital yang baik hati: Introduction to Networking Terminologydan Understanding ... Networking. Saya sarankan untuk membacanya beberapa kali terlebih dahulu sebelum menyelam.

Selamat bersenang-senang!



Posting Asli

Saya tidak dapat memahami pemetaan port untuk Dockerkontainer. Secara khusus cara meneruskan permintaan dari Nginx ke container lain, mendengarkan di port lain, di server yang sama.

Saya punya Dockerfile untuk container Nginx seperti ini:

FROM ubuntu:14.04
MAINTAINER Me <[email protected]>

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"]



Dan kemudian api.myapp.comfile konfigurasi terlihat seperti ini:

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;

    }

}

Dan satu lagi untuk app.myapp.comjuga.

Dan kemudian saya menjalankan:

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


Dan semuanya berdiri dengan baik, tetapi permintaan tidak diteruskan ke kontainer / port lain. Dan ketika saya ssh ke wadah Nginx dan memeriksa log, saya tidak melihat kesalahan.

Ada bantuan?

AJB
sumber
1
Harap letakkan materi jawaban di jawaban Anda, bukan di badan pertanyaan.
jscs

Jawaban:

57

Jawaban @ T0xicCode benar, tetapi saya pikir saya akan memperluas detailnya karena sebenarnya saya membutuhkan waktu sekitar 20 jam untuk akhirnya mendapatkan solusi yang berfungsi.

Jika Anda ingin menjalankan Nginx dalam wadahnya sendiri dan menggunakannya sebagai reverse proxy untuk menyeimbangkan beberapa aplikasi di server yang sama, maka langkah-langkah yang perlu Anda ikuti adalah:

Tautkan Penampung Anda

Saat Anda docker runmenggunakan container, biasanya dengan memasukkan skrip shell ke User Data, Anda dapat mendeklarasikan link ke container lain yang sedang berjalan . Ini berarti Anda perlu memulai penampung Anda secara berurutan dan hanya penampung terakhir yang dapat ditautkan ke penampung sebelumnya. Seperti:

#!/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

Jadi dalam contoh ini, APIpenampung tidak ditautkan ke yang lain, tetapi Apppenampung ditautkan ke APIdan Nginxditautkan ke APIdan App.

Hasilnya adalah perubahan pada envvars dan /etc/hostsfile yang berada di dalam container APIdan App. Hasilnya terlihat seperti ini:

/ etc / hosts

Menjalankan cat /etc/hostsdalam Nginxwadah Anda akan menghasilkan yang berikut:

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

Menjalankan envdalam Nginxwadah Anda akan menghasilkan yang berikut:

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

Saya telah memotong banyak vars yang sebenarnya, tetapi di atas adalah nilai kunci yang Anda perlukan untuk membuat proxy lalu lintas ke penampung Anda.

Untuk mendapatkan shell untuk menjalankan perintah di atas dalam container yang sedang berjalan, gunakan yang berikut ini:

sudo docker exec -i -t Nginx bash

Anda dapat melihat bahwa Anda sekarang memiliki /etc/hostsentri file dan envvars yang berisi alamat IP lokal untuk salah satu wadah yang ditautkan. Sejauh yang saya tahu, ini semua yang terjadi ketika Anda menjalankan container dengan opsi tautan yang dinyatakan. Namun sekarang Anda dapat menggunakan informasi ini untuk mengonfigurasi nginxdalam Nginxpenampung Anda .



Konfigurasi Nginx

Di sinilah menjadi sedikit rumit, dan ada beberapa opsi. Anda dapat memilih untuk mengkonfigurasi situs Anda agar mengarah ke entri dalam /etc/hostsfile yang dockerdibuat, atau Anda dapat menggunakan ENVvars dan menjalankan penggantian string (saya gunakan sed) pada nginx.conffile conf Anda dan file conf lainnya yang mungkin ada di /etc/nginx/sites-enabledfolder Anda untuk memasukkan IP nilai-nilai.



OPSI A: Konfigurasi Nginx Menggunakan ENV Vars

Ini adalah opsi yang saya gunakan karena saya tidak bisa mendapatkan /etc/hostsopsi file untuk berfungsi. Saya akan mencoba Opsi B segera dan memperbarui posting ini dengan temuan apa pun.

Perbedaan utama antara opsi ini dan menggunakan /etc/hostsopsi file adalah bagaimana Anda menulis Dockerfileuntuk menggunakan skrip shell sebagai CMDargumen, yang pada gilirannya menangani penggantian string untuk menyalin nilai IP dari ENVke file conf Anda.

Berikut kumpulan file konfigurasi yang saya dapatkan:

Dockerfile

FROM ubuntu:14.04
MAINTAINER Your Name <[email protected]>

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;


}

CATATAN: Penting untuk disertakan daemon off;dalam nginx.conffile Anda untuk memastikan bahwa penampung Anda tidak segera keluar setelah peluncuran.

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

Saya akan menyerahkan kepada Anda untuk mengerjakan pekerjaan rumah Anda tentang sebagian besar konten nginx.confdan api.myapp.conf.

Keajaiban terjadi di Nginx-Startup.shtempat kami menggunakan seduntuk melakukan penggantian string pada APP_IPplaceholder yang telah kami tulis ke dalam upstreamblok api.myapp.confdan app.myapp.conffile kami.

Pertanyaan ask.ubuntu.com ini menjelaskannya dengan sangat baik: Temukan dan ganti teks di dalam file menggunakan perintah

GOTCHA Di OSX, sedmenangani opsi secara berbeda, -ikhususnya bendera. Di Ubuntu, -ibendera akan menangani penggantian 'di tempat'; itu akan membuka file, mengubah teks, dan kemudian 'menyimpan' file yang sama. Di OSX, -ibendera memerlukan ekstensi file yang Anda inginkan dari file yang dihasilkan. Jika Anda bekerja dengan file yang tidak memiliki ekstensi, Anda harus memasukkan '' sebagai nilai untuk -ibendera.

GOTCHA Untuk menggunakan ENV vars dalam regex yang seddigunakan untuk menemukan string yang ingin Anda ganti, Anda perlu membungkus var dalam tanda kutip ganda. Jadi sintaks yang benar, meskipun tampak miring, seperti di atas.

Jadi buruh pelabuhan telah meluncurkan penampung kami dan memicu Nginx-Startup.shskrip untuk dijalankan, yang telah digunakan seduntuk mengubah nilai APP_IPke ENVvariabel terkait yang kami berikan di sedperintah. Kami sekarang memiliki file conf dalam /etc/nginx/sites-enableddirektori kami yang memiliki alamat IP dari ENVvars yang ditetapkan oleh pekerja galangan saat memulai penampung. Di dalam api.myapp.conffile Anda, Anda akan melihat upstreamblok telah berubah menjadi ini:

upstream api_upstream{
    server 172.0.0.2:3000;
}

Alamat IP yang Anda lihat mungkin berbeda, tetapi saya memerhatikan biasanya 172.0.0.x.

Anda sekarang harus memiliki semua perutean dengan benar.

GOTCHA Anda tidak dapat memulai ulang / menjalankan kembali kontainer apa pun setelah Anda menjalankan peluncuran instans awal. Docker menyediakan setiap container dengan IP baru pada saat peluncuran dan sepertinya tidak menggunakan kembali IP yang digunakan sebelumnya. Jadi api.myapp.comakan mendapatkan 172.0.0.2 pertama kali, tetapi kemudian mendapatkan 172.0.0.4 di waktu berikutnya. Tetapi Nginxakan telah mengatur IP pertama ke dalam file conf-nya, atau dalam /etc/hostsfile -nya , sehingga tidak dapat menentukan IP baru untuk api.myapp.com. Solusi untuk ini kemungkinan menggunakan CoreOSdan etcdlayanannya yang, dalam pemahaman saya yang terbatas, bertindak seperti yang dibagikan ENVuntuk semua mesin yang terdaftar ke dalam CoreOScluster yang sama . Ini mainan berikutnya yang akan saya mainkan dengan penyiapan.



OPSI B: Gunakan /etc/hostsEntri File

Ini seharusnya menjadi cara yang lebih cepat dan mudah untuk melakukan ini, tetapi saya tidak bisa membuatnya bekerja. Seolah-olah Anda hanya memasukkan nilai /etc/hostsentri ke dalam file api.myapp.confdan Anda app.myapp.conf, tetapi saya tidak dapat membuat metode ini berfungsi.

PEMBARUAN: Lihat jawaban @Wes Tod untuk instruksi tentang cara membuat metode ini berfungsi.

Inilah upaya yang saya lakukan api.myapp.conf:

upstream api_upstream{
    server API:3000;
}

Menimbang bahwa ada entri di /etc/hostsfile saya seperti ini: 172.0.0.2 APISaya pikir itu hanya akan menarik nilainya, tetapi sepertinya tidak.

Saya juga memiliki beberapa masalah tambahan dengan Elastic Load Balancersumber saya dari semua AZ sehingga mungkin menjadi masalah ketika saya mencoba rute ini. Sebaliknya saya harus belajar bagaimana menangani penggantian string di Linux, jadi itu menyenangkan. Saya akan mencobanya sebentar dan melihat bagaimana kelanjutannya.

AJB
sumber
2
Gotcha lain yang menggunakan tautan adalah jika Anda memulai ulang wadah API, kemungkinan besar akan mendapatkan ip baru. Ini tidak tercermin dalam file nginx containers / etc / hosts yang akan terus menggunakan ip lama, dan karenanya harus di-restart juga.
judoole
13

Saya mencoba menggunakan proxy terbalik Jason Wilder yang populer yang secara ajaib kode bekerja untuk semua orang, dan mengetahui bahwa itu tidak bekerja untuk semua orang (yaitu: saya). Dan saya baru mengenal NGINX, dan tidak suka karena saya tidak mengerti teknologi yang saya coba gunakan.

Ingin menambahkan 2 sen saya, karena diskusi di atas seputar linkingkontainer bersama sekarang sudah bertanggal karena ini adalah fitur yang tidak digunakan lagi. Berikut penjelasan cara melakukannya dengan menggunakan networks. Jawaban ini adalah contoh lengkap dari pengaturan nginx sebagai reverse proxy ke situs web yang dihalaman secara statis menggunakan Docker Composedan konfigurasi nginx.

TL; DR;

Tambahkan layanan yang perlu berbicara satu sama lain ke jaringan yang telah ditentukan. Untuk diskusi langkah demi langkah tentang jaringan Docker, saya mempelajari beberapa hal di sini: https://technologyconversations.com/2016/04/25/docker-networking-and-dns-the-good-the-bad-and- Jelek/

Tentukan Jaringan

Pertama-tama, kami membutuhkan jaringan tempat semua layanan backend Anda dapat berkomunikasi. Saya menelepon milik saya webtetapi itu bisa menjadi apa pun yang Anda inginkan.

docker network create web

Bangun Aplikasinya

Kami hanya akan membuat aplikasi situs web sederhana. Situs webnya adalah halaman index.html sederhana yang disajikan oleh wadah nginx. Konten adalah volume yang dipasang ke host di bawah foldercontent

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-compose.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

Perhatikan bahwa kami tidak lagi memerlukan pemetaan port di sini. Kami hanya mengekspos port 80. Ini berguna untuk menghindari tabrakan port.

Jalankan Aplikasi

Aktifkan situs web ini dengan

docker-compose up -d

Beberapa pemeriksaan menyenangkan terkait pemetaan dns untuk penampung Anda:

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

Ping ini seharusnya berfungsi, di dalam wadah Anda.

Bangun Proksi

Proksi Terbalik Nginx:

Dockerfile

FROM nginx

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

Kami mengatur ulang semua konfigurasi host virtual, karena kami akan menyesuaikannya.

docker-compose.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

Jalankan Proxy

Jalankan proxy menggunakan tepercaya kami

docker-compose up -d

Dengan asumsi tidak ada masalah, maka Anda memiliki dua kontainer yang berjalan yang dapat saling berhubungan menggunakan namanya. Mari kita uji.

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

Siapkan Virtual Host

Detail terakhir adalah menyiapkan file hosting virtual sehingga proxy dapat mengarahkan lalu lintas berdasarkan cara apa pun Anda ingin menyiapkan pencocokan Anda:

sample-site.conf untuk konfigurasi hosting virtual kami:

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

    server_name my.domain.com;

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

  }

Berdasarkan bagaimana proxy disiapkan, Anda memerlukan file ini disimpan di bawah conf.dfolder lokal Anda yang kami pasang melalui volumesdeklarasi di docker-composefile.

Last but not least, beri tahu nginx untuk memuat ulang konfigurasinya.

docker exec nginx-proxy service nginx reload

Urutan langkah-langkah ini adalah puncak dari jam-jam sakit kepala yang berdebar-debar saat saya berjuang dengan kesalahan Gateway Buruk 502 yang selalu menyakitkan, dan mempelajari nginx untuk pertama kalinya, karena sebagian besar pengalaman saya adalah dengan Apache.

Jawaban ini untuk mendemonstrasikan cara mematikan error 502 Bad Gateway yang diakibatkan oleh kontainer yang tidak dapat berkomunikasi satu sama lain.

Saya berharap jawaban ini menyelamatkan seseorang di luar sana berjam-jam kesakitan, karena mendapatkan wadah untuk berbicara satu sama lain sangat sulit untuk diketahui karena suatu alasan, meskipun itu yang saya harapkan menjadi kasus penggunaan yang jelas. Tapi sekali lagi, saya bodoh. Dan beri tahu saya bagaimana saya dapat meningkatkan pendekatan ini.

gdbj.dll
sumber
Ah! Ole 502 Gateway Error, klasik terkenal hari ini. Terima kasih @gdbj telah meluangkan waktu untuk memajukan percakapan dan memberikan solusi yang begitu mendetail.
AJB
Hanya ingin mengucapkan terima kasih telah meluangkan waktu untuk ini, itu menyelamatkan saya dari sedikit kerumitan. Terima kasih.
Entitas Tunggal
10

Dengan menggunakan tautan buruh pelabuhan , Anda dapat menautkan penampung upstream ke penampung nginx. Fitur tambahan adalah buruh pelabuhan mengelola file host, yang berarti Anda akan dapat merujuk ke penampung tertaut menggunakan nama daripada ip yang berpotensi acak.

T0xicCode
sumber
7

"Opsi B" AJB dapat dibuat untuk bekerja dengan menggunakan image dasar Ubuntu dan mengatur nginx sendiri. (Itu tidak berfungsi ketika saya menggunakan image Nginx dari Docker Hub.)

Berikut adalah file Docker yang saya gunakan:

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;"]

Konfigurasi nginx saya (alias: conf / mysite.com):

server {
    listen 80 default;
    server_name mysite.com;

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

upstream website {
    server website:3000;
}

Dan akhirnya, bagaimana saya memulai container saya:

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

Ini membuat saya aktif dan berjalan sehingga nginx saya mengarahkan ke upstream ke container buruh pelabuhan kedua yang mengekspos port 3000.

Wes Todd
sumber
Terima kasih atas bantuannya, Wes! Saya akan mencobanya ketika saya kembali dari liburan.
AJB
Saya mengalami beberapa masalah seperti ini dengan gambar resmi. Saya merasa jauh lebih baik untuk mendasarkan dari kotak ubuntu dan kemudian menarik garis dari file buruh pelabuhan secara langsung. Bukan berarti ini perlu, tapi sayangnya ....
Wes Todd
1
Ini bagus, tetapi yang tidak saya dapatkan adalah bagaimana konfigurasi nginx hanya mengetahui nilai 'situs web'. Sihir Nginx atau sihir buruh pelabuhan, atau yang lainnya?
Kyle Chadha
1
Baris tersebut upstream website {mendefinisikan nilai situs web untuk nginx. Itulah yang kemudian Anda gunakan dalam file proxy_pass. Bagian buruh pelabuhan ini hanya menggunakan nama yang sama untuk konsistensi, tetapi tidak ada hubungannya dengan pengaturan nginx. Untuk membuatnya lebih jelas, proxy pass harus membaca:upstream website { server localhost:3000; }
Wes Todd
2
FYI, saya menggunakan gambar nginx resmi terbaru (1.9.2), dan tampaknya berfungsi untuk saya. Jadi mungkin mereka memperbaiki masalahnya.
Pejvan
6

Jawaban @ gdbj adalah penjelasan yang bagus dan jawaban yang paling mutakhir. Namun inilah pendekatan yang lebih sederhana.

Jadi, jika Anda ingin mengalihkan semua lalu lintas dari nginx yang mendengarkan ke 80penampung lain yang mengekspos 8080, konfigurasi minimum dapat sesedikit:

nginx.conf:

server {
    listen 80;

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

}

docker-compose.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"

Dokumentasi Docker

Diolor
sumber
Pada awalnya saya pikir Anda akan mengalami masalah dengan tabrakan pelabuhan.
gdbj
@gdbj Masalah saya adalah resolusi url / ip antar kontainer. Kira kami memiliki hal yang sama. Dalam kasus Anda, Anda menggunakan jaringan, yang juga berfungsi dengan baik, dalam kasus saya, saya cukup menautkan kontainer
Diolor
Bagus, hanya itu yang saya butuhkan! Terima kasih atas jawaban itu.
Floran Gmehlin
2

Baru saja menemukan artikel dari Anand Mani Sankar yang menunjukkan cara sederhana menggunakan proxy upstream nginx dengan komposer buruh pelabuhan.

Pada dasarnya seseorang harus mengonfigurasi instance yang menghubungkan dan port di file docker-compose dan memperbarui upstream di nginx.conf yang sesuai.

lsborg
sumber
1
Artikel menggunakan linksyang sudah usang. Gunakan jaringan sekarang: docs.docker.com/engine/userguide/networking
gdbj
Akankah substitusi conf nginx magis berfungsi dalam kasus ini juga?
Dormouse