目的:wordpress 和 discourse 服務 並存在同一台機器裡
觀看最好能具備…
- docker 使用經驗
- nginx 設定經驗
How
- discourse 透過 docker 安裝建置服務
- 利用 docker 建置 nginx+mysql+php-fpm
.
.
ref. 其中第一、第二篇文章很重要
discourse docker app 內有自己的 nginx 服務
所以需要先把 discourse docker container
./launcher stop app
discourse 修改重點
containers/app.yml 內
templates
停用: - “templates/web.ssl.template.yml”
新增: - “templates/web.socketed.template.yml”
停用/曝光 port
expose:
#- “80:80” # http
#- “443:443” # https
ps: 如果有使用 https(ssl) 也一並停用上面相對應的設定
調整完後, 重建 discourse docker 服務, 並啟動他
./launcher rebuild app
./launcher start app
.
.
建立 nginx+mysql+php-fpm
我們需要有另一個 nginx 做全站網站導向~
用另一個 docker-compose 建立 nginx, mysql, php-fpm 這些服務
git clone GitHub - cscolabear/docker-dev: Docker Compose for local development
(記得另外使用(加入) mysql branch)
docker-compose.yml 稍做調整
version: '2.2'
services:
fpm:
hostname: docker-php-fpm
build:
context: ./Dockerfiles/php-fpm
image: cscolabear/7.2-fpm:latest
ports:
- 9000:9000
volumes:
- /var/www:/var/www
- ./Dockerfiles/php-fpm/php.ini:/usr/local/etc/php/php.ini
mem_limit: 256m
restart: on-failure
depends_on:
- mysql
extra_hosts:
- "localhost:172.16.1.50"
networks:
app_net:
ipv4_address: 172.16.1.40
mysql:
hostname: docker-mysql
image: mysql:5.7
ports:
- 3306:3306
command: --default-authentication-plugin=mysql_native_password
volumes:
- ./Database/mysql:/var/lib/mysql
mem_limit: 256m
environment:
MYSQL_ROOT_PASSWORD: roor_password
MYSQL_USER: non_user
MYSQL_PASSWORD: non_password
command: mysqld --sql_mode="" --character-set-server=utf8 --init-connect='SET NAMES UTF8;'
restart: on-failure
networks:
- app_net
nginx:
hostname: docker-nginx
build:
context: ./Dockerfiles/nginx
image: cscolabear/nginx:latest
ports:
- 80:80
- 443:443
volumes:
- /var/www:/var/www
- ./Logs:/var/log/nginx
- ./Dockerfiles/nginx/sites-enabled:/etc/nginx/sites-enabled
- /var/discourse/shared/standalone:/var/discourse/shared/standalone
mem_limit: 32m
depends_on:
- fpm
restart: on-failure
networks:
app_net:
ipv4_address: 172.16.1.50
workspace:
hostname: docker-workspace
build:
context: ./Dockerfiles/workspace
image: cscolabear/workspace:latest
#ports:
#- "22:22"
volumes:
- /var/www:/var/www
depends_on:
- fpm
- mysql
restart: on-failure
extra_hosts:
- "localhost:172.16.1.50"
tty: true
networks:
app_net:
ipv4_address: 172.16.1.30
networks:
app_net:
driver: "bridge"
ipam:
config:
- subnet: 172.16.1.0/16
ps:
- 為了mem_limit 降版為 2.2
- nginx volumes 的設定別忘, 設定相對應目錄
- workspace 可以不用掛載
// 由 master 開一個新的 branch
git branch wordpress
// 將 my-sql 合併, 建立一個 nginx, mysql, php-fpm 的 docker-compose.yml
git fetch origin service/add-mysql && git merge service/add-mysql
接著就可以依 docker-dev/README.md at master · cscolabear/docker-dev · GitHub 上的流程建立 docker container
ref.
初次建立需要一點時間~~~
安裝、建立完成, 可以執行指令查看 docker 運作狀況, cpu, memory 使用情形
docker stats
ps: 該圖內 docker 啟用了四個服務 php-fpm, nginx, mysql, discourse app
上述 git repo 放在這個位置 /var/www/docker-dev
(其實不要放這比較好; /var/docker-dev 可能比較適合)/var/www 這個目錄下的東西被定義是曝光到前端的網站
建立測試網站
先建立一個測試站目錄
/var/www/test
新增一個 php 檔做為測試
/var/www/test/index.php
內容為…
<?php
phpinfo();
用 php 檔做測試, 測試 nginx 和 php-fpm 是否正常啟用
記得將 dns/domain 指向指定的 IP
e.g. test.workxplay.net
設定 nginx 接收 domain 後要指定哪個資料夾目錄
ps: 該目錄下副檔名為 conf 才會被 nginx 載入
一般來說, 會把 domain 當成 .conf 的主檔名
e.g. test.workxplay.net.conf
server {
listen 80; listen [::]:80;
server_name test.workxplay.net;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2; listen [::]:443 ssl http2;
ssl_certificate /var/discourse/shared/standalone/ssl/uni.workxplay.net.cer;
ssl_certificate_key /var/discourse/shared/standalone/ssl/uni.workxplay.net.key;
server_name test.workxplay.net;
root /var/www/test.workxplay.net;
index index.html index.htm index.php;
access_log /var/log/nginx/test.workxplay.net.access.log main;
error_log /var/log/nginx/test.workxplay.net.error.log;
charset utf-8;
autoindex off;
error_page 403 = 404;
error_page 404 /404.html;
location ~ /\.ht {
deny all;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_pass fpm:9000;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_read_timeout 600;
include fastcgi_params;
}
}
ps: 設定路徑時注意 docker 內和本機的路徑關係
也可以試著用 nginx tools 自動產出
將新建好的 nginx conf 放到下面位置
/var/www/docker-dev/Dockerfiles/nginx/sites-enabled/
接著重啟 docker 內的 nginx
sudo docker-compose restart nginx
接著 test.workxplay.net 這個 domain 就可以看見測試頁面了
外部 nginx 導向 discourse docker container
同上面動作,新建一個 nginx conf; 並指向 uni.workxplay.net
e.g.
server {
listen 80; listen [::]:80;
server_name uni.workxplay.net;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2; listen [::]:443 ssl http2;
server_name uni.workxplay.net;
ssl_certificate /var/discourse/shared/standalone/ssl/uni.workxplay.net.cer;
ssl_certificate_key /var/discourse/shared/standalone/ssl/uni.workxplay.net.key;
ssl_session_tickets off;
http2_idle_timeout 5m; # up from 3m default
location / {
proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
#proxy_set_header Host $http_host;
proxy_set_header Host https;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
}
location ~ /\. {
access_log off;
log_not_found off;
deny all;
}
}
ps: 設定路徑時注意 docker 內和本機的路徑關係
重啟外部的 nginx, 試著用瀏覽器打開 uni.workxplay.net
升級記錄
2.4.x → 2.7.0.beta3 除了 discourse 主程式,discourse docker 也都有升級
本來使用 GUI 的升級鈕,但都會失敗
透過下面的指令完成
( ref. How do I manually update Discourse and Docker image to latest? - admins - Discourse Meta)
cd /var/discourse
git pull
./launcher rebuild app
如有需要記得加 sudo
ps: 不曉得為啥 ./launcher rebuild app 做了兩次才完成
另外也依這篇申請了 geoip API key,設定了 DISCOURSE_MAXMIND_LICENSE_KEY
不過應該是沒有使用到~
障礙排除
Q. docker 服務啟用沒反應、失敗
A.
docker-compose logs
查看所有 docker 服務的log