ポート80でリッスンする単純なNginxプロキシDockerコンテナがあります。Dockerfileは次のとおりです。
FROM centos:7
MAINTAINER Brian Ogden
# Not currently being used but may come in handy
ARG ENVIRONMENT
RUN yum -y update && \
yum clean all && \
yum -y install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm \
yum -y makecache && \
yum -y install nginx-1.12.0 wget
# Cleanup some default NGINX configuration files we don’t need
RUN rm -f /etc/nginx/conf.d/default.conf
COPY /conf/proxy.conf /etc/nginx/conf.d/proxy.conf
COPY /conf/nginx.conf /etc/nginx/nginx.conf
CMD ["nginx"]
このNginxプロキシの場合、ここに私のnginx.confがあります。
daemon off;
user nginx;
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
use epoll;
accept_mutex off;
}
http {
include /etc/nginx/mime.types;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
client_max_body_size 300m;
client_body_buffer_size 300k;
large_client_header_buffers 8 64k;
gzip on;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_min_length 0;
gzip_buffers 16 8k;
gzip_proxied any;
gzip_types text/plain text/css text/xml text/javascript application/xml application/xml+rss application/javascript application/json;
gzip_disable "MSIE [1-6]\.";
gzip_vary on;
include /etc/nginx/conf.d/*.conf;
}
そして、これが私のプロキシ設定です:
upstream accountstaging {
server 127.0.0.1:5023;
}
server {
listen 80;
server_name account.staging.mysite.com;
location / {
proxy_pass http://accountstaging;
proxy_redirect off;
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-Host $server_name;
}
}
私のプロキシ構成はポート80でリッスンしており、ポート5023でリッスンしているNgnixプロキシと同じDockerホストで実行されているDockerコンテナにaccount.staging.mysite.comからのリクエストをリクエストしようとしています。
これが私のNginxプロキシのdocker-compose.ymlです。
version: '3'
services:
reverseproxy:
build:
context: ./
dockerfile: docker/Dockerfile
image: tsl.devops.reverseproxy.image
container_name: tsl.devops.reverseproxy.container
ports:
- "80:80"
ポート5023でリッスンするこのDockerコンテナのdocker-compose.ymlは次のとおりです:バージョン: '3'
services:
apistaging:
build:
context: ./
dockerfile: docker/staging/Dockerfile
image: tsl.api.example.image
container_name: tsl.api.example.container
ports:
- "127.0.0.1:5023:80"
Dockerfileは私の質問にはそれほど重要ではありませんが、とにかくここにあります:
FROM tsl.devops.dotnetcore.base.image:2
MAINTAINER Brian Ogden
WORKDIR /app
COPY ./src/Tsl.Example/bin/Release/netcoreapp2.0/publish .
ENTRYPOINT ["dotnet", "Tsl.Example.dll"]
私は この例 に従ってプロキシを設定しました。
Stackexchangeフォーラム here および here で以前に関連する質問をしました。この質問では、ポート5023でリッスンしている1つのDockerコンテナーにリクエストをプロキシ転送するだけにシナリオを改良および簡略化しました。
私のベースイメージはCentOSなので、 this here に従って、SELinuxがポート5023への転送を許可していることを確認しました
これのおかげで 質問と回答はこちら 、私には2つの問題が発生していることがわかりました。
したがって、NginxプロキシDockerコンテナとAPI Dockerコンテナに対してdocker-composeによって作成されている異なるデフォルトネットワークは、2つの異なるdocker-compose.ymlファイルを使用しているためです。これは、多くのAPIマイクロサービス用のJenkinsビルドがあり、独立したdocker-composeファイルがあり、ポート80で各マイクロサービスにリクエストを転送するためにNginxプロキシが必要だったためです。
これをテストするために、APIとNginxプロキシーの両方のコンテナーに対してdocker-compose.ymlを作成しました。
version: '3'
services:
reverseproxy:
build:
context: ./
dockerfile: docker/nginxproxy/docker/Dockerfile
image: tsl.devops.reverseproxy.image
container_name: tsl.devops.reverseproxy.container
ports:
- "80:80"
apistaging:
build:
context: ./
dockerfile: docker/staging/Dockerfile
image: tsl.api.example.image
container_name: tsl.api.example.container
ports:
- "5023:5023"
environment:
ASPNETCORE_URLS: http://+:5023
はい、まだ問題がありました。http//:127.0.0.1:5023へのプロキシパスで、転送はNginx Dockerコンテナに残り、Dockerホストで実行されているAPIを見つけることができません。単にdocker-composeを使用する必要がありました。それを取得するためのymlサービス名:
upstream accountstaging {
server apistaging:5023;
}
server {
listen 80;
server_name account.staging.mysite.com;
location / {
proxy_pass http://accountstaging;
proxy_redirect off;
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-Host $server_name;
}
}