差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
docker:docker:setup_https_php [2024/01/13 23:54]
tony
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上的設定過程。
 ===== Steps ===== ===== Steps =====
-==== Install Docker ====+==== Install Docker ​and Docker-Compose ​====
 在Rocky Linux 9已轉變為使用podman去管理容器,所以當我執行下方指令時,實際上會更新podman與安裝podman-docker。 在Rocky Linux 9已轉變為使用podman去管理容器,所以當我執行下方指令時,實際上會更新podman與安裝podman-docker。
 <code bash> <code bash>
 sudo dnf install docker sudo dnf install docker
 </​code>​ </​code>​
 +如果直接使用docker-compose去安裝,會找不到對應的package。參考網路作法是要自己下載額外處理,所以我直接使用Rocky Linux的解法:​
 <code bash> <code bash>
-sudo dnf install ​nginx+sudo dnf install ​podman-compose
 </​code>​ </​code>​
 +==== Prepare files ====
 +在撰寫dockerfile或docker-compose過程,跌跌撞撞。在這奉勸一句,對於不熟悉的項目,尤其和軟體或系統設定有關,"​千萬"​別照抄Chatgpt,否則你解問題的經驗值會暴增。我最後是基於[[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|這篇文章]]內容,去修改並解決相關環境問題。此作者結構設計非常清楚,app資料夾負責放對應的web應用程式,以我來說就是dokuwiki;php資料夾放置獨立php-fpm container的dockerfile,方便調整環境設定;最後就是docker-compose與nginx的設定檔。
 +<code bash>
 +├── app
 +│   ​├── index.php
 +│   ​└── dokuwiki
 +├── docker-compose.yaml
 +├── nginx.conf
 +└── php
 +    ├── Dockerfile
 +    └── php.ini
 +</​code>​
 +=== docker-compose.yaml ===
 +這裡須注意的是depends_on去控制啟動順序,而links讓nginx可以存取php,因為naginx會把php的request forward到9000的port。
 +<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>​
 +=== 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> <code bash>
-sudo dnf install python3-certbot-nginx +podman-compose up
-sudo dnf install certbot+
 </​code>​ </​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 =====
 +  * [[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 開發環境]]
 +=====    =====
 +----
 +\\
 +~~DISQUS~~