(2024)docker-compose实战 (8)部署LAMP项目(最终版)

前言

  1. 在前一篇文章中, 我们已经搭建LAMP环境, 但php没有安装扩展, 这篇文章将安装PHP扩展, 实现正常的PHP项目部署
  2. 我在git中查找到一个简易安装PHP扩展的方法(GitHub - mlocati/docker-php-extension-installer: Easily install PHP extensions in Docker containers).
  3. 通过这个方法, 安装PHP扩展, 优点是编辑Dockerfile文件时简单快捷, 填写要用的扩展名即可. 缺点是安装的时间较长, 需耐心等待. 另说明下, 这种方法构建完镜像后, 会自动清除镜像中无用的文件, 这个很赞.

支持的PHP扩展列表

Extension PHP 5.5 PHP 5.6 PHP 7.0 PHP 7.1 PHP 7.2 PHP 7.3 PHP 7.4 PHP 8.0 PHP 8.1 PHP 8.2 PHP 8.3
amqp ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
apcu ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
apcu_bc ✓ ✓ ✓ ✓ ✓
ast ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
bcmath ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
bitset ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
blackfire ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
bz2 ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
calendar ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
cassandra* ✓ ✓ ✓ ✓ ✓ ✓ ✓
cmark ✓ ✓ ✓ ✓ ✓
csv ✓ ✓ ✓ ✓ ✓ ✓
dba ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
ddtrace* ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
decimal ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
ds ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
ecma_intl* ✓ ✓
enchant ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
ev ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
event ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
excimer ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
exif ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
ffi ✓ ✓ ✓ ✓ ✓
ftp ✓ ✓
gd ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
gearman ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
geoip ✓ ✓ ✓ ✓ ✓ ✓ ✓
geos* ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
geospatial ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
gettext ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
gmagick ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
gmp ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
gnupg ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
grpc ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
http ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
igbinary ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
imagick ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
imap ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
inotify ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
interbase ✓ ✓ ✓ ✓ ✓ ✓
intl ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
ion ✓ ✓ ✓
ioncube_loader ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
jsmin ✓ ✓ ✓ ✓ ✓ ✓ ✓
json_post ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
jsonpath ✓ ✓ ✓ ✓ ✓
ldap ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
luasandbox ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
lz4* ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
lzf ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
mailparse ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
maxminddb ✓ ✓ ✓ ✓ ✓ ✓ ✓
mcrypt ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
memcache ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
memcached ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
memprof* ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
mongo ✓ ✓
mongodb ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
mosquitto ✓ ✓ ✓ ✓ ✓ ✓ ✓
msgpack ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
mssql ✓ ✓
mysql ✓ ✓
mysqli ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
newrelic ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
oauth ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
oci8 ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
odbc ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
opcache ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
opencensus ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
openswoole ✓ ✓ ✓ ✓ ✓ ✓ ✓
opentelemetry ✓ ✓ ✓ ✓
parallel* ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
parle* ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
pcntl ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
pcov ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
pdo_dblib ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
pdo_firebird ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
pdo_mysql ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
pdo_oci ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
pdo_odbc ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
pdo_pgsql ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
pdo_sqlsrv* ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
pgsql ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
php_trie ✓ ✓ ✓ ✓ ✓ ✓
pkcs11 ✓ ✓ ✓ ✓ ✓
pq ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
propro ✓ ✓ ✓ ✓ ✓ ✓ ✓
protobuf ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
pspell ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
pthreads* ✓ ✓ ✓
raphf ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
rdkafka ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
recode ✓ ✓ ✓ ✓ ✓ ✓
redis ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
relay ✓ ✓ ✓ ✓ ✓
saxon* ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
seasclick ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
seaslog ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
shmop ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
simdjson* ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
smbclient ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
snappy ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
snmp ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
snuffleupagus ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
soap ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
sockets ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
sodium* ✓ ✓ ✓
solr ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
sourceguardian ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
spx ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
sqlsrv* ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
ssh2 ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
stomp ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
swoole ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
sybase_ct ✓ ✓
sync ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
sysvmsg ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
sysvsem ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
sysvshm ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
tensor ✓ ✓ ✓ ✓ ✓ ✓
tideways ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
tidy ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
timezonedb ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
uopz ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
uploadprogress ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
uuid ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
uv ✓ ✓ ✓ ✓
vips* ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
vld ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
wddx ✓ ✓ ✓ ✓ ✓ ✓
wikidiff2* ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
xdebug ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
xdiff ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
xhprof ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
xlswriter ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
xmldiff ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
xmlrpc ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
xsl ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
yac ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
yaml ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
yar ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
zephir_parser ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
zip ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
zmq ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
zookeeper ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
zstd ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓

目录结构

复制代码
web/									/web/目录
|
├─ mysql/								mysql目录
|  ├─ conf/ 							配置文件目录
|  |  └─  my.cnf						配置文件
|  ├─ log/ 								日志目录
|  └─ data/								数据目录
|
├─ redis/								redis目录
|  ├─ conf/ 							配置文件目录
|  |  └─  my.cnf						配置文件
|  ├─ log/ 								日志目录
|  └─ data/								数据目录
|
├─ laoliu_pro/							项目目录
|  ├─ conf/ 							nginx配置文件目录
|  |  ├─  php.ini 						php.ini
|  |  └─  000-default.conf				apache配置文件
|  ├─ html/ 							项目目录
|  |  └─  index.html					项目文件, 这里是一个文件, 正常情况下可能会有多个文件
|  ├─ log/ 								日志目录
|  └─ Dockerfile 						Dockerfile文件
|
└─ docker-compose.yaml					docker-composer的配置文件

docker-compose.yaml配置文件说明

对照上一篇文章, 只是修改了build字段. 如果有已经构建好的镜像, 可以使用image字段直接指定镜像.

复制代码
version: '3'

services:      
  laoliu_pro:
    build:
      # dockerfile所在的目录
      context: ./laoliu_pro
      # dockerfile的文件名
      dockerfile: Dockerfile
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./laoliu_pro/log:/var/log/apache2:rw 
      - ./laoliu_pro/html:/var/www/html:rw 
      # apache配置目录
      - ./laoliu_pro/conf/000-default.conf:/etc/apache2/sites-available/000-default.conf:ro
      # php.ini
      - ./laoliu_pro/conf/php.ini:/usr/local/etc/php/php.ini
    container_name: laoliu_pro

  # 服务名
  mysql:
    restart: always
    # mysql镜像, 可选5.7或8
    image: mysql:5.7
    environment:
      # root密码
      MYSQL_ROOT_PASSWORD: 1234@5678
      # 允许远程连接
      MYSQL_ROOT_HOST: '%'
    # 挂载卷 <宿主机路径>:<容器路径>
    volumes:
      # docker时间同步
      - /etc/localtime:/etc/localtime:ro
      # 映射日志目录
      - ./mysql/log:/var/log/mysql
      # 映射配置目录
      - ./mysql/conf:/etc/mysql/mysql.conf.d:rw
      # 映射数据目录
      - ./mysql/data:/var/lib/mysql:rw
    # 容器名称
    container_name: mysql
    # 端口映射 <宿主机端口>:<容器端口>
    ports:
      - 3306:3306


  # 服务名
  redis:
    restart: always
    # redis镜像
    image: redis:5-alpine
    # 挂载卷 <宿主机路径>:<容器路径>
    volumes:
      # docker时间同步
      - /etc/localtime:/etc/localtime:ro
      # 映射配置目录
      - ./redis/conf:/etc/redis:ro
      # 映射数据目录
      - ./redis/data:/data:rw
    # 容器名称
    container_name: redis
    # 端口映射 <宿主机端口>:<容器端口>
    ports:
      - 6379:6379
    hostname: redis
    # 在容器启动后执行的命令
    command: redis-server /etc/redis/redis.conf

Dockerfile说明

复制代码
# 这里使用的是php:5.6-apache镜像
FROM php:5.6-apache

ADD --chmod=0755 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/

# apache开启伪静态
RUN a2enmod rewrite

# 安装扩展
RUN install-php-extensions gd \
	&& install-php-extensions iconv \
	&& install-php-extensions opcache \
	&& install-php-extensions zip \
	&& install-php-extensions pdo_mysql \
	&& install-php-extensions bcmath pcntl \
	&& install-php-extensions sockets \
	&& install-php-extensions sysvmsg \
	&& install-php-extensions mysqli \
	&& install-php-extensions redis \
	&& install-php-extensions gettext \
	&& install-php-extensions intl \
	&& install-php-extensions mcrypt \
	&& install-php-extensions mysql \
	&& install-php-extensions shmop \
	&& install-php-extensions soap \
	&& install-php-extensions xmlrpc

启动容器

复制代码
# 启动容器
docker-compose up -d

构建镜像

复制代码
# 构建镜像
docker build -t laoliu_pro/php56_apache:v1 /web/laoliu_pro

apache配置文件(同上一篇文章)

文件路径: /web/laoliu_pro/conf/000-default.conf

复制代码
<VirtualHost *:80>
    ServerName laoliu.pro
    ServerAlias laoliu.pro
    DocumentRoot /var/www/html/public

    <Directory /var/www/html/public>
	    DirectoryIndex index.php index.html index.htm
        Options Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        allow from all
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

PHP项目(同上一篇文章)

PHP项目直接部署到/web/laoliu_pro/html中即可. 记得修改数据库配置文件

php.ini(同上一篇文章)

如果需要修改运行内存, 上传设置, 超时时间等, 则需要补充/web/laoliu_pro/conf/php.ini文件. 若只是使用默认设置, 则可以在docker-compose.yaml中去掉php.ini的映射.

相关推荐
70后写java的老码农1 小时前
docker-compose 部署 Redis Stack Server 6.2.6-v19
redis·docker
.冰块.2 小时前
流量大了自动加 Pod!K8s HPA 扩缩容与 ResourceQuota/LimitRange 资源管控实战
linux·云原生·容器·kubernetes·hpa·quota·limitrange
雪落漂泊2 小时前
Linux进程(四)概念:命令行参数和环境变量篇
linux·运维·服务器
方便面不加香菜2 小时前
Docker Container -- 容器命令详解
运维·docker·容器
say_fall3 小时前
【Linux系统编程】Linux进程信号:从“外卖到了“到内核里的一张位图
linux·运维·服务器·车载系统·智能硬件
Z21-X3 小时前
云原生运维实战笔记:企业网站综合上云部署与云运维服务全景解析
运维·笔记·学习·云原生
Decay__4 小时前
19_MySQL 告警与自动化运维 —— 告警分级收敛 / Webhook / 定时巡检 / 脚本库
运维·数据库·sql·mysql·架构
FungLeo4 小时前
成为全栈·基础补充·Linux 服务器入门
linux·运维·服务器·ssh·部署·成为全栈
爱和冰阔落4 小时前
【Linux网络】TCP 服务器怎么写?从 listen、accept 到 read/write,手写完整 Echo Server
linux·运维·服务器·网络
鲁邦通物联网4 小时前
工业装备OEM远程服务架构:边缘计算网关与售后运维系统设计
运维·边缘计算·数据采集·工业数据采集·边缘计算网关·plc数采·厂内数采