環境要求:安裝了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共享
本文出自我的博客 最好的安排 轉載請註明出處!