web應用集羣入門-利用docker在單機搭建web應用集羣實現session共享

環境要求:安裝了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 Compose 是 Docker 容器進行編排的工具,定義和運行多容器的應用,能夠一條命令啓動多個容器。nginx

安裝Compose

直接從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

Compose-version

使用Compose啓動多個Nginx容器

建立編排腳本

在 /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

docker-compose-ps

配置Nginx

反向代理Nginx配置

添加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;
   }
   
}

web應用Nginx配置

編輯並保存 /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目錄

爲了肯定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 並刷新
slb-web2
slb-web3
slb-web4

至此,Nginx集羣已搭建完成!

PHP環境安裝

在準備鏡像的時候拉了一個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

add-redis-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

添加php配置文件

在 /docker/php/conf.d/ 目錄下建立文件redis.ini

;添加redis拓展
extension = redis.so

;設置session儲存方式爲redis
session.save_handler = redis
session.save_path = redis:6379

修改web應用Nginx配置

將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-compose-stop-rm

測試環境!

phpinfo

在 /docker/www 目錄建立 index.php文件

<?php
echo phpinfo();

瀏覽器訪問 127.0.0.1:8080/index.php
docker-slb-phpinfo

session共享

在 /docker/www 目錄建立 session.php文件

<?php
session_start();
echo 'SESSION_ID:'.session_id();

瀏覽器訪問 127.0.0.1:8080/session.php 每次的session_id相同則代表已實現session共享
docker-slb-session
docker-slb-session
docker-slb-session

本文出自我的博客 最好的安排 轉載請註明出處!

相關文章
相關標籤/搜索