本次項目會用到3個鏡像分別是nginx、mysql 和禪道,以後若遷移服務器環境則只需下載這3個鏡像即可
目錄介紹
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的作用,複製結果如下:
如此,客戶端瀏覽器就可通過二級目錄訪問禪道, 如下圖:
不積跬步無以至千里