[Rocky9] codeignitor4+ php:8.3-apache + docker compose

URL Link //n.sfs.tw/16430

2024-06-15 04:20:08 By 張○○

這次的目標是把服務裝在docker,裡面放入 php8.3 apache的docker,並使用 docker compose 。

在二年前曾經有有過一篇類似的,那篇是nginx+php-fpm的組合,後來我就不太喜歡使用NGINX+ PHP-FPM這樣的方式,還是apache+php比較完美的組合,所以這篇是我現在比較喜歡的方式。

 

系統

Rocky Linux release 9.4 (Blue Onyx)

已安裝 docker ,docker compose

# docker version
Client: Docker Engine - Community
 Version:           26.1.3
 API version:       1.45
 Go version:        go1.21.10
 Git commit:        b72abbb
 Built:             Thu May 16 08:35:19 2024
 OS/Arch:           linux/amd64
 Context:           default
Server: Docker Engine - Community
 Engine:
  Version:          26.1.3
  API version:      1.45 (minimum version 1.24)
  Go version:       go1.21.10
  Git commit:       8e96db1
  Built:            Thu May 16 08:33:39 2024
  OS/Arch:          linux/amd64
  Experimental:     true
 containerd:
  Version:          1.6.32
  GitCommit:        8b3b7ca2e5ce38e8f31a34f35b2b68ceb8470d89
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0


# docker compose version
Docker Compose version v2.27.0

1. Docker compose

只需要一個php8的服務即可,並把container也命名為php8

docker-compose.yml

services:
  php8:
    image: php:8.3-apache-mysqli
    build: php8/
    container_name: php8
    restart: always
    volumes:
      - /home/project/ci4/:/var/www/html/dns8:rw
      - /etc/localtime:/etc/localtime:ro
      - ./php8/apache2/:/etc/apache2/sites-available/
      - ./php8/php/php.ini:/usr/local/etc/php/conf.d/php.ini

目錄架構看起來這樣:

/home
├── project
└── docker
    ├── docker-compose.yml
    └── php8
        ├── apache2
        │   └── 000-default.conf
        ├── Dockerfile
        └── php
            └── php.ini

  - project 是專案放置目錄(目前是空的)
  - 設定檔放php8的目錄下

先別急著啟動,先把下面的設定完成。

 

2. Dockerfile等設定檔

Dockerfile

FROM php:8.3-apache
MAINTAINER axer
RUN ["/bin/bash","-c","a2enmod rewrite"]
RUN apt-get update && \
 apt-get install -y libxml2-dev
RUN docker-php-ext-install soap && \
 apt-get install -y vim
RUN apt install libicu-dev -y && \
 docker-php-ext-install intl && \
 docker-php-ext-enable intl && \
 rm -rf /etc/localtime && \
 ln -s /usr/share/zoneinfo/Asia/Taipei /etc/localtime && \
 docker-php-ext-install mysqli && \
 alias ll='ls -l --color'

以上設定主要是安裝

  apahce mod_rewrite
  libxml (xml, xmlreader, xmlwriter
  vim
  php-intl
  php-mysqli
  php-mbstring
 

網域設定檔 000-default.conf

<VirtualHost *:80>
    DocumentRoot /var/www/html/project/public/
    ServerName project.exmaple.com
    <Directory "/var/www/html/project/public/">
      Options -Indexes
      AllowOverride All
      <RequireAll>
        Require all granted
      </RequireAll>
    </Directory>
</VirtualHost>

注意目錄的設定。

 

php.ini

這個檔是先註解設定然後啟動後PHP8 再從 Docker Container中的目錄中拷背出來,

# mkdir -p /home/docker/php8/php/
# cd /home/docker/php8/php/
# docker cp php8:/usr/local/etc/php/php.ini-production ./php.ini

修改的內容如下:

memory_limit = 1024M
display_errors = On
post_max_size = 50M
extension=intl
extension=mbstring
extension=mysqli
date.timezone = "Asia/Taipei"
session.gc_maxlifetime = 86400

全部準備完後,先別急著啟動,先把下面的設定完成。

 

 

3. 安裝 Codeignitor4

可以使用git或是tarball 方式安裝

# cd /home/project
# git clone https://github.com/codeigniter4/CodeIgniter4.git ci4

上面可以在產生一個ci4目錄,目錄看起來是這樣的

./home
└── project
   └── ci4
      ├── admin
      ├── app

      ├── CHANGELOG.md
      ├── changelogs
      ├── CODE_OF_CONDUCT.md
      ├── composer.json
      ├── contributing
      ├── CONTRIBUTING.md
      ├── deptrac.yaml
      ├── env  <== 環境檔
      ├── LICENSE
      ├── phpdoc.dist.xml
      ├── phpmetrics.json
      ├── phpstan-baseline.php
      ├── phpstan-bootstrap.php
      ├── phpstan.neon.dist
      ├── phpunit.xml.dist
      ├── preload.php
      ├── psalm_autoload.php
      ├── psalm-baseline.xml
      ├── psalm.xml
      ├── public
      ├── README.md
      ├── rector.php
      ├── SECURITY.md
      ├── spark
      ├── system
     
├── tests
     
├── tools
     
├── user_guide_src
     
├── utils
      └── writable

上面的檔案都是git 下來的,接下來修改一下設定:

 

1. 修改writeable目錄

 

chmod 777 -R writable

2. 修改預設參數

app/Config/App.php

    public $baseURL = 'http://ci4.example.com/';
    public $defaultLocale = 'zh-TW';
    public $supportedLocales = ['zh-TW'];
    public $appTimezone = 'Asia/Taipei';

3. 啟動自動目錄

app/Config/Routes.php

$routes->setAutoRoute(true);

 

4. 修改環境檔

env

CI_ENVIRONMENT = production

 

database.default.hostname = 192.168.1.123
database.default.database = dns8
database.default.username = dns8
database.default.password = Passwrod123
database.default.DBDriver = MySQLi
# database.default.DBPrefix =
database.default.port = 3306

session.driver = 'CodeIgniter\Session\Handlers\FileHandler'
session.savePath = /var/www/html/writable

 

可以啟動docker,由於設定中已經指定重建,所以DOCKER會替我們建一個名為 php:8.3-apache-mysqli 的 images

 

測試你的頁面

http://project.exmaple.com/

 

 

 

參考資料

[1] docker安裝  intl  https://stackoverflow.com/questions/76003238/installing-php-extension-intl-on-a-php-docker-image