在使用docker-compose创建nginx,php,mysql三个容器时,虚拟要把容器内的数据挂载到宿主机,以便于持久化保存,首先创建目录结果如下:
docker-lnmp
├── docker-compose.yml
├── nginx
│ ├── conf # nginx相关配置
│ ├── log # nginx日志,访问日志、错误日志
│ └── ssl # ssl证书
├── html # web文件目录
├── mysql
│ ├── conf # mysql相关配置
│ ├── log # mysql日志
│ ├── init # 初始文件
│ └── data # mysql数据
├── php
│ ├── conf # php相关配置
│ └── Dockerfile # php镜像文件
目录 nginx/conf 下的文件为从 nginx容器中复制出来的配置文件;
目录 php/conf 下的文件为从 php 容器中复制出来的配置文件;
目录 mysql/conf 下的文件为从 mysql 容器中复制出来的配置文件;
在 php 目录中编写 php 的镜像文件 Dockerfile
FROM php:7.4-fpm
RUN apt-get update && apt-get install -y \
zlib1g-dev libzip-dev \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng-dev \
libmemcached-dev \
zlib1g-dev \
libcurl4-openssl-dev \
libxml2-dev \
--no-install-recommends && rm -rf /var/lib/apt/lists/* \
&& docker-php-ext-install -j$(nproc) \
gettext mysqli pdo_mysql zip \
bcmath opcache sockets soap \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd
CMD ["php-fpm", "-F"]
编写 docker-compose.yml文件如下:
version: "3"
services:
mysql:
hostname: mysql
restart: always
image: mysql:5.7
ports:
- "3306:3306"
volumes:
- ${PWD}/mysql/conf:/etc/mysql
- ${PWD}/mysql/log:/var/log/mysql
- ${PWD}/mysql/data:/var/lib/mysql
- ${PWD}/mysql/init:/var/lib//docker-entrypoint-initdb.d/ #初始化文件
environment:
MYSQL_ROOT_PASSWORD: root # roor用户名密码
MYSQL_USER: user
MYSQL_PASSWORD: user123456
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
php:
hostname: php
restart: always
build:
context: ${PWD}/php
dockerfile: Dockerfile
ports:
- "9000:9000"
volumes:
- ${PWD}/html:/var/www/html
- ${PWD}/php/conf:/usr/local/etc
nginx:
hostname: nginx
restart: always
image: nginx:1.19.2-alpine
depends_on: #依赖关系,需要先运行php
- "php"
ports:
- "80:80"
- "443:443"
volumes:
- ${PWD}/nginx/conf:/etc/nginx/conf.d
- ${PWD}/nginx/ssl:/etc/nginx/ssl
- ${PWD}/nginx/log:/var/log/nginx
- ${PWD}/html:/usr/share/nginx/html
composer:
image: composer:2.0
container_name: composer
restart: "no"
volumes:
然后执行如下命令启动容器:
$ docker-compose up -d
Creating docker-lnmp_mysql_1 ... done
Creating docker-lnmp_php_1 ... done
Creating composer ... done
Creating docker-lnmp_nginx_1 ... done
然后测试是否容器启动成功:
$ docker ps
a7c797cb350d nginx:1.9.1 "/docker-entrypoint.…" 40 seconds ago Up 38 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp docker-lnmp_nginx_1
fcabcbdd2fbd php:7.4-fpm "docker-php-entrypoi…" 42 seconds ago Up 40 seconds 0.0.0.0:9000->9000/tcp docker-lnmp_php_1
66857b56b61a mysql:5.7 "docker-entrypoint.s…" 42 seconds ago Up 40 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp docker-lnmp_mysql_1
当出现如上内容,表示容器启动成功,可以使用 curl 127.0.0.1 命令测试容器是否可以正常连接。
在 html 目录下新建文件 p.php 内容如下:
<?php
phpinfo();
然后在浏览器输入 ip/p.php 查看php是否可正常加载。
上述过程完成以后,将会安装好 php7.4、nginx1.9.1、mysql 5.7、composer 2.0。
以安装 Laravel 为例说明 composer 使用方法:
$ cd html #首先进入 html 目录
$ # -it 以交互方式执行
$ # -v 将当前目录挂载到 composer 容器中
$ docker run -it -v $PWD:/app composer:2.0 composer create-project --prefer-dist laravel/laravel:~6 blog -vvv
上面命令执行完以后,会在目录 $PWD/blog 创建 Laravel 项目,可以通过 ip/blog/public 在浏览器中正常访问。也可以修改 $PWD/nginx/conf/default.conf 配置文件或在 $PWD/nginx/conf 目录中添加 nginx 配置文件,让域名指向 laravel 根目录,以便可以直接通过域名访问 laravel 项目。
注:在上述安装过程中,开始使用的是虚拟机,改成国内镜像中还是特别慢,一直安装失败。当换成阿里云服务器后,很快就可以安装完成,所以如果有遇到安装失败的情况,可以换成云服务器试试。
详见 Github
参考资料: