自動目錄
這次的目標是把服務裝在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
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
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
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
目錄架構看起來這樣:
├── project
└── docker
├── docker-compose.yml
└── php8
├── apache2
│ └── 000-default.conf
├── Dockerfile
└── php
└── php.ini
- project 是專案放置目錄(目前是空的)
- 設定檔放php8的目錄下
先別急著啟動,先把下面的設定完成。
2. Dockerfile等設定檔
Dockerfile
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
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
修改的內容如下:
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 方式安裝
# git clone https://github.com/codeigniter4/CodeIgniter4.git ci4
上面可以在產生一個ci4目錄,目錄看起來是這樣的
└── 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 $defaultLocale = 'zh-TW';
public $supportedLocales = ['zh-TW'];
public $appTimezone = 'Asia/Taipei';
3. 啟動自動目錄
app/Config/Routes.php
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