docker-compose之Nginx二级目录反向代理禅道

本次项目会用到3个镜像分别是nginx、mysql 和禅道,以后若迁移服务器环境则只需下载这3个镜像即可

mysql与禅道镜像下载与构建参考:mysql   禅道

 

目录介绍

cloud                                # 文件名
+----mysql_db                        # mysql的挂载目录,挂载到容器
|    +----mysqld.cnf                 # mysql的配置文件,挂载到容器
+----nginx                      
|    +----conf.d                     # nginx服务配置目录,挂载到容器
|         +----default.conf          # nginx服务配置文件,挂载到容器
|    +----log 
|         +----host.access.log       # nginx日志文件,挂载到容器
|         +----error.log             # nginx错误日志文件,挂载到容器
|    +----html
|         +----50x.html              # nginx报错50X返回页面
+----zentao                          # 禅道挂载目录,挂载到容器
+----.env                            # docker-compose环境变量配置文件
+----docker-compose.yml              # docker-compose的运行文件

配置

环境变量 — .env文件

# mysql信息配置
MYSQL_IMAGE=mysql:5.7
MYSQL_ROOT_PASSWORD=password
MYSQL_IP=192.110.0.2

# 禅道信息配置
ZENTAO_IMAGE=zentao:latest
ZENTAO_IP_BACKEND=192.110.0.10
ZENTAO_IP_FRONTEND=182.120.0.3

# nginx信息配置
NGINX_IMAGE=nginx:mainline-alpine-perl
NGINX_IP=182.20.0.2

# network信息配置
BACKEND_SUBNET=192.110.0.0/16
FRONTEND_SUBNET=182.120.0.0/16

docker-compose.yml

version: '3.1'

services:
  mysql:
    image: ${MYSQL_IMAGE}                                            # mysql镜像
    container_name: "mysql_5.7"                                      # 容器名称
    volumes:
      - ./mysql_db/mysqld.cnf:/etc/mysql/mysql.conf.d/               # 挂载mysql配置文件
      - ./mysql_db/datadir:/var/lib/mysql/                           # 挂载mysql数据文件
    restart: always                                                  # 开机启动
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}                   # 设置ROOT账号密码
    ports:
      - "3306:3306"
    networks:
      my_backend:                                                    # 加入网络-my_backend
        ipv4_address: ${MYSQL_IP}                                    # 指定的IP地址


  zentao:
    image: ${ZENTAO_IMAGE}                                           # 禅道镜像
    container_name: "zentao_latest"                                  # 容器名称
    volumes:
      - ./zentao/zentaopms:/app/zentaopms                            # 挂载禅道源码路径
      - ./zentao/mysql:/var/lib/mysql                                # 禅道自带的mysql挂载到本机
    restart: always                                                  # 开机启动
    environment:
      - MYSQL_ROOT_PASSWORD=password                                 # 禅道镜像mysql的root账号密码
    ports:
      - "80:8010"                                                    # 容器80端口映射宿主机8010端口
    networks:
      my_backend:                                                    # 加入网络-my_backend
        ipv4_address: ${ZENTAO_IP_BACKEND}                           # 指定IP地址
      my_frontend:                                                   # 加入网络-my_frontend
        ipv4_address: ${ZENTAO_IP_FRONTEND}                          # 指定的IP地址


  nginx:
    image: ${NGINX_IMAGE}                                            # nginx镜像
    container_name: "nginx_latest"                                   # 容器名称
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d                             # 挂载nginx配置文件
      - ./nginx/log/host.access.log:/var/log/nginx/host.access.log   # 挂载nginx日志文件
      - ./nginx/html:/usr/share/nginx/html                           # 挂载nginx首页
    restart: always                                                  # 开机启动
    ports:
      - "80:80"                                                      # 容器80端口映射宿主机80端口
      - "443:443"                                                    # 容器443端口映射宿主机443端口
    networks:
      my_frontend:                                                   # 加入网络-my_frontend
        ipv4_address: ${NGINX_IP}                                    # 指定的IP地址


networks:

  my_backend:                                                        # 自定义网络-my_backend
    driver: bridge                                                   # 定义的网络模式
    ipam:
      config:
        - subnet: ${BACKEND_SUBNET}                                  # 定义网段
        
  my_frontend:                                                       # 自定义网络-my_frontend
    driver: bridge                                                   # 定义的网络模式
    ipam:
      config:
        - subnet: ${FRONTEND_SUBNET}                                 # 定义网段

mysql配置文件mysqld.cnf

[mysqld]
explicit_defaults_for_timestamp=true
character-set-server=utf8
collation-server=utf8_unicode_ci
init_connect='SET NAMES utf8;'
max_allowed_packet=10M
wait_timeout=288000
interactive_timeout = 288000
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
skip-name-resolve
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
datadir		= /var/lib/mysql/
symbolic-links=0

nginx配置文件default.conf

server {
    listen       80;
    server_name  localhost/zentaopms;
    
    # 日志
    access_log  /var/log/nginx/host.access.log  main;

    # 错误日志
    error_log /var/log/nginx/error.log error;
    
    # 二级目录代理禅道
    location /zentaopms {
        proxy_pass      http://182.120.0.3/zentaopms;
        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;
    }

    # 首页
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    # 50X错误页
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}

部署

sudo docker-compose up -d
# 以守护进程模式运行(-d)

查看网络

docker network ls

docker新增了两个网络定义的网络 — filename_my_backend 和 filename_my_frontend,如图:

 

查看容器的运行情况

docker ps -a

禅道安装配置参考博客:Docker部署安装禅道

容器启动运行成功,如图:

修改禅道源码

通过8010端口访问禅道并安装成功

修改禅道配置文件my.php

sudo vim  /app/zentaopms/config/my.php

# 将 $config->requestType修改成GET   $config->webRoot修改成你的二级目录/zentaopms/
# $config->requestType     = 'PATH_INFO';
$config->requestType     = 'GET';
# $config->webRoot         = getWebRoot();
$config->webRoot         = '/zentaopms/';

重启禅道容器后, 访问禅道发现了个问题:禅道的静态资源无法加载(因为二级目录问题,无法正确获取),修改nginx配置对静态文件做个处理,在配置文件default.conf加个location, 如下:

# 静态文件代理到nginx下/usr/share/nginx/html/
location ~*\.(ico|gif|jpg|jpeg|png|bmp|swf|css|js|eot|svg|ttf|woff|woff2|properties|json)$ {
	root /usr/share/nginx/html/;
    }

将禅道源代码下的静态复制到/usr/share/nginx/html/zentaopms, nginx的/usr/share/nginx/html/文件和禅道源码源码都挂载到了宿主机,直接宿主机下操作就可以,这样子nginx的html文件储存静态文件,相当于一个cdn的作用,复制结果如下:

如此,客户端浏览器就可通过二级目录访问禅道, 如下图:

 

不积跬步无以至千里

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章