环境准备:
在一台主机上部署 lnmp, 基于多个容器:
nginx 服务: 172.16.10.10
MySQL 服务: 172.16.10.20
PHP 服务: 172.16.10.30
解决容器固定 ip 地址问题:
注意: 因为当容器停止时或者将容器删除, 再次运行相同的容器, 它的 ip 地址不再时原来的地址, 所以我们需要自定义一个网段, 来指定容器的 ip 地址.
项目操作:
(1) 首先自定义一个网络:
[root@sqm-docker01 ~]# docker network create -d bridge --subnet 172.16.10.0/24 --gateway 172.16.10.1 mynet1
(2) 下载 nginx,PHP:fpm,MySQL-5.7 镜像:
- [root@sqm-docker01 ~]# docker pull nginx
- [root@sqm-docker01 ~]# docker pull PHP:7.2-fpm <!-- 使用的是 php:7.2-fpm 的镜像 -->
- [root@sqm-docker01 ~]# docker pull MySQL:5.7 <!-- 使用的是 mysql:5.7 的镜像 -->
- (3)#### 运行一个基于 nginx 镜像的容器 #####
- # 先将 nginx 服务运行, 以拷贝出 nginx 的配置文件:
参数解释:
run : 创建一个新的容器
-d: 后台运行
--name: 自定义名称为 test1
在宿主机创建需要挂载文件的目录:
网站主目录:/wwwroot;
nginx 的配置文件:/docker;
- [root@sqm-docker01 ~]# mkdir /wwwroot
- [root@sqm-docker01 ~]# mkdir /docker
- ## 使用 docker cp 命令将 nginx 存放配置文件的目录拷贝到本机,
注意: docker cp 命令可以将宿主机上的文件拷贝到容器中, 也可以反向拷贝, 将容器中的文件或目录拷贝到本机
- [root@sqm-docker01 ~]# docker cp test1:/etc/nginx /docker/ #使用 docker cp 将 nginx 存放配置文件的目录拷贝到宿主机.
- [root@sqm-docker01 ~]# ls /docker/nginx/conf.d/
- default.conf
- # 注意: 需要修改的是 nginx conf.d 目录下的 default.conf 文件, 而不是 nginx.conf 文件.
拷贝 nginx 网页目录:
- [root@sqm-docker01 ~]# docker cp test1:/usr/share/nginx/html /wwwroot/
- [root@sqm-docker01 ~]# ls /wwwroot/HTML/
50x.HTML index.HTML
修改 nginx 默认的测试网页:
[root@sqm-docker01 HTML]# echo "<h1>hello welcome to nginx web</h1>"> index.HTML
(4) 运行 nginx 容器:
分别将容器中目录挂载到本地目录, 并且指定 ip 地址
[root@sqm-docker01 ~]# docker run -itd --name nginx --network my_net1 --ip 172.16.10.10 -p 80:80 -v /docker/nginx:/etc/nginx -v /wwwroot/HTML:/usr/share/nginx/HTML nginx:latest
参数解释:
run: 运行一个容器
-itd: i: 可交互
t: 伪终端
d: 保持容器后台运行
--network : 基于哪张网卡创建网络
--ip: 定义容器的 ip 地址
-v = --volume 数据卷, 进行一个挂载
挂载格式: 宿主机: 容器内
p: 映射端口, 宿主机端口: 容器内端口
(5) 运行 MySQL 容器:
[root@sqm-docker01 ~]# docker run --name MySQL -e MYSQL_ROOT_PASSWORD=123.com -d -p 3306:3306 --network my_net1 --ip 172.16.10.20 MySQL:5.7
-e 就是设置容器里的环境变量, 我们设置了 MySQL 的密码环境变量, 这个变量会传入容器里面来设置 MySQL 的密码
在本机测试 root 用户是否能够登录 MySQL:
首先需要下载 MySQL 客户端:
[root@sqm-docker01 ~]# yum -y install MySQL
(6) 运行 PHP 容器:
[root@sqm-docker01 ~]# docker run -itd -p 9000:9000 --name phpfpm -v /wwwroot/HTML:/usr/share/nginx/HTML --network my_net1 --ip 172.16.10.30 PHP:7.2-fpm
注意:
保证 nginx 和 PHP 共享一个存放网页的目录, PHP 创建和 nginx 相同的默认网页根目录 (-v 挂载时, 如果容器中没有该目录, 将会自动创建).
(7) 配置 nginx 和 PHP-fpm:
我们要对 PHP 解析 nginx 进行一个配置:
创建一个简单的测试网页:
接下来需要修改 nginx 配置文件:
[root@sqm-docker01 HTML]# VIM /docker/nginx/conf.d/default.conf
(8) 配置 MySQL:
搭建 phpMyadmin:
phpMyAdmin 是一个以 PHP 为基础, 以 Web-Base 方式架构在网站主机上的 MySQL 的数据库管理工具, 让管理者可用 Web 接口管理 MySQL 数据库. 借由此 Web 接口可以成为一个简易方式输入繁杂 SQL 语法的较佳途径, 尤其要处理大量数据的导入及导出更为方便. 其中一个更大的优势在于由于 phpMyAdmin 跟其他 PHP 程序一样在网页服务器上运行, 但是您可以在任何地方使用这些程序产生的 HTML 页面, 也就是于远程管理 MySQL 数据库, 方便的创建, 修改, 删除数据库及数据表.
- [root@sqm-docker01 HTML]# pwd
- /wwwroot/HTML
解压到当前目录:
[root@sqm-docker01 HTML]# unzip phpMyAdmin-4.9.1-all-languages.zip
重命名:
[root@sqm-docker01 HTML]# mv phpMyAdmin-4.9.1-all-languages phpmyadmin
修改 nginx 配置文件 -- 配置与 phpMyAdmin 连接:
[root@sqm-docker01 HTML]# VIM /docker/nginx/conf.d/default.conf
将原先的 location 配置项进行拷贝, 再添加以下两个 location 配置段.
修改完 nginx 配置文件, 重启 nginx:
访问测试网页:
已经将容器中的端口映射到了宿主机上, 所以直接访问宿主机地址: 172.16.1.30
访问 PHP 解析 nginx 网页:
接下来测试登陆 phpMyAdmin:
访问 url: http://172.16.1.30/phpmyadmin/index.php
缺少 mysqli 模块, 所以无法访问, 所以需要添加 PHP 支持 MySQL 配置模块:
怎样针对容器进行添加扩展模块, 我们可以登陆 dockerhub 进行查询相关文档:
链接路径: https://hub.docker.com/
复制以上 dockerfile 脚本, 到本地进行安装:
注意还需添加部分内容:
- [root@sqm-docker01 ~]# VIM Dockerfile
- FROM PHP:7.2-fpm
- RUN apt-get update && apt-get install -y \
- libfreetype6-dev \
- libjpeg62-turbo-dev \
- libpng-dev \
- && docker-PHP-ext-install -j$(nproc) iconv \
- && docker-PHP-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
- && docker-PHP-ext-install -j$(nproc) gd \
- && docker-PHP-ext-install mysqli pdo pdo_mysql
进行构建 dockerfile:
[root@sqm-docker01 ~]# docker build -t phpfpm-mysqli .
参数解释:
build: 进行构建
-t : 指定标签
. 表示当前目录下的 Dockerfile
构建完成后, 将原有的 PHP 镜像删除, 运行刚刚过构建成功的支持 mysqli 模块的镜像:
- [root@sqm-docker01 ~]# docker stop phpfpm
- phpfpm
- [root@sqm-docker01 ~]# docker rm phpfpm
- phpfpm
- [root@sqm-docker01 ~]# docker run --name phpfpm -d -p 9000:9000 -v /wwwroot/HTML:/usr/share/nginx/HTML --network my_net1 --ip 172.16.10.30 phpfpm-mysqli:latest
- # 镜像指定刚刚构建 dockerfile 生成的镜像名.
修改 phpMyAdmin 默认的 sample(样例文件):
想要配置文件将其使用, 必须进行重命名, 将 sample 去掉.
- [root@sqm-docker01 phpmyadmin]# pwd
- /wwwroot/HTML/phpmyadmin
- [root@sqm-docker01 phpmyadmin]# cp config.sample.inc.PHP config.inc.PHP
对配置文件进行修改:
[root@sqm-docker01 phpmyadmin]# VIM config.inc.PHP
修改完配置文件重启 PHP:
- [root@sqm-docker01 phpmyadmin]# docker restart phpfpm
- phpfpm
访问 phpMyAdmin 网页:
输入 url: http://172.16.1.30/phpmyadmin/index.php
# 用户名和密码, 是数据库的登陆密码
成功访问到 MySQL 数据库......
至此在 docker 中多容器之间部署 lnmp 搭建完成.
来源: http://blog.51cto.com/13972012/2445556