重点:
以下MySQL,PHP,Nginx三个容器创建时,格外注意:
1.创建顺序不可改变。mysql => php-fpm =>nginx
2.-v命令选项。即目录映射必须一致。
3.--link命令项。容器服务间的关联必须填写正确。
4.宿主机目录挂载到容器内,容器内被挂载的路径,如果有文件将被清空。故被挂载目录必须新建,或可读写。不可挂载到容器系统目录。
0.如果不用--link连接容器的话,请自定义一个网络。
docker network create cm_net
1.创建MySQL容器服务
docker pull mysql:5.7
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --name cm_mysql57 mysql:5.7
或自定义网络alias别名mysql, 在其他容器内部,可通过别名访问本容器。
docker run -d -p 3306:3306 --network cm_net --network-alias mysql -e MYSQL_ROOT_PASSWORD=root --name cm_mysql57 mysql:5.7
-e 设置环境变量,这里是设置mysql的root用户的初始密码,这个必须设置
-d 让容器在后台运行
-p 添加主机到容器的端口映射
2.创建PHP-FPM容器
docker pull php:7.2-fpm
docker run -d -v /mnt/www:/mnt/www -p 9000:9000 --link cm_mysql57:mysql --name cm_phpfpm72 php:7.2-fpm
或自定义网络alias别名phpfpm
docker run -d --network cm_net --network-alias phpfpm -v /mnt/www:/mnt/www -p 9000:9000 --name cm_phpfpm72 php:7.2-fpm
-v 添加目录映射,即主机上的/mnt/www/html和容器中/var/www/html目录是同步的
–name 容器的名字
–link 与另外一个容器建立起联系,这样我们就可以在当前容器中去使用另一个容器里的服务。
如果前面的mysql容器,定义alias网络别名:mysql,则不需要用-link参数。在php容器内,直接用mysql作为数据库地址。
进入PHP容器内部,在/mnt/www建立目录,发现与宿主机/mnt/www目录实现同步。
docker exec -it cm_phpfpm72 /bin/bash
touch /mnt/www/index.php
查看phpfpm容器中的默认PHP模块,如果没有pdo_mysql,我们需在容器内安装下。
php -m
docker-php-ext-install pdo_mysql
-t:在新容器内指定一个伪终端或终端。
-i:允许你对容器内的标准输入 (STDIN) 进行交互。
至此,PHP与MySQL容器的端口映射,目录挂载,已建立完毕。在PHP容器中,可访问MySQL容器服务。
$con = new PDO('mysql:host=mysql;dbname=your_database_name', 'root', 'root');
MySQL服务器地址不是localhost,也不是127.0.0.1,而是mysql
3.创建NGINX容器:
docker pull nginx
docker run -d -p 80:80 --name cm_nginx -v /mnt/www:/mnt/www -v ~/vhost:/etc/nginx/conf.d --link cm_phpfpm72:phpfpm nginx
如果前面PHP容器,使用的是alias网络别名phpfpm,则nginx容器启动可省略--link参数。直接用别名phpfpm访问PHP
docker run -d -p 80:80 --name cm_nginx -v /mnt/www:/mnt/www -v ~/vhost:/etc/nginx/conf.d nginx
-v /mnt/www:/mnt/www 宿主机到容器的网站目录映射
-v ~/vhost:/etc/nginx/conf.d 宿主机~/vhost目录挂载到Nginx容器的虚拟主机配置目录。
/etc/nginx/conf.d为Nginx容器的虚拟主机配置文件目录,虚拟主机配置文件名为:*.conf。
可选参数:--privileged=true
因为宿主机~/vhost目录已挂载到nginx容器/etc/nginx/conf.d目录
故修改虚拟主机*.conf文件如下。 例:
vim ~/vhost/demo.yousite.com.conf
让Nginx容器正确使用php-fpm容器服务,应如下配置:
......
location ~ \.php$ {
fastcgi_index index.php;
fastcgi_pass phpfpm:9000;
#fastcgi_pass的值改成之前--link进来的容器,当然也可以直接用php容器的ip
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#如果NGINX容器的网站根目录和php容器挂载的不一样,这里$document_root会找不到php文件。
#所以各容器的目录挂载一定要一致!
include fastcgi_params;
......
}
......
精简版的NGINX镜像:
docker pull registry.cn-beijing.aliyuncs.com/liyang85/nginx_alpine:v1
Docker基础与多版本PHP环境搭建:http://www.cnblogs.com/LO-gin/p/6958720.html
基于Docker搭建LNMP环境 https://blog.csdn.net/xy752068432/article/details/75975065