Docker搭建可一键部署的多域名LNMP环境


本文介绍在Docker容器中,快速部署LNMP环境的完整步骤。
最终完成的环境我们暂且叫:DNMP(即 Docker + Nginx + MySQL + PHP)。

最终实现一键部署LNMP环境的目的,特点:

  1. 完全开源
  2. 支持多版本PHP切换(PHP5.4、PHP5.6、PHP7.2...)
  3. 支持绑定任意多个域名
  4. 支持HTTPS和HTTP/2
  5. PHP源代码位于host
  6. MySQL data位于host
  7. 所有配置文件可在host中直接修改
  8. 所有日志文件可在host中直接查看
  9. 内置完整PHP扩展安装命令
  10. 本站实际使用,确保100%可行
  11. 实现一次配置,可在任何支持Docker系统使用

github仓库地址https://github.com/yeszao/dnmp

1 快速使用

1、安装gitdockerdocker-compose

2、使用git下载完整代码:

$ git clone https://github.com/yeszao/dnmp.git

3、用docker-compose命令启动容器,首次使用需要下载镜像,会稍慢:

$ docker-compose up

4、然后在浏览器中访问localhost,就可以看到如下页面:

5、源代码在:./www/site1/ 目录下。

2 安装docker和docker-compose

具体安装步骤:

注意:Docker安装要求Linux 3.10以上版本,用uname -a命令可查看到。

安装之后,可查看版本:

$ docker -v
$ docker-compose -v

然后把当前用户加到docker用户组里面:

$ sudo gpasswd -a ${USER} docker

就不用每次启动Docker都得加sudo了。

注意,执行gpasswd命令之后要重新登陆才有效。

3 使用国内镜像仓库

在没有梯子的情况下,Docker默认从Docker Hub仓库下载镜像,完整的LNMP镜像估计需要一两天时间。

所以只能换个途径,比如使用阿里云的加速仓库。

首先注册一个阿里云账号,然后访问阿里云的Docker镜像仓库,能找到加速器地址。

对于Docker 1.10+,打开配置文件 /etc/docker/daemon.json(没有时新建该文件):

{
    "registry-mirrors": ["https://6evg8u3r.mirror.aliyuncs.com"]
}

以上是我的加速地址。

然后重启Docker Daemon:

sudo systemctl daemon-reload
sudo systemctl restart docker

就可以了。

Docker 1.10以下请看:https://yq.aliyun.com/articles/29941

4 目录说明

大致框架如下:

(图片使用UMLet绘制,下载原文件

4.1 目录结构

目录结构如下:

.
├── docker-compose.yml          容器启动配置文件
├── Dockerfile                  PHP-FPM构建配置文件
├── conf                        配置目录
│   ├── mysql                   MySQL配置文件目录
│   │   └── my.cnf              MySQL配置文件
│   ├── nginx                   Nginx配置文件目录
│   │   ├── conf.d              站点配置文件目录
│   │   │   ├── certs           SSL认证文件、密钥和加密文件目录
│   │   │   │   └── site2       站点2的认证文件目录
│   │   │   ├── site1.conf      站点1 Nginx配置文件
│   │   │   └── site2.conf      站点2 Nginx配置文件
│   │   └── nginx.conf          Nginx通用配置文件
│   └── php                     PHP配置目录
│       ├── php-fpm.d           PHP-FPM配置目录
│       │   └── www.conf        PHP-FPM配置文件
│       └── php.ini             PHP配置文件
├── log                         日志目录
│   ├── mysql                   MySQL日志目录
│   ├── nginx                   Nginx日志目录
│   └── php-fpm                 PHP-FPM日志目录
├── mysql                       MySQL数据文件目录
└── www                         站点根目录
    ├── site1                   站点1根目录
    └── site2                   站点2根目录

4.2 站点部署

本文有默认加了两个站点:www.site1.com(同localhost)和www.site2.com

要在本地访问这两个域名,需要修改你的hosts文件,添加以下两行:

127.0.0.1 www.site1.com
127.0.0.1 www.site2.com

其中,www.site2.com支持SSL/https和HTTP/2的示例站点

因为站点2的SSL采用自签名方式,所以浏览器有安全提示,继续访问就可以了,自己的站点用第三方SSL认证证书替换即可。

如果只用到站点1,把站点2相关的目录和配置文件删除:

./conf/nginx/conf.d/certs/site2/
./conf/nginx/conf.d/site2.conf
./www/site2/

重启容器内的Nginx生效:

docker exec -it dlnmp_nginx_1 nginx -s reload

4.3 HTTPS使用

在容器中我们也是可以用HTTPS的,具体的配置请参考如下文件:

./conf/nginx/conf.d/site2.conf

如果是自签名,可以用廖雪峰提供的一个自动生成认证文件、私钥脚本:gencert.sh

这个脚本已经放在项目中,在这个目录下:

./conf/nginx/conf.d/certs/site2/

在Bash中输入:

$ ./gencert.sh

输入一次域名,和几次密码(内容随意)后,就会生成几个认证文件。

其中自签名情况不需要.csr.origin.key后缀的文件。

然后修改Nginx配置文件,配置SSL支持就可以了。

5 docker-compose.yml文件

如下是docker容器的运行配置docker-compose.yml的内容:

nginx:
  image: nginx:alpine
  ports:
    - "80:80"
    - "443:443"
  volumes:
    - ./www/:/var/www/html/:rw
    - ./conf/nginx/conf.d:/etc/nginx/conf.d/:ro
    - ./conf/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
    - ./log/nginx/:/var/log/nginx/:rw
  links:
    - php-fpm:fpm

php-fpm:
  build: .
  expose:
    - "9000"
  volumes:
    - ./www/:/var/www/html/:rw
    - ./conf/php/php.ini:/usr/local/etc/php/php.ini:ro
    - ./conf/php/php-fpm.d/www.conf:/usr/local/etc/php-fpm.d/www.conf:rw
    - ./log/php-fpm/:/var/log/php-fpm/:rw
  links:
    - mysql:mysql
    - redis:redis

mysql:
  image: mysql:latest
  ports:
    - "3306:3306"
  volumes:
    - ./conf/mysql/my.cnf:/etc/mysql/my.cnf:ro
    - ./mysql/:/var/lib/mysql/:rw
    - ./log/mysql/:/var/log/mysql/:rw
  environment:
    MYSQL_ROOT_PASSWORD: "123456"

redis:
  image: redis:latest
  ports:
    - "6379:6379"

这里我们用了nginx的alpine镜像,以及php-fpm和MySQL的最新镜像。

这里默认加了redis容器,不需要的话可以把文件的最后4以及php-fpm块下的- redis:redis删除。

5.1 为什么用nginx:alpine?

因为相比nginx:latestnginx:alpine有几点优势:

  1. 用的是最新版nginx镜像,功能与nginx:latest一模一样
  2. alpine镜像用的是Alpine Linux内核,比ubuntu内核要小很多。
  3. nginx:alpine默认支持http2。

Alpine的更多请看《Alpine Linux,一个只有5M的Docker镜像》。

如要进入alpine容器,命令是(后面的路径不是/bin/bash):

$ docker exec -it dnmp_nginx_1 /bin/sh

5.2 站点根目录挂载

为什么站点根目录在Nginx和PHP-FPM都这样挂载?

./www/:/var/www/html/

我们知道,Nginx配置都有这样一项:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

其中,$document_root就是server块下root所指的路径:

server {
    #...
    root /var/www/html;
    #...
}

这里$document_root就是/var/www/html

如果Nginx和PHP-FPM在同一主机,Nginx会通过9000端口把这个目录值脚本URI传给PHP-FPM。

PHP-FPM再通过9000端口接收Nginx发过来的目录值和脚本URI,发给PHP解析。

PHP收到后,就到指定的目录下查找PHP文件并解析,完成后再通过9000端口返回给Nginx。

如果Nginx和PHP-FPM在同一个主机里面,PHP就总能找到Nginx指定的目录。

但是,如果他们在不同的容器呢?

未做任何处理的情况,Nginx容器中的站点根目录,PHP-FPM容器肯定不存在。

所以,这里需要保证Nginx和PHP-FPM都挂载了Host的./www/,并且都挂载在容器的:/var/www/html

(当然,你也可以指定别的目录,确保统一即可)

5.3 修改docker-compose.yml文件之后?

如果容器已经生成,回头再编辑docker-compose.yml,用

docker-compose up

命令会直接启动原来的容器,修改的内容不会体现在启动的容器里

所以,要使修改的docker-compose.yml生效,需要以下4步:

$ docker stop dnmp_nginx_1                      # 第一步:停止容器
$ docker rm dnmp_nginx_1                        # 第二步:删除容器
# !!第三步:重启Docker服务!!
$ docker-compose up -d --no-deps --build mysql  # 第四步:重新启动容器

其中最后一条命令参数作用:

  • -d:后台执行
  • --no-deps:不启动link的容器
  • --build:启动容器前先构建镜像

6 Dockerfile文件

因为PHP-FPM构建稍微复杂,涉及到很多扩展。

所以单独用Dockerfile文件构建PHP-FPM:

FROM php:fpm

## Copy sources.list to container.
## Here we use 163.com sources list.
##     PHP 5.6.31+ should use jessie sources list
##     PHP 7.2.0+ should use stretch sources list
## For more please check:
## PHP official docker repository: https://hub.docker.com/r/library/php/
#COPY ./files/sources.list.stretch /etc/apt/sources.list
#COPY ./files/sources.list.jessie /etc/apt/sources.list

## Update Ubuntu
RUN apt-get update

## mcrypt
RUN apt-get install -y libmcrypt-dev
RUN docker-php-ext-install mcrypt

## GD
RUN apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng12-dev
RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/
RUN docker-php-ext-install -j$(nproc) gd

## Intl
RUN apt-get install -y libicu-dev
RUN docker-php-ext-install -j$(nproc) intl

## General
RUN docker-php-ext-install zip
RUN docker-php-ext-install pcntl
RUN docker-php-ext-install opcache
RUN docker-php-ext-install pdo_mysql
RUN docker-php-ext-install mysqli
RUN docker-php-ext-install mbstring

## ...

完整Dockerfile请移步本项目GitHub仓库

7 nginx配置文件

这里,我们还需要稍微修改nginx配置文件:

location ~ \.php$ {
    fastcgi_pass   fpm:9000;
    fastcgi_index  index.php;
    include        fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
}

这里,我们仅需把fastcgi_pass改成:fpm:9000

也就是,PHP-FPM的侦听主机改成:Nginx links PHP-FPM容器的别名,在docker-compose.yml文件里面我们设置为fpm

这样Nginx容器启动的时候,就会自动修改自己的/etc/hosts,让fpm指向php-fpm容器的IP。

修改之后,重启容器中的nginx:

$ docker exec dlnmp_nginx_1 nginx -s reload

其中,dlnmp_nginx_1是容器的名称,也可以指定容器的ID。

8 站点根目录写权限

有时候,我们的PHP代码需要某个目录的写权限。

比如,Wordpress的wp-content/uploads目录,只有写权限我们才能正常上传文件。

默认的,容器中的/var/www/html目录属于root,我们需要修改为www-data,PHP才能正常写目录。

先进入到容器中:

$ docker exec -it dlnmp_php-fpm_1 /bin/bash

然后修改目录权限:

$ chown -R www-data:www-data /var/www/html

这样PHP就能正常读写目录了。

9 数据库

9.1 使用MySQL

在docker-compose.yml文件中,我们指定了MySQL数据库root用户的密码为123456

所以,我们就可以在主机中通过:

$ mysql -h 127.0.0.1 -u root -p

输入密码,就可以进入MySQL命令行。

说明:这里MySQL的连接主机不能用localhost,因为MySQL客户端默认使用unix socket方式连接,应该直接用本地IP。

在PHP代码中的使用方式与在主机中使用稍有不同,如下:

$pdo = new PDO('mysql:host=mysql;dbname=site1', 'root', '123456');

其中,host的值就是在docker-compose.yml里面指定的MySQL容器的名称。

这是因为PHP代码是在FPM容器中,FPM容器启动时会自动在/etc/hosts中加上:

172.17.0.2 mysql 11e55f91c4c3 dlnmp_mysql_1

就是说,mysql自动指向了MySQL容器动态生成的IP。

9.2 使用Redis

Redis使用和MySQL类似。

在主机和容器内部都通过地址127.0.0.1,端口6379访问。

PHP则是跨容器访问,host参数用redislinks指定的名称),端口用6379

 

Docker相关的有用文章:

  1. Docker 常用命令
  2. docker-compose中ports和expose的区别
  3. 手动用Docker一步步部署LNMP完整教程
  4. Docker容器使用十大注意事项

 

33条评论

nirnava says: 回复

如何才能使用phpmyadmin访问mysql数据库呢? 希望大神解答。。

歪麦 says: 回复

安装个Navicat吧,这个管理更方便。

Kerwin says: 回复

docker pull phpmyadmin/phpmyadmin

docker run --name myadmin -d --link dnmp_mysql_1:db -p 8080:80 phpmyadmin/phpmyadmin

phpmyadmin入口: http://domain.com:8080

Lii says: 回复

博主试过用docker搭建Apache和Nginx共存的开发环境吗。 因为我手头项目都是Apache,但是自己的项目想用Nginx。

歪麦 says: 回复

Apache应该也是差不多的,把Nginx容器的构建改成Apache,设置对应的conf配置就可以了

霍霍人 says: 回复

centos7不行呀

歪麦 says: 回复

有什么提示么?

123 says: 回复

W: Failed to fetch http://mirrors.163.com/debian-security/dists/jessie/updates/main/binary-amd64/Packages Hash Sum mismatch

E: Some index files failed to download. They have been ignored, or old ones used instead.

apt-get源还是有错误呢?

歪麦 says: 回复

那修改source.list.jesse,换一个源试试
不同网路的源不一定都是可用的

霍霍人 says: 回复

都试过了。。。。。

霍霍人 says: 回复

中科大的源可以

ocean says: 回复

你好,我已经sudo -s了,但好像有问题

Starting dnmp_nginx_1 ... done
Attaching to dnmp_redis_1, dnmp_mysql_1, dnmp_php-fpm_1, dnmp_nginx_1
mysql_1 | chown: changing ownership of '/var/lib/mysql/.gitignore': Operation not permitted
mysql_1 | chown: changing ownership of '/var/lib/mysql/': Operation not permitted
nginx_1 | nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
nginx_1 | 2017/11/21 15:50:19 [emerg] 1#1: open() "/var/log/nginx/error.log" failed (13: Permission denied)
redis_1 | 1:C 21 Nov 15:45:27.963 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1 | 1:C 21 Nov 15:45:27.963 # Redis version=4.0.2, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1 | 1:C 21 Nov 15:45:27.963 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1 | 1:M 21 Nov 15:45:27.966 * Running mode=standalone, port=6379.
redis_1 | 1:M 21 Nov 15:45:27.967 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1 | 1:M 21 Nov 15:45:27.967 # Server initialized
redis_1 | 1:M 21 Nov 15:45:27.968 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
redis_1 | 1:M 21 Nov 15:45:27.968 * Ready to accept connections
php-fpm_1 | [21-Nov-2017 15:45:28] NOTICE: fpm is running, pid 1
php-fpm_1 | [21-Nov-2017 15:45:28] NOTICE: ready to handle connections
dnmp_mysql_1 exited with code 1
dnmp_nginx_1 exited with code 1

歪麦 says: 回复

这里提示是权限问题,把当前用户添加到docker组再试

ocean says: 回复

嗯嗯,晚上回家再试试,感谢

ocean says: 回复

你好,bash: gpasswd: command not found,方便加下QQ吗?462091385

歪麦 says: 回复

什么系统,怎么操作的?

Yfu says: 回复

你好,我docker-compose up的时候会有红字报:
debconf: delaying package configuration, since apt-utils is not installed,
然后最后报:
Recreating 1741073fe75c_1741073fe75c_1741073fe75c_1741073fe75c_dnmp_php-fpm_1 ... error

ERROR: for 1741073fe75c_1741073fe75c_1741073fe75c_1741073fe75c_dnmp_php-fpm_1 No such image: sha256:d4e6db5b65a483588679aa3d53464616fcdd0a67960c7ef86c0f96f407538e65

ERROR: for php-fpm No such image: sha256:d4e6db5b65a483588679aa3d53464616fcdd0a67960c7ef86c0f96f407538e65
ERROR: Encountered errors while bringing up the project.

但是apt-utils如何安装呢?

歪麦 says: 回复

apt-utils包含了Ubuntu 16.04 LTS 的发布后的一些新命令,比如apt(Advanced Package Tool),它可以取代 apt-get、apt-cache 等功能。
这里我们用apt-get,可以忽略这个提示,不会影响。

第二个问题,
提示Recreating 1741073fe75c_1741073fe75c_1741073fe75c_1741073fe75c_dnmp_php-fpm_1 ... error,说明之前有build失败过,
用docker images命令可以看到构建失败的镜像,再docker rmi删除掉,重新up

Henry says: 回复

你好,我docker-compose up的时候会有红字报:

error: /usr/src/php/ext/mcrypt does not exist

usage: /usr/local/bin/docker-php-ext-install [-jN] ext-name [ext-name ...]
ie: /usr/local/bin/docker-php-ext-install gd mysqli
/usr/local/bin/docker-php-ext-install pdo pdo_mysql
/usr/local/bin/docker-php-ext-install -j5 gd mbstring mysqli pdo pdo_mysql shmop

if custom ./configure arguments are necessary, see docker-php-ext-configure

Possible values for ext-name:
bcmath bz2 calendar ctype curl dba dom enchant exif fileinfo filter ftp gd gettext gmp hash iconv imap interbase intl json ldap mbstring mysqli oci8 odbc opcache pcntl pdo pdo_dblib pdo_firebird pdo_mysql pdo_oci pdo_odbc pdo_pgsql pdo_sqlite pgsql phar posix pspell readline recode reflection session shmop simplexml snmp soap sockets sodium spl standard sysvmsg sysvsem sysvshm tidy tokenizer wddx xml xmlreader xmlrpc xmlwriter xsl zend_test zip

Some of the above modules are already compiled into PHP; please check
the output of "php -i" to see which modules are already loaded.
ERROR: Service 'php-fpm' failed to build: The command '/bin/sh -c docker-php-ext-install mcrypt' returned a non-zero code: 1

歪麦 says: 回复

2017-11-30发布的PHP7.2.0已经移除了mcrypt了:http://php.net/manual/en/intro.mcrypt.php
如果Dockerfile里面是FROM php:fpm,默认就是PHP7.2.0,要把这两行删掉:

RUN apt-get install -y libmcrypt-dev
RUN docker-php-ext-install mcrypt

就可以了。
建议加密的地方用openssl或Sodium (PHP 7.2.0开始用)扩展代替。

dbquan says: 回复

```
[root@dbquan01 dnmp]# docker-compose up
Building php-fpm
Step 1 : FROM php:fpm
---> e63a6cd92abc
Step 2 : COPY ./files/sources.list.jessie /etc/apt/sources.list
...
ERROR: Service 'php-fpm' failed to build: The command '/bin/sh -c docker-php-ext-install mcrypt' returned a non-zero code: 1
```
请问安装报错如何解决? “error: /usr/src/php/ext/mcrypt does not exist”

歪麦 says: 回复

请看给楼上 @Henry 的回复。

歪麦 says: 回复

对了,PHP7.2.0的docker image是基于Debian stretch版本的,所以需要source.list用stretch源。
以后的版本再做个兼容。

ec says: 回复

我的保存,请问怎么解决,mac上面运行的,可以加下我qq 1046373779 吗,交流下,谢谢

---> Running in 9f91a58a09cf

Notice: Undefined variable: proxy_host in PEAR/Proxy.php on line 163

Notice: Undefined variable: proxy_port in PEAR/Proxy.php on line 163
No releases available for package "pecl.php.net/redis"
install failed
ERROR: Service 'php72' failed to build: The command '/bin/sh -c pecl install redis-3.1.4 && docker-php-ext-enable redis && : && pecl install xdebug-2.6.0alpha1 && docker-php-ext-enable xdebug && : && apt-get install -y libmagickwand-dev && pecl install imagick-3.4.3 && docker-php-ext-enable imagick && : && apt-get install -y libmemcached-dev zlib1g-dev && pecl install memcached-3.0.4 && docker-php-ext-enable memcached' returned a non-zero code: 1
yuxiMBP:dnmp zyx$

歪麦 says: 回复

因为pecl方式安装默认会用https方式,但是pecl.php.net的https通道已经被屏蔽了,所以必须走代理或者用源码方式安装,方法:https://github.com/yeszao/dnmp/issues/10

ec says: 回复

这个错误呢?怎么解决

etting up libhashkit-dev (1.0.18-4.1) ...
Setting up libmemcached-dev (1.0.18-4.1) ...
Processing triggers for libc-bin (2.24-11+deb9u1) ...

Warning: stream_socket_enable_crypto(): SSL: Success in PEAR/Proxy.php on line 101

Warning: stream_socket_enable_crypto(): SSL: Success in /usr/local/lib/php/PEAR/Proxy.php on line 101

Notice: Undefined variable: proxy_host in PEAR/Proxy.php on line 103

Notice: Undefined variable: proxy_port in PEAR/Proxy.php on line 103
No releases available for package "pecl.php.net/memcached"
install failed
ERROR: Service 'php72' failed to build: The command '/bin/sh -c pecl install redis-3.1.4 && docker-php-ext-enable redis && : && pecl install xdebug-2.6.0alpha1 && docker-php-ext-enable xdebug && : && apt-get install -y libmagickwand-dev && pecl install imagick-3.4.3 && docker-php-ext-enable imagick && : && apt-get install -y libmemcached-dev zlib1g-dev && pecl install memcached-3.0.4 && docker-php-ext-enable memcached' returned a non-zero code: 1
yuxiMBP:dnmp zyx$

dnmp says: 回复

Notice: Undefined variable: proxy_port in PEAR/Proxy.php on line 163
No releases available for package "pecl.php.net/redis"
install failed
我看到dockerfile里面写了下面的
## pecl files
## Note: if get error
## `No releases available for package "pecl.php.net/xxx"`
## or
## `Package "xxx" does not have REST xml available`
## Please turn on proxy (the proxy IP may be docker host IP or others).
但是proxy怎么打开呢?

歪麦 says: 回复

这个proxy就是要走代理哦,没有的话就用源码方式安装,方法:https://github.com/yeszao/dnmp/issues/10

Nick says: 回复

dockerfile里面设置了也没有用

godaddy says: 回复

朋友 交换链接吗

dsf says: 回复

Step 3 : RUN apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ && docker-php-ext-install gd && : && apt-get install -y libicu-dev && docker-php-ext-install intl && : && apt-get install -y libxml2-dev && apt-get install -y libxslt-dev && docker-php-ext-install soap && docker-php-ext-install xsl && docker-php-ext-install xmlrpc && docker-php-ext-install wddx && : && apt-get install -y libbz2-dev && docker-php-ext-install bz2 && : && docker-php-ext-install zip && docker-php-ext-install pcntl && docker-php-ext-install pdo_mysql && docker-php-ext-install mysqli && docker-php-ext-install mbstring && docker-php-ext-install exif && docker-php-ext-install bcmath && docker-php-ext-install calendar && docker-php-ext-install sockets && docker-php-ext-install gettext && docker-php-ext-install shmop && docker-php-ext-install sysvmsg && docker-php-ext-install sysvsem && docker-php-ext-install sysvshm && docker-php-ext-install opcache
---> [Warning] IPv4 forwarding is disabled. Networking will not work.
---> Running in b4dc7af9e896

zz的代码世界 says: 回复

nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./www/:/var/www/html/:rw
- ./conf/nginx/conf.d:/etc/nginx/conf.d/:ro
- ./conf/nginx/nginx.conf:/etc/nginx/nginx.conf.d:ro
- ./log/nginx/:/var/log/nginx/:rw
links:
- php72:fpm

php72:
build: ./php/php72/
expose:
- "9000"
volumes:
- ./www/:/var/www/html/:rw
- ./conf/php/php.ini:/usr/local/etc/php/php.ini:ro
- ./conf/php/php-fpm.d/www.conf:/usr/local/etc/php-fpm.d/www.conf.d:rw
- ./log/php-fpm/:/var/log/php-fpm/:rw
links:
- mysql:mysql
- redis:redis

mysql:
image: mysql:latest
ports:
- "3306:3306"
volumes:
- ./conf/mysql/my.cnf:/etc/mysql/my.cnf.d:ro
- ./mysql/:/var/lib/mysql/:rw
- ./log/mysql/:/var/log/mysql/:rw
environment:
MYSQL_ROOT_PASSWORD: "123456"

redis:
image: redis:latest
ports:
- "6379:6379"

说明:原yml文件的.cnf执行的话会报错not a directory。然后我统一改成了.cnf.d就可以了,这样修改可以么???

发表评论

电子邮件地址不会被公开。 必填项已用*标注

昵称 *