【问题标题】:Using Nginx as a proxy for Jenkins using Docker使用 Nginx 作为 Jenkins 的代理使用 Docker
【发布时间】:2019-12-11 03:40:32
【问题描述】:

我使用 Nginx 作为 Jenkins 服务器的代理。都在 Docker 容器中。

这个想法是 Jenkins 在端口 8080 上运行,端口 8080 暴露。 Nginx 监听 80 端口并将流量重定向到 8080 端口上的 Jenkins。如果您尝试直接访问 8080 端口,它将拒绝连接。

请查看 docker-compose.yml 文件:

version: '3.7'

services:
    master:
        build: ./jenkins-master
        networks:
          - jenkins-net
        volumes:
          - jenkins-log:/var/log/jenkins
          - jenkins-data:/var/jenkins_home

   nginx:
      build: ./jenkins-nginx
      ports:
        - "80:80"
      networks:
        - jenkins-net

networks:
 jenkins-net:

volumes:
 jenkins-log:
 jenkins-data:

Jenkins-master Dockerfile:

FROM jenkins/jenkins:alpine
LABEL maintainer=''

USER root
RUN mkdir /var/log/jenkins
RUN mkdir /var/cache/jenkins
RUN chown -R jenkins:jenkins /var/log/jenkins
RUN chown -R jenkins:jenkins /var/cache/jenkins
USER jenkins

ENV JAVA_OPTS='-Xmx8192m'
ENV JENKINS_OPTS=' --handlerCountMax=300 -- logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war'

这是 nginx.conf 文件:

server {
    listen 80;
    server_name localhost;
    access_log off;

   location / {

   proxy_pass         http://master:8080;

   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 http;
   proxy_max_temp_file_size 0;


   proxy_connect_timeout      150;
   proxy_send_timeout         100;
   proxy_read_timeout         100;

   proxy_buffer_size          8k;
   proxy_buffers              4 32k;
   proxy_busy_buffers_size    64k;
   proxy_temp_file_write_size 64k;

 }

}

这是我的 jenkins-nginx Dockerfile:

FROM nginx:mainline-alpine

RUN rm /etc/nginx/conf.d/default.conf
COPY jenkins.conf /etc/nginx/conf.d/jenkins.conf
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx"]

添加 Nginx Dockerfile 以确保完整性:

FROM nginx:mainline-alpine

RUN rm /etc/nginx/conf.d/default.conf
COPY jenkins.conf /etc/nginx/conf.d/jenkins.conf
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx"]

Jenkins.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;
  keepalive_timeout  65;
  client_max_body_size  300m;
  client_body_buffer_size  128k;

  gzip on;
  gzip_http_version 1.0;
  gzip_comp_level 6;
  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;

 }

问题在于两者都是独立工作的,但是一旦我尝试将它们连接到一个网络上,它们就会崩溃。

两个服务都抛出localhost refused to connect 错误

【问题讨论】:

  • 看起来 nginx 正在监听 80 端口并将“/”代理到 127.0.0.1:8080,我想你想要master:50000。如果 nginx 要代理,那么您也可能不想将您的 jenkins 容器映射到本地端口。
  • 这个想法是 Jenkins 在 8080 端口上运行,并暴露了 8080 端口。 Nginx 在端口 80 上侦听并将流量重定向到端口 8080 上的 Jenkins。在端口 50000 上公开的 Docker 网络连接它们。
  • 我在使用docker-compose up --build重建图像时遇到了这个错误
  • Jenkins 位于 1 个容器中,实际运行在端口 8080 上,nginx 位于另一个容器中,运行在端口 80 上。您将 nginx 容器中的端口 80 映射到主机上的端口 80。 Nginx 然后应该将流量转发到 not 为 127.0.0.1 的 jenkins 容器。相反,您可以只使用服务名称和端口,例如 master:8080
  • 你为什么使用 build: ./jenkins-master ?您是否使用自定义 jenkins 而不是官方 Jenkins Dockerfile?

标签: docker nginx jenkins docker-compose


【解决方案1】:

您需要在 docker-compose 上公开端口 8080

ports:
  - 8080
  - 50000:50000

这可能有助于 nginx (jenkins.conf)

proxy_redirect http://master:8080/;

【讨论】:

  • 我更新了我的问题以反映对代码的更改。
  • 你会检查jenkins容器端口8080是否连接到nginx端口80?在 nginx 服务器上,如果你安装了 netcat,运行:nc -zv master 8080
【解决方案2】:

首先你在 80 端口上发布 master 和 nginx。这太过分了。只需在 nginx 上发布端口 80。不需要master上的其他端口,除非你想在你的本地地址和端口上绑定这个端口50000。

同一网络中的容器可以解析名称并到达其端口而无需发布。请记住,容器不能调用 localhost 来访问您的主机。它只会解决容器本身。在配置和容器本身中使用容器名称。

更新:

我的配置如下所示。这对我有用。

docker-compose.yaml:

version: '3.7'

services:
    master:
        image: jenkins/jenkins:alpine
        networks:
          - jenkins-net
        volumes:
          - jenkins-log:/var/log/jenkins
          - jenkins-data:/var/jenkins_home
    nginx:
      image: nginx:alpine
      ports:
        - "80:80"
      volumes:
        - type: bind
          source: ./nginx.conf
          target: /etc/nginx/conf.d/default.conf
      networks:
        - jenkins-net

networks:
  jenkins-net:

volumes:
  jenkins-log:
  jenkins-data:

nginx.conf:

server {
    listen 80;
    server_name localhost;
    access_log off;

    location / {

        proxy_pass         http://master:8080;

        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 http;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      150;
        proxy_send_timeout         100;
        proxy_read_timeout         100;

        proxy_buffer_size          8k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;

    }

}

然后我可以拨打http://localhost 并按预期工作。希望它能按预期工作,并且您可以根据个人需求对其进行调整。

【讨论】:

  • 顺便说一句。 docker 网络暴露在 50000 上是什么意思?你的方案是什么?
  • docker run -p 8080:8080 -p 50000:50000 --name=Jenkins-master --network Jenkins-net --mount source=xyz -d Jenkins/Jenkins 它使用 Jenkins 镜像创建并运行容器,暴露端口 8080 并将其连接到“Jenkins-net”网络。但是我正在关注的教程并没有明确说明我们要进行 50000:50000 端口暴露的内容和原因?
  • 我很快查了一下。看起来 50000 为您提供了远程(Java)API 端口。你听过我的建议吗?
  • 我做到了,曼努埃尔,但没有任何变化。仍然得到同样的错误。另外,我通过代理传递和代理重定向获得invalid parameter。看起来我不应该传递服务的名称。
  • 这是一种适当的折磨。这两个服务都可以自己运行,但是一旦我使用docker-compose 构建它们并暴露正确的端口并运行它们,它就会崩溃。
【解决方案3】:

这是适用于我的配置:

docker-compose.yml:

version: '3.7'

services:
    master:
        build: ./jenkins-master
    networks:
      - jenkins-net
    volumes:
      - jenkins-log:/var/log/jenkins
      - jenkins-data:/var/jenkins_home

nginx:
    build: ./jenkins-nginx
    ports:
      - "80:80"
    volumes:
      - type: bind
        source: ./jenkins-nginx/nginx.conf
        target: /etc/nginx/conf.d/default.conf
    networks:
      - jenkins-net

networks:
  jenkins-net:

volumes:
  jenkins-log:
  jenkins-data:

Nginx-Dockerfile:

FROM nginx:mainline-alpine

COPY ./jenkins.conf /etc/nginx/conf.d/jenkins.conf
COPY ./nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx"]

Jenkins-Dockerfile:

FROM jenkins/jenkins:alpine
LABEL maintainer=''

USER root
RUN mkdir /var/log/jenkins
RUN mkdir /var/cache/jenkins
RUN chown -R jenkins:jenkins /var/log/jenkins
RUN chown -R jenkins:jenkins /var/cache/jenkins
USER jenkins

ENV JAVA_OPTS='-Xmx8192m'
ENV JENKINS_OPTS=' --handlerCountMax=300 --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war'

nginx.conf:

server {
    listen 80;
    server_name localhost;
    access_log off;

    location / {

   proxy_pass     http://master:8080;

   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 http;
   proxy_max_temp_file_size 0;


   proxy_connect_timeout      150;
   proxy_send_timeout         100;
   proxy_read_timeout         100;

   proxy_buffer_size          8k;
   proxy_buffers              4 32k;
   proxy_busy_buffers_size    64k;
   proxy_temp_file_write_size 64k;

   }

}

jenkins.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;
   keepalive_timeout  65;
   client_max_body_size  300m;
   client_body_buffer_size  128k;

  gzip on;
  gzip_http_version 1.0;
  gzip_comp_level 6;
  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;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 2020-07-29
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    相关资源
    最近更新 更多