Pertanyaan Menetapkan vhosts ke port Docker


Saya memiliki DNS wildcard yang diatur sehingga semua permintaan web ke domain kustom (* .foo) memetakan ke alamat IP dari host Docker. Jika saya memiliki beberapa kontainer yang menjalankan instance Apache (atau Nginx), setiap kontainer memetakan port Apache (80) ke beberapa port masuk eksternal.

Yang ingin saya lakukan adalah membuat permintaan ke container-1.foo, yang sudah dipetakan ke alamat IP yang benar (dari host Docker) melalui server DNS khusus saya, tetapi proksi permintaan port 80 default ke Docker eksternal yang benar port sedemikian rupa sehingga instance Apache yang benar dari penampung tertentu dapat merespons berdasarkan domain khusus. Demikian juga, container-2.foo akan menjadi proxy untuk apache wadah kedua, dan seterusnya.

Apakah ada solusi pre-built untuk ini, adalah taruhan terbaik saya untuk menjalankan proxy Nginx pada host Docker, atau saya harus menulis proxy node.js dengan potensi untuk mengelola kontainer Docker (start / stop / reuild melalui web ), atau...? Pilihan apa yang saya miliki yang akan membuat menggunakan wadah Docker lebih seperti acara alam dan bukan sesuatu dengan port asing dan juggling kontainer?


81
2017-08-28 20:27


asal


Jawaban:


Jawaban ini mungkin agak terlambat, tetapi lihatlah Gambar Docker nginx-proxy Jason Wilder. Ketika menjalankan kontainer Docker dari gambar ini, Anda mendapatkan nginx server yang ditetapkan sebagai proxy terbalik untuk kontainer Anda yang lain tanpa konfigurasi untuk dipelihara.

Jalankan saja kontainer Anda yang lain dengan VIRTUAL_HOST variabel lingkungan dan nginx-proxy akan menemukan ip mereka: port dan memperbarui konfigurasi nginx untuk Anda.

Katakanlah DNS Anda sudah diatur sedemikian rupa *.test.local memetakan ke alamat IP dari host Docker Anda, kemudian jalankan saja kontainer berikut untuk menjalankan demo cepat:

# start the reverse proxy
docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock jwilder/nginx-proxy

# start a first container for http://tutum.test.local
docker run -d -e "VIRTUAL_HOST=tutum.test.local" tutum/hello-world

# start a second container for http://deis.test.local
docker run -d -e "VIRTUAL_HOST=deis.test.local" deis/helloworld

76
2018-06-01 01:15



Berikut adalah dua kemungkinan jawaban: (1) susun port secara langsung dengan Docker dan gunakan Nginx / Apache untuk memproklamasikan vhosts, atau (2) penggunaan Dokku untuk mengelola port dan vhosts untuk Anda (yang bagaimana saya belajar untuk melakukan Metode 1).

Metode 1a (langsung menetapkan port dengan buruh pelabuhan)

Langkah 1: Setup nginx.conf atau Apache pada host, dengan penugasan nomor port yang diinginkan. Server web ini, yang berjalan di host, akan melakukan proksi vhost. Tidak ada yang istimewa tentang hal ini berkaitan dengan Docker - itu adalah hosting vhost biasa. Bagian khusus datang berikutnya, di Langkah 2, untuk membuat Docker menggunakan nomor port host yang benar.

Langkah 2: Paksa tugas nomor port di Docker dengan "-p" untuk mengatur pemetaan port Docker, dan "-e" untuk menyetel variabel lingkungan khusus dalam Docker, sebagai berikut:

port=12345 # <-- the vhost port setting used in nginx/apache
IMAGE=myapps/container-1
id=$(docker run -d -p :$port -e PORT=$port $IMAGE)
# -p :$port will establish a mapping of 12345->12345 from outside docker to
# inside of docker.
# Then, the application must observe the PORT environment variable
# to launch itself on that port; This is set by -e PORT=$port.

# Additional goodies:
echo $id # <-- the running id of your container
echo $id > /app/files/CONTAINER # <-- remember Docker id for this instance
docker ps # <-- check that the app is running
docker logs $id # <-- look at the output of the running instance
docker kill $id # <-- to kill the app

Metode 1b Port aplikasi berkode keras

... jika aplikasi Anda menggunakan port hardcoded, misalnya port 5000 (yaitu tidak dapat dikonfigurasi melalui variabel lingkungan PORT, seperti dalam Metode 1a), maka dapat dikodekan ulang melalui Docker seperti ini:

publicPort=12345
id=$(docker run -d -p $publicPort:5000 $IMAGE)
# -p $publicPort:5000 will map port 12345 outside of Docker to port 5000 inside
# of Docker. Therefore, nginx/apache must be configured to vhost proxy to 12345,
# and the application within Docker must be listening on 5000.

Metode 2 (biarkan Dokku mencari tahu port)

Saat ini, pilihan yang cukup bagus untuk mengelola Docker vhosts adalah Dokku. Opsi yang akan datang mungkin digunakan Flynn, tetapi pada saat ini Flynn baru saja dimulai dan belum siap. Oleh karena itu, kami menggunakan Dokku untuk saat ini: Setelah mengikuti instruksi pemasangan Dokku, untuk satu domain, aktifkan vhost dengan membuat file "VHOST":

echo yourdomain.com > /home/git/VHOST
# in your case: echo foo > /home/git/VHOST

Sekarang, ketika sebuah aplikasi didorong melalui SSH ke Dokku (lihat Dokku docs untuk bagaimana melakukan ini), Dokku akan melihat file VHOST dan untuk aplikasi tertentu didorong (katakanlah Anda mendorong "container-1"), itu akan menghasilkan file berikut:

/home/git/container-1/nginx.conf

Dan itu akan memiliki konten berikut:

upstream container-1 { server 127.0.0.1:49162; }
server {
  listen      80;
  server_name container-1.yourdomain.com;
  location    / {
    proxy_pass  http://container-1;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
}

Ketika server di-boot ulang, Dokku akan memastikan bahwa Docker memulai aplikasi dengan port yang dipetakan ke port awalnya yang digunakan (49162 di sini), daripada ditugaskan secara acak ke port lain. Untuk mencapai tugas deterministik ini, Dokku menyimpan port yang awalnya ditugaskan /home/git/container-1/PORT dan pada peluncuran berikutnya ia mengatur PORT lingkungan ke nilai ini, dan juga memetakan tugas port Docker untuk menjadi port ini pada sisi host dan sisi aplikasi. Ini bertentangan dengan peluncuran pertama, ketika Dokku akan diatur PORT=5000 dan kemudian mencari tahu apa pun port acak peta Dokku di sisi VPS hingga 5000 di sisi aplikasi. Ini bulat tentang (dan mungkin bahkan berubah di masa depan), tetapi itu berhasil!

Cara VHOST bekerja, di bawah tenda, adalah: setelah melakukan push git dari aplikasi melalui SSH, Dokku akan mengeksekusi kait yang hidup di /var/lib/dokku/plugins/nginx-vhosts. Kait ini juga terletak di kode sumber Dokku sini dan bertanggung jawab untuk menulis nginx.conf file dengan pengaturan vhost yang benar. Jika Anda tidak memiliki direktori ini di bawah /var/lib/dokku, lalu coba jalankan dokku plugins-install.


42
2017-09-04 19:41



Dengan docker, Anda ingin ips internal tetap normal (mis. 80) dan mencari tahu cara memasang port acak.

Salah satu cara untuk mengatasinya adalah dengan reverse proxy seperti hipache. Arahkan dns Anda ke dalamnya, lalu Anda dapat mengkonfigurasi ulang proxy saat kontainer Anda naik dan turun. Melihat http://txt.fliglio.com/2013/09/protyping-web-stuff-with-docker/ untuk melihat bagaimana ini bisa bekerja.

Jika Anda mencari sesuatu yang lebih kuat, Anda mungkin ingin melihat "penemuan layanan." (lihat penemuan layanan dengan buruh pelabuhan: http://txt.fliglio.com/2013/12/service-discovery-with-docker-docker-links-and-beyond/)


3
2017-12-14 23:20