Docker 实践指南(6)

接下来做些准备工作,然后启动 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 查看。

你可能感兴趣的:(Docker 实践指南(6))