- 首先在项目根目录下编写一个docker-compose.yml文件
services:
web:
image: nginx:latest
restart: always
ports:
- 80:80
volumes:
- /data/lnmp/nginx/conf.d:/etc/nginx/conf.d
- /data/lnmp/nginx/html:/usr/share/nginx/html
- /data/lnmp/nginx/log:/var/log/nginx
depends_on:
- php
- mysql
networks:
- lnmp-network
php:
image: php:7.4-fpm
restart: always
volumes:
- /data/lnmp/nginx/html:/usr/share/nginx/html
networks:
- lnmp-network
depends_on:
- mysql
mysql:
image: mysql:5.7
restart: always
volumes:
- /data/lnmp/dbdata:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: "123456"
MYSQL_DATABASE: login
networks:
- lnmp-network
networks:
lnmp-network:
driver: bridge
volumes:
dbdata: null
- 运行docker-compose.yml
[root@localhost lnmp]# docker compose up -d
[root@localhost lnmp]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
825b8630de47 nginx:latest "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 0.0.0.0:80->80/tcp, [::]:80->80/tcp lnmp-web-1
d1d6339ba0d7 lnmp-php "docker-php-entrypoi…" 4 minutes ago Up 4 minutes 9000/tcp lnmp-php-1
109672c0b1f0 mysql:5.7 "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 3306/tcp, 33060/tcp lnmp-mysql-1
- 在/data/lnmp/nginx/conf.d/nginx.conf中写入nginx的配置文件
server {
listen 80;
root /usr/share/nginx/html;
location / {
index index.php index.html;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
- 准备探针测试一下
在/data/lnmp/nginx/html/info.php中准备php探针
<?php
phpinfo();
?>
测试数据库连接
在/data/lnmp/nginx/html/mysql.php中准备探针
<?php
$dbhost = "mysql";
$dbuser = "root";
$dbpass = "123456";
$db = "login";
$conn = mysqli_connect($dbhost, $dbuser, $dbpass, $db) or exit("数据库连接失败!");
echo "数据库连接成功";
?>
访问后会发现廉洁数据库会出现错误,那是因为php官方构建的php没有mysqli模块,所以我们需要定制带有mysqli模块的php,在项目根目录编写如下dockerfile
FROM php:7.4-fpm
ENV: TZ=Asia/Shanghai
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" \
&& sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list \
&& sed -i -e 's|security.debian.org/\? |security.debian.org/debian-security |g' \
-e 's|security.debian.org|mirrors.ustc.edu.cn|g' \
-e 's|deb.debian.org/debian-security|mirrors.ustc.edu.cn/debian-security|g' \
/etc/apt/sources.list \
&& apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
&& docker-php-ext-configure gd -with-freetype -with-jpeg \
&& docker-php-ext-install -j$(nproc) gd mysqli && docker-php-ext-enable mysqli
然后修改docker-compose.yml
# docker-compose build lnmp
services:
web:
image: nginx:latest
restart: always
ports:
- 80:80
volumes:
- /data/lnmp/nginx/conf.d:/etc/nginx/conf.d
- /data/lnmp/nginx/html:/usr/share/nginx/html
- /data/lnmp/nginx/log:/var/log/nginx
depends_on:
- php
- mysql
networks:
- lnmp-network
php:
# image: dockerfile:php:7.4-fpm
# 这里来让compose自动构建,指定dockerfile的文件位置即可
build:
context: .
dockerfile: dockerfile
restart: always
ports:
- "9000:9000"
volumes:
- /data/lnmp/nginx/html:/usr/share/nginx/html
networks:
- lnmp-network
depends_on:
- mysql
mysql:
image: mysql:5.7
restart: always
volumes:
- /data/lnmp/dbdata:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: "123456"
MYSQL_DATABASE: login
networks:
- lnmp-network
networks:
lnmp-network:
driver: bridge
volumes:
dbdata: null
然后再次运行测试
[root@localhost lnmp]# docker compose up -d
[root@localhost lnmp]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
825b8630de47 nginx:latest "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 0.0.0.0:80->80/tcp, [::]:80->80/tcp lnmp-web-1
d1d6339ba0d7 lnmp-php "docker-php-entrypoi…" 4 minutes ago Up 4 minutes 9000/tcp lnmp-php-1
109672c0b1f0 mysql:5.7 "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 3306/tcp, 33060/tcp lnmp-mysql-1