1. 程式人生 > >利用docker來部署web應用

利用docker來部署web應用

參考:作者一https://tommy.net.cn/2015/02/13/run-and-debug-php-website-with-docker-part-1/

作者二https://menng.github.io/2015/08/24/run-php-website-with-docker/

作者二參考的作者一,部署了php的website

因為要經常升級 MySQL 到最新版本,所以,我們不想每升級一次資料庫,就重新匯出、匯入一次資料,因為這樣感覺實在是太土了,不夠高大上。為了達到這個目的,我們在建立 MySQL 例項之前需要先建立一個 Volume 用於儲存 MySQL 的資料。我個人喜歡用 busybox 作為 base image,當然,你也可以根據自己的喜好來做。

docker run --name=mysql_data -v/var/lib/mysql -d busybox echo MySQL Data

建立 MySQL 例項

docker run --name=mysql_server--volumes-from mysql_data -e MYSQL_ALLOW_EMPTY_PASSWORD=1 -d tommylau/mysql

docker run --name=mysql_server--volumes-from mysql_data -e MYSQL_ROOT_PASSWORD=Passw0rd -d tommylau/mysql

新建一個 wwwroot

的例項,用於對映例項裡面的 /var/www/html路徑,因為 Nginx PHP 需要同時訪問到這些檔案。

docker run --name=wwwroot -v/home/user/www:/var/www/html -d busybox echo wwwroot

通過上面的命令就把本地路徑 /home/user/www 對映到了 /var/www/html。注意:請用你本機的實際地址替換相應的路徑。至此,我們就完成了 wwwroot 的準備工作。可以再次執行 docker ps -a 檢查一下。在/home/user/www這個目錄建立2個新檔案,分別是 index.html 和 info.php

新建立的這個 php-fpm 例項中,如果開啟 /etc/hosts 會發現裡面有一條域名記錄,指向 mysql_server 例項。

docker run --name=php-fpm --volumes-fromwwwroot --link mysql_server:mysql -d tommylau/php

$ docker exec -ti php-fpm cat /etc/hosts

我們可以看到在 hosts 檔案最後有一條記錄 172.17.0.4 mysql,這個就是 mysql_server 例項在虛擬環境中的 IP 地址,我們在 php-fpm 例項中,就是通過 mysql 這個名字與 mysql_server 例項進行通訊的,我們可以ping 一下看看。

$ docker exec -ti php-fpm ping -c 3mysql

在目錄/home/user/docker建立default.conf

server {

listen 80;

root /var/www/html;

index index.html index.htm index.php;

server_name localhost;

location / {

   # First attempt to serve request as file, then

   # as directory, then fall back to displaying a 404.

   try_files $uri $uri/ =404;

   # Uncomment to enable naxsi on this location

   # include /etc/nginx/naxsi.rules

   }

location ~ \.php$ {

   fastcgi_split_path_info ^(.+\.php)(/.+)$;

   fastcgi_pass php:9000;

   fastcgi_index index.php;

   include fastcgi_params;

   }

}

在剛才建立 default.conf 的目錄內(/home/user/docker),建立一個檔名為 Dockerfile 的檔案,其內容如下:

FROM tommylau/nginx

COPY default.conf /etc/nginx/conf.d/

開啟終端或者命令列並進入到 Dockerfile 所在目錄,執行 docker build 命令來生成一個新的映象。注意:本命令必須在 Dockerfile 和 default.conf 所在目錄執行,否則 Docker 會提示找不到 Dockerfile。

$ docker build -t local/nginx .

這個命令會生成一個新的名為 local/nginx 的映象,也可以按照你自己的喜好給它重新起個名字。不過必須記住這個名字,因為稍後還要召喚它來提供 Web 服務。最後,整合我們之前啟動的 PHP-FPM 例項 php-fpm。

docker run --name=nginx --volumes-fromwwwroot --link php-fpm:php -p 80:80 -d local/nginx

同樣的,需要載入 wwwroot 例項,以便例項可以正確的訪問 /var/www/html 目錄。這裡將例項 php-fpm 對映成別名 php,這裡必須要與之前修改的 Nginx 配置檔案 default.conf 中的名字相匹配(fastcgi_pass 後面的伺服器名)。-p 80:80 表示將例項內的 80 埠暴露給 Host 主機。

這個時候,我們已經可以通過 http://localhost 來訪問 Nginx 例項了。你會看到一個 Hello,world!,當然我們也可以訪問 http://localhost/info.php 來檢視 PHP 版本資訊。

問題:


排查:

執行命令檢視

docker exec nginx ls /

 

原因是CentOS7中的安全模組selinux把許可權禁掉了,至少有以下三種方式解決掛載的目錄沒有許可權的問題:

  1.在執行容器的時候,給容器加特權,及加上 --privileged=true 引數:

  docker run -i -t -v /soft:/soft --privileged=true 686672a1d0cc /bin/bash

  2.臨時關閉selinux:

  setenforce 0

  3.新增selinux規則,改變要掛載的目錄的安全性文字