环境要求:安装了docker的主机 (本文示例环境为centos7.4)php
首先把全部须要用到的镜像拉取下来html
# nginx $ docker pull nginx # php & php-fpm $ docker pull php:7.1.0-fpm # redis $ docker pull redis
Docker Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,能够一条命令启动多个容器。nginx
直接从github下载便可,前提要先安装Docker,版本要1.9.1以上git
$ curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose $ chmod +x /usr/local/bin/docker-compose
安装后确认:github
$ docker-compose --version
在 /docker/nginx 目录下建立 docker-compose.ymlweb
version: '2' services: web1: image: nginx links: - web2 - web3 - web4 ports: - "8080:8080" volumes: - "/docker/nginx/web1/conf.d:/etc/nginx/conf.d" web2: image: nginx volumes: - "/docker/slb/www2:/www" - "/docker/nginx/web2/conf.d:/etc/nginx/conf.d" web3: image: nginx volumes: - "/docker/slb/www3:/www" - "/docker/nginx/web3/conf.d:/etc/nginx/conf.d" web4: image: nginx volumes: - "/docker/slb/www4:/www" - "/docker/nginx/web4/conf.d:/etc/nginx/conf.d"
启动容器redis
# up:建立并启动 -d:后台运行 $ docker-compose up -d # 查看容器 $ docker-compose ps
添加upstream节点,默认使用轮询方式进行负载
编辑并保存 /docker/nginx/web1/conf.d/slb.confdocker
upstream slb { server web2; server web3; server web4; } server { listen 8080; server_name 127.0.0.1; gzip on; location /{ root /www; index index.html index.php; # 反向代理的主机头 proxy_pass http://slb; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
编辑并保存 /docker/nginx/web2/conf.d/demo.conf (其他的web3与web4同理)centos
server { listen 80; server_name localhost; gzip on; location / { root /www; index index.html index.htm; autoindex off; } }
为了肯定Nginx集群是否搭建成功,分别在 web2 web3 web4 的主目录放置不一样的html文档
编辑并保存 /docker/nginx/slb/web2/index.html (其他的web3与web4同理)浏览器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <!-- 不一样目录写上不一样的标记 --> web2 </body> </html>
浏览器访问 127.0.0.1:8080 并刷新
至此,Nginx集群已搭建完成!
在准备镜像的时候拉了一个php:7.1.0-fpm的镜像,但为了实现session共享,解决集群之间session问题,须要在此镜像改动一下,安装redis拓展,修改php的session储存方式为redis
在 /docker/php/ 目录下建立Dockerfile文件
FROM php:7.1.0-fpm MAINTAINER xiaowei "694623056@qq.com" # Install php extension--redis RUN cd /usr/local/ \ && mkdir redis_phpext \ && curl -o redis_phpext/redis-3.1.3.tgz http://101.96.10.64/pecl.php.net/get/redis-3.1.3.tgz \ && cd redis_phpext \ && tar zxvf redis-3.1.3.tgz \ && cd redis-3.1.3 \ && phpize \ && ./configure --with-php-config=/usr/local/bin/php-config \ && make && make install \ && rm -rf /usr/local/redis_phpext
# 切换目录 $ cd /docker/php # build: 建立,切记勿忽略后面的 . 意为当前目录 $ docker build -t php:add_redis .
建立完成后 docker images 查看是否成功
$ docker images
修改docker-compose.yml文件,添加php与redis的编排,这里已经不须要测试集群,能够把Nginx应用网站根目录统一挂载到 /docker/www
version: '2' services: web1: image: nginx links: - web2 - web3 - web4 ports: - "8080:8080" volumes: - "/docker/nginx/web1/conf.d:/etc/nginx/conf.d" web2: image: nginx links: - php volumes: - "/docker/www:/www" - "/docker/nginx/web2/conf.d:/etc/nginx/conf.d" web3: image: nginx links: - php volumes: - "/docker/www:/www" - "/docker/nginx/web3/conf.d:/etc/nginx/conf.d" web4: image: nginx links: - php volumes: - "/docker/www:/www" - "/docker/nginx/web4/conf.d:/etc/nginx/conf.d" php: build: /docker/php/ links: - redis volumes: - "/docker/www:/www" - "/docker/php/conf.d:/usr/local/etc/php/conf.d" redis: image: redis volumes: - "/docker/redis/data:/data" ports: - "6379:6379" command : redis-server --appendonly yes
在 /docker/php/conf.d/ 目录下建立文件redis.ini
;添加redis拓展 extension = redis.so ;设置session储存方式为redis session.save_handler = redis session.save_path = redis:6379
将php类型文件转发给php-fpm处理,修改 web2 web3 web4 Nginx配置文件
/docker/nginx/web[2-3]/demo.conf
server { listen 80; server_name localhost; gzip on; location / { root /www; index index.php index.html index.htm; autoindex off; } location ~ \.php { root /www; fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include fastcgi_params; } }
将一开始编排的集群容器中止并删除,从新建立并启动容器
# 中止 $ docker-compose stop # 删除 须要确认 y $ docker-compose rm # 建立容器启动并后台运行 $ docker-compose up -d
在 /docker/www 目录建立 index.php文件
<?php echo phpinfo();
浏览器访问 127.0.0.1:8080/index.php
在 /docker/www 目录建立 session.php文件
<?php session_start(); echo 'SESSION_ID:'.session_id();
浏览器访问 127.0.0.1:8080/session.php 每次的session_id相同则代表已实现session共享
本文出自我的博客 最好的安排 转载请注明出处!