利用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
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規則,改變要掛載的目錄的安全性文字