docker - 多容器搭建LAMP服务器环境
声明
1、docker是容器化技术
2、LAMP架构只的是 linux+apache+php+mysql 搭建的一套服务器环境,本文内容是基于linux环境搭建的docker容器,所以实际需要部署的apache容器+php容器+mysql容器
3、本文的docker容器的宿主机的基于vmware 搭建的一台 linux 虚拟主机,系统为centos7
概述
使用多容器技术搭建环境的好处
- 环境隔离,互不干扰。
- 搭建方便,节约资源。
比如,我要在我的主机上搭建两套网站,其中一套环境只支持php5.5,另外一套环境只支持php7.1。传统环境部署方案需要重新虚拟两台主机。每台主机上都需要部署apache+php+mysql。搭建复杂,资源浪费严重。
使用docker容器化技术,只需要创建一个php5.5的容器和一个php7.1的容器就可以解决。
docker多容器+LAMP的架构图
从图中可以看出php容器与mysql容器有数据交互,即在docker容器中表现为容器之间的互联(link)。apache与php容器之间有链接(link)。mysql与apache之间没有数据直接交互。所以在创建容器时的思路是,先创建mysql容器,再创建php容器,link上mysql容。最后在创建apache容器,link上php容器。
docker镜像下载
在docker中,容器时通过镜像创建的,所以在创建容器之前需要下载相应的镜像。镜像下载可以通过官方镜像仓库下载,也可以通过国内的一下镜像源下载,或者通过 https://hub.daocloud.io 这个网站进行下载。
方式一:官方镜像仓库下载
通过docker search搜索到相应的镜像资源
docker search mysql
再通过 docker pull 拉取镜像
docker pull mysql:5.6
方式二:配置国内镜像源
详见
https://blog.csdn.net/u012081441/article/details/104553145
方式三:通过 https://hub.daocloud.io 网站下载
搜索出镜像之后,点击版本,选择想要的版本,复制拉取命令。
将拉取命令粘贴到docker pull之后即可下载镜像
docker pull daocloud.io/library/mysql:5.7.5-m15
镜像下载完成之后,可以通过 docker image
进行查看下载的镜像
镜像下载完成之后,便可以创建容器
第一步:搭建mysql容器
创建mysql容器
docker run -di -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql5.7 daocloud.io/library/mysql:5.7.31
参数说明
- -di 表示运行一个守护式的容器
- -p 表示端口映射,mysql的默认端口是3306。前面的3306表示的宿主机的端口,后面的3306表示的容器的端口号。
- -e 设置mysql的登录用户与密码,MYSQL_ROOT_PASSWORD=123456 设置mysql的root用户的密码为123456
- – name 为创建的容器命名
容器创建号之后,可以使用 docker ps
查看正在运行的容器,使用docker ps -a
查看所有容器
配置mysql
开启远程访问权限
进入mysql容器 docker exec -it mysql5.7 /bin/bash
登录mysql 数据库 mysql -uroot -p123456
然后输入以下代码 ,注意分号
use mysql;
select host,user from user;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的root账户密码';
flush privileges;
测试mysql
方式一:登录mysql容器测试
进入mysql容器
docker exec -it mysql5.7 /bin/bash
登录mysql数据库
mysql -uroot -p123456
方式二:通过Navicat进行连接测试
第二步:搭建php容器
php容器是基于 php-5.5.28-fpm版本创建的镜像
docker run -di -v /var/www/html/:/var/www/html --link mysql5.7 -p 9000:9000 --name php5.5-mysql5.7 daocloud.io/library/php:5.5.28-fpm
参数说明:
- docker run : 创建容器的命令
- -di :让容器以守护式进程的方式运行
- -v : 文件目录映射,前面的是宿主机的目录,后面的是容器的目录。
- /var/www/html 用来部署网站的目录
- – link mysql5.7 : 关联刚刚创建的mysql5.7的容器
- -p 9000:9000 : 端口映射,php应用服务的默认端口是9000。前面的是宿主机的端口,后面的是php容器的端口。
- –name php5.5-mysql5.7 : 为创建的容器命名
配置php
安装mysql扩展
进入php容器中
docker exec -it php5.5-mysql5.7 /bin/bash
安装扩展pdo_mysql
docker-php-ext-install pdo_mysql
安装扩展mysql
docker-php-ext-install mysql
安装扩展mysqli
docker-php-ext-install mysqli
安装扩展pdo
docker-php-ext-install pdo
测试 php 服务器
(1)测试php容器是否搭建成功
在映射的目录/var/www/html 下面创建一个index.php文件。文件内容:
<?php
Phpinfo();
?>
然后进入到容器之中docker exec -it php5.5-mysql5.7 /bin/bash
,执行php -f index.php
,返回php的一些版本信息,表示创建成功。
(2)测试php容器与mysql容器是否联通
在映射的目录/var/www/html 下面创建一个testmysql.php文件。文件内容如下:
<?php
$servername = "mysql5.7";
$username = "root";
$password = "123456";
try {
$conn = new PDO("mysql:host=$servername;", $username, $password);
echo "sucess\n";
}
catch(PDOException $e)
{
echo $e->getMessage();
}
然后进入到容器之中docker exec -it php5.5-mysql5.7 /bin/bash
,执行php -f testmysql.php
,如果成功将返回 sucess,如果不成功,参照上面 配置php中的安装mysql扩展,安装扩展之后,在进行测试
第三步:搭建apache容器
apache服务的应用是httpd,默认端口是80。所以我们的apache服务时基于httpd-2.4.12 版本镜像创建的
docker run -di -v /var/www/html/:/usr/local/apache2/htdocs --link php5.5-mysql5.7 -p 80:80 --name httpd2.4-php5.5 daocloud.io/library/httpd:2.4.12
参数说明:
- /var/www/html/:/usr/local/apache2/htdocs :httpd容器的工作路径是 /usr/local/apache2/htdocs
配置httpd服务器
当httpd容器创建好之后,就可以使用浏览器访问网站
但我们发现,现在的浏览器并不能解析php代码,原因是httpd和php服务之间的一些配置还没配好
httpd和php之间的配置
httpd的配置文件为 /usr/local/apache2/conf/httpd.conf ,在容器之中不能使用vi命令,可以使用docker cp 8c0f7db1f140:/usr/local/apache2/conf/httpd.conf ./
将配置文件拷贝到宿主机上,修改完成之后,在使用docker cp httpd.conf 8c0f7db1f140:/usr/local/apache2/conf/
将文件拷贝回去替换。其中8c0f7db1f140为容器的ID
1、先在httpd.conf中找到下面代码,发现httpd默认只解析html代码。所以加上 index.php
修改前:
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
修改后:
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
2、在httpd.conf文件的最后面添加上下面代码
<VirtualHost *:80>
DocumentRoot "/usr/local/apache2/htdocs"
ServerName localhost
<Directory "/usr/local/apache2/htdocs">
Options None
Require all granted
</Directory>
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://172.17.0.3:9000/var/www/html/$1
</VirtualHost>
其中 fcgi://172.17.0.3:9000/var/www/html/$1
中的 ip为php容器在局域网中实际的ip,可以通过 docker network inspect bridge
进行查看,/var/www/html/ 为php服务的工作路径,$1为传递的参数,即浏览器中输入地址为 http://192.168.36.144/index.php。Ip之后要跟上工作的文件或路径。
3、 httpd.conf 文中,将下面是三个的前面的#号去掉
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
将httpd.conf复制回容器/usr/local/apache2/conf/中之后,重启httpd服务。然后在测试一下httpd与php直接的通信
测试httpd
测试httpd与php之间的通信
在浏览器中测试前面编写的 index.php脚本,返回php的信息
测试httpd与php与mysql之间的通信
运行之前写的php测试mysql连通性的脚本 testmysql.php,返回 sucess。
至此,多容器搭建lamp环境搭建完成,可以部署自己的测试网站玩玩。