LAMP 的网络连接, 有两个方法
第一: nginx 需要两个网卡, 一个面向客户端, 一个面向 fpm, 而 fpm 也要有两个网卡, 一个面向 nginx, 一个面向 mysql
第二, nginx 和 fpm,mariadb 都在同一 docker0 桥, 只需把 nginx 端口暴露就可以
准备三个镜像, 用于 nignx,fpm,mariadb.
mkdir -pv /root/lnmp/{nginx,fpm,mariadb}
使用绑定挂载的卷, 目的明确, 但是不能保证后期运行这些容器的宿主机上也有这些卷存在, 因此, 建议使用 docker 管理的卷, 后期启动容器, 不用考虑卷的问题, 但是 docker 管理的卷的路径需要通过命令查看才知道
准备 mariadb 数据库
可以现在其他主机上安装 mariadb-server, 安装后可以查看 / usr/lib/systemd/system/mariadb.service 这个文件, 看看启动要运行什么命令, 然后再编写 Dockerfile 进行镜像制作
cd /root/lnmp/mariadb
编写 dockerfile
- vim Dockerfile
- #for mairadb container
- FROM centos:7.3.1611
- MAINTAINER "sunny <sunny@ghbsunny.cn>"
- COPY start-db.sh /etc/init.d
- VOLUME "/var/lib/mysql"
- RUN yum -y install mariadb-server;\
- yum clean all;
- CMD ["/etc/init.d/start-db.sh"]
准备 / root/lnmp/start-db.sh, 作为 mysql 的启动脚本
- [root@docker mariadb]# vim /root/lnmp/mariadb/start-db.sh
- #!/bin/bash
- /usr/libexec/mariadb-prepare-db-dir
- /usr/bin/mysqld_safe --basedir=/usr
- chmode a+x /root/lnmp/mariadb/start-db.sh
制作镜像
docker build -t mariadb:v1 ./
把镜像运行为容器, 并查看是否有报错, 如果没有报错, 且 mariadb 运行于前台, 则 mariadb 准备完成
docker run --rm --name db1 mariadb:v1
准备 php-fpm 容器
- [root@docker ~]# cd /root/lnmp/fpm/
- vim Dockerfile
- #for php-fpm container
- FROM centos:7.3.1611
- MAINTAINER "sunny sunny@ghbsunny.cn"
RUN yum -y install php-fpm php-mbstring php-mysql;\
- yum clean all;\
- rm -rf /var/cache/yum;
- VOLUME "/webapp/wordpress"
- CMD ["/usr/sbin/php-fpm","--nodaemonize"]
创建镜像
[root@docker fpm]# docker build -t fpm:v1 ./
启动容器, 如果 fpm 运行于前台, 则启动成功
[root@docker fpm]# docker run --rm --name fpm fpm:v1
准备 nginx 镜像
注意, 这里的 VOLUME 要和 fpm 里的 VOLUME 保持一致即可, 实际上和 fpm 的 VOLUME 目前没有直接的联系, 是两个不同的 VOLUME, 但是为了方便区分, 把 VOLUME 命名为一样, 启动后, 可通过 --volume-from 选项来确保卷路径一致
[root@docker ~]# cd /root/lnmp/nginx/
需要把 nginx 的配置指向 fpm, 因此需要准备一个配置文件, nginx.conf, 启用 php 的配置段
- vim nginx.conf
- # 更改 http 配置段两个内容, 其他保持不变
- location / {
- root /webapp/wordpress;
- index index.php index.html index.htm;
- }
- location ~ \.php$ {
- root /webapp/wordpress;
- fastcgi_pass 127.0.0.1:9000;
- fastcgi_index index.php;
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- include fastcgi_params;
- }
由于 nginx 为编译安装, 且安装后路径为 / usr/local/nginx/conf/, 因此在 dockerfile 中, 要把这个更改后的 nginx.conf 复制到 / usr/local/nginx/conf 下面
- [root@docker nginx]# vim Dockerfile
- #For nginx container
- FROM centos:7.3.1611
- MAINTAINER "sunny <sunny@ghbsunny.cn>"
- ENV nginx_ver=1.14.0
- ENV nginx_url=http://nginx.org/download/nginx-${nginx_ver}.tar.gz
- VOLUME "/webapp/wordpress"
- WORKDIR "/usr/local/src"
- EXPOSE 80/tcp
- ADD ${nginx_url} /usr/local/src/
RUN tar xf nginx-${nginx_ver}.tar.gz && yum -y install gcc pcre-devel openssl-devel make \
- && cd nginx-${nginx_ver} && ./configure && make && make install
- COPY nginx.conf /usr/local/nginx/conf/
- CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
创建镜像
[root@docker nginx]# docker build -t nginx:v1 ./
运行容器, 使用 - P 暴露端口
[root@docker nginx]# docker run --rm -P --name nginx nginx:v1
到这里, 三个基本可用的容器已经准备好了.
首先启动 nginx 容器
[root@docker nginx]# docker run -it --rm -P --name nginx nginx:v1
启动 fpm 容器, 并把网络加入到 nginx 容器, 且卷直接复制 nginx 容器, 确保使用同一路径
[root@docker nginx]# docker run --name fpm -d --volumes-from nginx --net container:nginx fpm:v1
php 启动成功后, 在 nginx 容器对应的目录 / webapp/wordpress / 目录下准备一个文件 index.php 测试 php 反代是否成功
通过以下 inspect 命令查看卷 / webapp/wordpress 在本地的路径, 进入路径后编辑 index.php 测试页
- docker inspect -f {{.Mounts}} nginx
- [root@docker nginx]# cd /var/lib/docker/volumes/22363fc6ba24150932b445ec84414b83706146dfbc3668b573d4a461379eda0e/_data
- [root@docker _data]# vim index.php
- <?php
- phpinfo();
- ?>
保存退出后, 查看 nginx 暴露的端口
- [root@docker _data]# docker port nginx
- 80/tcp -> 0.0.0.0:32788
- [root@docker _data]#
在浏览器上输入 http://10.10.10.72:32788/ , 如果能够看到 php 的测试页信息, 则表示 nginx 能正确的把 php 请求调度到容器 fpm 里处理, 这里测试成功, 成功后可以把测试页 index.php 删掉, 后面这里会存放 WordPress 的文件
启动 mariadb 数据库
注意, 正常情况下, 在编辑 dockerfile 文件时, 最好是能把 mariadb 启动的初始化设置, 如果没有设置, 可以在启动 mariadb 容器后, 连接 mariadb 容器进行初始化, 主要是因为 mariadb 不做初始化, 默认账号 root 仅能本地连接, 这里不做演示, 而是将 mariadb 容器的网络加入到 fpm 里, 实现本地连接的场景
启动 mariadb 容器
[root@docker _data]# docker run --name db1 -d --net container:fpm mariadb:v2
到这里, nginx,php-fpm,mariadb 的容器都启动成功, 其容器网络使用加入式网络, 接下来把 wordpress 应用软件放到共享卷 / webapp/wordpress 下面
软件包: wordpress-4.7.4-zh_CN.tar.gz
解压软件包, 并把解压后的 wordpress 文件放到共享卷 / webapp/wordpress 下面, 然后通过浏览器访问进行相关初始化配置写入
- [root@docker ~]# tar xf wordpress-4.7.4-zh_CN.tar.gz
- [root@docker ~]# cd wor
- wordpress/ workshop/
- [root@docker ~]# cd wordpress/
- [root@docker wordpress]# ls
index.php wp-blog-header.php wp-includes wp-settings.php
license.txt wp-comments-post.php wp-links-opml.php wp-signup.php
readme.html wp-config-sample.php wp-load.php wp-trackback.php
wp-activate.php wp-content wp-login.php xmlrpc.php
wp-admin wp-cron.php wp-mail.php
- [root@docker wordpress]# mv */var/lib/docker/volumes/22363fc6ba24150932b445ec84414b83706146dfbc3668b573d4a461379eda0e/_data
- [root@docker wordpress]# cd /var/lib/docker/volumes/22363fc6ba24150932b445ec84414b83706146dfbc3668b573d4a461379eda0e/_data
- [root@docker _data]# ls
index.php wp-blog-header.php wp-includes wp-settings.php
license.txt wp-comments-post.php wp-links-opml.php wp-signup.php
readme.html wp-config-sample.php wp-load.php wp-trackback.php
wp-activate.php wp-content wp-login.php xmlrpc.php
wp-admin wp-cron.php wp-mail.php
注意, wordpress 安装需要指定一个数据库, 如果没有数据库, 可以在 db1 容器对应的卷下面创建一个 wordpress 目录, 作为后面要 wordpress 的数据库, 另外, 如果数据库没有初始化, 默认用户 root, 密码为空.
查找数据库的卷路径, 创建 wordpress 目录, 更改目录的所有者和所属组
- [root@docker _data]# docker inspect -f {{.Mounts}} db1
- [{volume ffed5c72badc05ded96f1f32467e7a51440fd26e45e945f8b9a0294afa13b1f8 /var/lib/docker/volumes/ffed5c72badc05ded96f1f32467e7a51440fd26e45e945f8b9a0294afa13b1f8/_data /var/lib/mysql local true }]
- [root@docker _data]# cd
- [root@docker ~]#
- [root@docker ~]# cd /var/lib/docker/volumes/ffed5c72badc05ded96f1f32467e7a51440fd26e45e945f8b9a0294afa13b1f8/_data
- [root@docker _data]# ls
aria_log.00000001 aria_log_control ibdata1 ib_logfile0 ib_logfile1 mysql mysql.sock performance_schema test
- [root@docker _data]# mkdir wordpress
- [root@docker _data]# chown -R 27:27 wordpress/
到这里完成后, 在浏览器输入 http://10.10.10.72:32788/ , 会自动跳转到初始化配置页, 根据页面提示, 将网页生成配置 wp-config.php 目录直接写入, 完成初始化, wordpress 基于 LNMP 架构的容器运行成功.
这个例子中, 后期要完善的有, mariadb 的初始化, 以及容器编排问题
来源: http://www.bubuko.com/infodetail-2716233.html