用Docker打造多版本PHP運行環境

背景

隨着Docker的不斷成熟,愈來愈多的站長以及運維人員選擇Docker構建程序運行環境,另外因爲國內的雲服務廠商一般在新購主機時會給較大的優惠,而續費則優惠不多,本着儘可能節省成本的原則,藉助Docker自動構建運行環境,成爲一個比較好的選擇。本文針對的場景是一臺雲主機上運行多個版本的PHP的狀況,LNMP架構。php

宿主機配置

這裏把運行Docker服務的服務器叫宿主機,目前Docker對於宿主機的系統是有要求的,簡單來講,Centos 須要7以上,Ubuntu須要16以上。因此在購買或者升級雲主機的系統時,須要注意系統的版本,一般選最新的版本是沒錯的,除非有特殊的需求。接下去以Centos爲例,安裝Docker的步驟以下:html

  1. 刪除舊版本
sudo yum remove docker \
                  docker-common \
                  docker-selinux \
                  docker-engine
  1. 安裝對應的包
sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
  1. 只選擇穩定版本的包
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
  1. 安裝 Docker (這裏選擇的社區版本,有錢的能夠選擇企業版)
sudo yum install docker-ce
  1. 啓動Docker
sudo systemctl start docker
  1. 測試Docker
sudo docker run hello-world

這個命令將拉去hello-world鏡像並運行,將輸出hello world消息 7. 讓Docker隨系統啓動linux

sudo systemctl enable docker
  1. 安裝Docker compose
sudo curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
  1. 使用國內鏡像 由於你懂得緣由,直接從docker官方倉拉取鏡像會很慢,常常失敗,因此須要使用牆內鏡像。以阿里雲docker鏡像爲例,首先去註冊一個阿里雲賬戶,而後登錄,找到容器鏡像服務,找不到的話能夠訪問這個地址(地址可能會失效) 阿里雲容器鏡像服務 在鏡像加速器菜單,能夠看到專屬加速地址,拷貝這個地址,而後使用如下命令:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["您的專屬加速地址"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

至此,宿主機算配置完畢啦。nginx

編寫docker-composer.yml

docker composer 適合單主機的狀況下進行多容器編排,代碼已經所有放到馬雲了。 地址https://gitee.com/linwx/Docker-LNMPgit

幾個關鍵點

PHP版本指定

不一樣版本的PHP,用不一樣的服務名來標誌,如php-fpm,和php54-fpm. 而後在nginx裏鏈接的時候,指定相應的名字:github

links:
    - php-fpm:fpm
    - php54-fpm:fpm54

在相應的配置文件中,如site1站點是運行在PHP7版本的,對應的fastcgi_pass參數是fpm:9000:docker

location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass fpm:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors off;
        fastcgi_buffer_size 16k;
        fastcgi_buffers 4 16k;
    }

site2站點是運行在PHP5.4版本上的,對應的fastcgi_pass參數是fpm54:9000:json

location ~ \.php$ {
        root   /var/www/html/bbs;
        fastcgi_pass   fpm54:9000;
        fastcgi_index  index.php;
	    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
	    fastcgi_read_timeout 600;
    }

容器的時間

涉及到時間和日期的操做,須要關注容器的默認時區,好比nginx的日誌輸出的時間,php的計劃任務運行的時間,所以須要在容器編譯的時候,就指定好默認的時區,在nginx和cron的dockerfile裏能夠看到對應的命令:centos

RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

cron容器

本着每一個容器運行一個服務的原則,本文把cron服務也單獨成一個容器,爲了讓cron容器正常運行,須要注意2點,一是容器的時區,上文已經提過;二是計劃任務的列表,須要讓在編譯的時候寫入,相應的dockerfile以下:服務器

ADD crontab /etc/cron.d/cron
RUN chmod 0644 /etc/cron.d/cron
RUN crontab /etc/cron.d/cron
CMD ["cron", "-f"]

使用cron -f 命令,讓cron保持在前臺運行

快速使用

若是不想了解那麼多細節,能夠在配置完宿主機後,直接git clone https://gitee.com/linwx/Docker-LNMP.git 而後配置相應的站點nginx配置文件,就可使用docker-compose up -d --build啓動全部服務啦。

相關文章
相關標籤/搜索