差異處
這裏顯示兩個版本的差異處。
Both sides previous revision 前次修改 下次修改 | 前次修改 | ||
docker:docker:setup_https_php [2024/01/14 23:00] tony [Prepare files] |
docker:docker:setup_https_php [2024/01/23 22:16] (目前版本) tony |
||
---|---|---|---|
行 1: | 行 1: | ||
{{tag>docker}} | {{tag>docker}} | ||
- | ====== Setup HTTPS + PHP with docker ====== | + | ====== Setup HTTP + PHP with docker ====== |
===== Introduction ===== | ===== Introduction ===== | ||
過去我架設網站的方式不是用實體機器的OS,就是透過VirtualBox,不然就是VMWare ESXi。因為我對Docker不熟,所以這次趁著要報廢舊機器,開始嘗試使用Docker架站。本篇記錄我在Rocky Linux 9.2上的設定過程。 | 過去我架設網站的方式不是用實體機器的OS,就是透過VirtualBox,不然就是VMWare ESXi。因為我對Docker不熟,所以這次趁著要報廢舊機器,開始嘗試使用Docker架站。本篇記錄我在Rocky Linux 9.2上的設定過程。 | ||
行 25: | 行 25: | ||
└── php.ini | └── php.ini | ||
</code> | </code> | ||
- | |||
=== docker-compose.yaml === | === docker-compose.yaml === | ||
+ | 這裡須注意的是depends_on去控制啟動順序,而links讓nginx可以存取php,因為naginx會把php的request forward到9000的port。 | ||
<code yaml> | <code yaml> | ||
+ | version: '1' | ||
+ | services: | ||
+ | nginx: | ||
+ | image: library/nginx:1.19-alpine | ||
+ | container_name: "http_nginx" | ||
+ | ports: | ||
+ | - 80:80 | ||
+ | volumes: | ||
+ | - "./nginx.conf:/etc/nginx/conf.d/default.conf" | ||
+ | - "./app:/var/www/html" | ||
+ | depends_on: | ||
+ | - php | ||
+ | links: | ||
+ | - php | ||
+ | php: | ||
+ | image: "dokuwiki" | ||
+ | build: ./php | ||
+ | container_name: "dokuwiki" | ||
+ | ports: | ||
+ | - 9000:9000 | ||
+ | volumes: | ||
+ | - "./app:/var/www/html" | ||
+ | </code> | ||
+ | === nginx.conf === | ||
+ | 大部分內容都是參考別人的,唯一有特別調整的只有fastcgi_pass php:9000。原始範例是使用localhost:9000,但可能因為我使用podman的關係,所以要把localhost改為service name php才有辦法正確的redirect request。 | ||
+ | <code yaml> | ||
+ | server { | ||
+ | listen 80; | ||
+ | server_name localhost; | ||
+ | root /var/www/html; | ||
+ | index index.php; | ||
+ | location ~ \.php(/|$) { | ||
+ | fastcgi_pass php:9000; | ||
+ | fastcgi_split_path_info ^(.+\.php)(.*)$; | ||
+ | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; | ||
+ | fastcgi_param PATH_INFO $fastcgi_path_info; | ||
+ | fastcgi_buffer_size 128k; | ||
+ | fastcgi_buffers 4 256k; | ||
+ | fastcgi_busy_buffers_size 256k; | ||
+ | include fastcgi_params; | ||
+ | } | ||
+ | |||
+ | error_page 500 502 503 504 /50x.html; | ||
+ | location = /50x.html { | ||
+ | root /var/www/html; | ||
+ | } | ||
+ | } | ||
</code> | </code> | ||
+ | === Dockerfile === | ||
+ | 因為我不需要什麼超強的php工具集,所以我只留以下內容。 | ||
+ | <code> | ||
+ | FROM php:7.4.9-fpm-alpine | ||
+ | COPY php.ini $PHP_INI_DIR/conf.d/ | ||
+ | </code> | ||
+ | === php.ini與index.php === | ||
+ | 參考別人的,沒什麼特別。php.ini: | ||
+ | <code> | ||
+ | date.timezone = "Asia/Taipei" | ||
+ | display_errors = 1 | ||
+ | error_reporting = E_ALL | ||
+ | </code> | ||
+ | index.php: | ||
+ | <code php> | ||
+ | <?php | ||
+ | phpinfo(); | ||
+ | </code> | ||
+ | ==== First Startup ==== | ||
+ | 接著在docker-compose設定檔的目錄下,執行以下指令: | ||
+ | <code bash> | ||
+ | podman-compose up | ||
+ | </code> | ||
+ | 在連至我的dokuwiki後,就出現以下錯誤:\\ | ||
+ | {{:docker:docker:docker_php_permission.png|}} | ||
+ | ==== Tune Permission ==== | ||
+ | 研究後,發現root cause是由於php container對於dokuwiki的volume沒有寫入的權限。要解決這個問題,就是讓container與外部系統對應資料有相同的使用者即可;而container對於外部系統的使用者,只會認得ID。這意味著就是讓彼此的ID相同就可以解決這個問題。 | ||
+ | === 設定外部系統資料夾擁有者 === | ||
+ | 首先查詢要設定的使用者ID: | ||
+ | <code bash> | ||
+ | [root@localhost dokuwiki]# id -u tonylin | ||
+ | 1000 | ||
+ | </code> | ||
+ | 將使用者與群組設定到對應目錄上: | ||
+ | <code bash> | ||
+ | chown -R tonylin:tonylin app | ||
+ | </code> | ||
+ | === 調整PHP Dockerfile權限 === | ||
+ | 重新建立www-data使用者與群組,並將ID設為1000。設為1000的原因,是由於前一步驟已經查到使用者ID為1000。 | ||
+ | <code> | ||
+ | FROM php:7.4.9-fpm-alpine | ||
+ | |||
+ | RUN apk --no-cache add shadow | ||
+ | |||
+ | COPY php.ini $PHP_INI_DIR/conf.d/ | ||
+ | |||
+ | ARG USER_ID=1000 | ||
+ | ARG GROUP_ID=1000 | ||
+ | |||
+ | RUN userdel -f www-data &&\ | ||
+ | if getent group www-data ; then groupdel www-data; fi &&\ | ||
+ | groupadd -g ${GROUP_ID} www-data &&\ | ||
+ | useradd -l -u ${USER_ID} -g www-data www-data &&\ | ||
+ | install -d -m 0755 -o www-data -g www-data /home/www-data | ||
+ | </code> | ||
+ | 如果上述腳本執行有問題,可以執行底下指令去看build container的詳細執行過程。 | ||
+ | <code bash> | ||
+ | podman-compose up -build | ||
+ | </code> | ||
+ | ==== Startup again ==== | ||
+ | 最後在docker-compose設定檔的目錄下,執行以下指令,然後就可以看到畫面了~ | ||
+ | <code bash> | ||
+ | podman-compose up | ||
+ | </code> | ||
+ | {{:docker:docker:docker_fix_permission_issue.png|}}\\ | ||
+ | 接下來我就要開始設定憑證和讓網站上線了。 | ||
===== Reference ===== | ===== Reference ===== | ||
* [[https://jtreminio.com/blog/running-docker-containers-as-current-host-user/|將目前User設定到docker container中]] | * [[https://jtreminio.com/blog/running-docker-containers-as-current-host-user/|將目前User設定到docker container中]] | ||
* [[https://charlie-c.medium.com/%E7%94%A8docker%E5%BB%BA%E7%AB%8Bphp-nginx-%E9%96%8B%E7%99%BC%E7%92%B0%E5%A2%83-33c5f88edeb3|用Docker建立php + Nginx 開發環境]] | * [[https://charlie-c.medium.com/%E7%94%A8docker%E5%BB%BA%E7%AB%8Bphp-nginx-%E9%96%8B%E7%99%BC%E7%92%B0%E5%A2%83-33c5f88edeb3|用Docker建立php + Nginx 開發環境]] | ||
+ | ===== ===== | ||
+ | ---- | ||
+ | \\ | ||
+ | ~~DISQUS~~ |