接下来做些准备工作,然后启动 PHP、Nginx 组件的容器
下载解压 WordPress
$ wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
$ tar zxf ./wordpress* -C /www/wwwroot/ && chmod 777 -R /www/wwwroot/
创建各组件互联用的网络
$ docker network create lnmp_network
关于 Docker 网络的内容即抽象又复杂,暂不多表,在这就理解成创建了一台虚拟交换机,后面要把各容器的“网线”连到这台交换机上。
在宿主中建立工作目录
$ tree /www
www
├── conf.d
│ ├── logstash
│ ├── nginx
│ └── php
├── run
├── data
├── log
│ ├── mysql
│ ├── nginx
│ └── php
└── wwwroot <----存放网站文件
运行 PHP 容器
通常来说,运行一个跑服务的容器会附带大量的参数,包括网络、存储、资源限制等等,后面启动 PHP 容器的时候会作大体的介绍。对于服务的配置文件来说,通常我们直接是在本地修改,而后重启服务。换到 Docker 中则需要反复进入容器中修改,这显然是个笨办法。稍灵活一些的作法是使用 --volume
参数把宿主目录映射到容器中,如此一来即可在宿主层面操作配置文件,完成后使用 docker restart
重启容器生效(等同于重启服务),本例 PHP 、Nginx 使用的都是这种方法。如果管理的容器数量很大,这个办法显然还是有问题的。更高明的做法是在镜像中加入启动脚本,配合环境变量灵活的赋予参数,后面的 MySQL 使用的即是这种方法。
1. 创建 php-fpm 配置文件
$ cat /www/conf.d/php/php-fpm.conf
[global]
pid = /www/run/php-fpm.pid
error_log = /www/log/php/php-fpm.log
daemonize = no
[www]
user = www-data
group = www-data
listen = 0.0.0.0:9000
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chdir = /
2. 启动容器
$ docker run --name lnmp_php --detach \
--net lnmp_network \
--volume /www:/www lnmp/php \
--fpm-config /www/conf.d/php/php-fpm.conf
参数说明:
-
--name
给容器指定名称,不指定也行,Docker 启动的时候会随机给它取名。这个名称同时还是该容器的主机名 -
--net
告诉容器要连接到哪个网络(虚拟交换机)上 -
--volume
该操作将:
前面的宿主目录挂载到后面容器里的目录,可以指定读写权限 -
--fpm-config
这个是 php-fpm 的启动参数,并非 docker,用以手动指定配置文件
运行 Nginx 容器
1. 创建 Nginx 配置文件
$ cat /www/conf.d/nginx/ngx.conf
user www-data;
worker_processes 1;
#此处建议是CPU核心的数量
pid /www/run/nginx.pid;
daemon off;
#关掉守护进程模式,改为手动启动 nginx。这是因为要保持 docker 容器的活跃状态,就得有运行中的进程。
events {
worker_connections 768;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
gzip on;
gzip_disable "msie6";
server {
listen 0.0.0.0:80;
server_name _;
root /www/wwwroot/;
index index.html index.htm;
access_log /www/log/nginx/access.log;
error_log /www/log/nginx/error.log;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
fastcgi_pass lnmp_php:9000;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
}
}
}
fastcgi_pass lnmp_php:9000;
一列中使用 PHP 的容器名指定其IP地址,前提是它们在同一个 --net
里,使用命令 docker network inspect lnmp_network
查看。
2. 启动 Nginx 容器
$ docker run --name lnmp_nginx --detach \
--net lnmp_network --publish 80:80 \
--volume /www:/www lnmp/nginx:1.4.6 \
-g "/www/conf.d/nginx/ngx.conf"
参数说明:
--publish 80:80
把容器的80端口映射到宿主的80端口上,使用命令 docker port lnmp_nginx
查看。