一、使用Dockerfile製作鏡像
前面的博客中已經介紹瞭如何基於容器製作鏡像,此方法的原理是使用一個正在運行的容器,根據生產所需進行配置更改等操作後,使其滿足生產環境,再將這個容器打包製作爲鏡像,這樣類似於快照製作鏡像的方式儘管操作還算比較簡單,但是當生產環境規模增大,配置變得越來越複雜後,就會顯得很臃腫很笨拙。所以下面使用Docker搭建LNMP介紹另一種最爲普遍最爲常用的容器鏡像製作方式——Dockerfile。
1.製作nginx鏡像
編輯Dockerfile文件,Dockerfile文件的文件名可以是自定義,但首字母一定要大寫:
FROM centos:latest LABEL AUTHER="AM" ENV NGX_VERSION="nginx-1.14.2" \ WEB_ROOT="/data/nginx/html" \ WEB_PORT="80" \ PHP_ROOT="/var/www/html" \ PHP_IP="172.19.0.4" ADD $NGX_VERSION.tar.gz /tmp/nginx/ RUN yum makecache \ && yum install -y gcc gcc-c++ make openssl-devel pcre-devel \ && mkdir -p /data/nginx/ \ && cd /tmp/nginx/$NGX_VERSION/ \ && ./configure --prefix=/data/nginx/ \ && make \ && make install \ && yum remove -y gcc gcc-c++ make \ && rm -rf /data/nginx/conf/nginx.conf \ && yum clean all \ && rm -rf /tmp/nginx/ COPY nginx.conf /data/nginx/conf/ WORKDIR /data/nginx EXPOSE 80 CMD ["./sbin/nginx","-g","daemon off;"]
Nginx鏡像目錄樹:
/root/image/ ├── Dockerfile ├── index.html ├── nginx-1.14.2.tar.gz ├── nginx.conf
生成鏡像:
docker build -t selfnginx:v0.1 ./
創建搭建LNMP的專用網絡連接,使容器之間能在同一網絡名稱空間通信,(要注意的是,要使容器間通信不僅可以創建新的網絡連接,還可以使用 --link 選項):
docker network create lnmp
啓動Nginx容器:
docker container run --name nginx-lnmp -it \
--network lnmp -p 80:80 --rm -v \
/data/nginx/html:/data/nginx/html nginx-lnmp:latest
2.製作並啓動PHP鏡像
PHP7.2Dockerfile託管在Github上,製作方法和Nginx相同。啓動容器:
docker container run --name php -it --network lnmp -\
-rm -v /data/nginx/html:/var/www/html \
php-fpm7.2:latest
在Nginx與PHP建立連接時有一個坑,在Nginx+PHP中通用配置如下:
location ~ .php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
在通常的非Docker場景中這樣配置是沒有問題的,但是在Docker場景下使用 $document_root 會出現報錯: FastCGI sent in stderr: "Primary script unknown" ,打開php頁面時會提示 file not found 。這是由於PHP容器化後PHP的工作目錄並不是默認的 $document_root ,所以必須使用容器鏡像事先所指定的路勁,我這裏的路徑是 /var/www/html ,所以要將 $document_root 替換爲 /var/www/html 。
3.製作並運行MariaDB鏡像
MariaDB的Dockerfile地址也託管在github上。我這裏沒有製作鏡像,直接使用的是官方的公共Docker鏡像→鏈接。
在啓動MariaDB時,要指定初始化的環境變量:MYSQL_ROOT_PASSWORD MYSQL_DATABASE、MYSQL_USER、MYSQL_PASSWORD等,其中必須的是 MYSQL_ROOT_PASSWORD :
docker container run --name mariadb -it \
-p 3306:3306 --network lnmp \
-v /data/mysql:/var/lib/mysql --rm \
-e MYSQL_ROOT_PASSWORD=root -e MYSQL_USER=mysql \
-e MYSQL_PASSWORD=123456 \
-e MYSQL_DATABASE=wptest mariadb:10.2.16
4.注意事項
除了上述Nginx配置問題外,還要注意Nginx和PHP的數據路徑必須掛載在同一位置。檢測PHP是否可與MariaDB正常通信,可使用:
<?php $mysqli = new mysqli("localhost", "root", "password"); if(!$mysqli) { echo"database error"; }else{ echo"php env successful"; } $mysqli->close(); ?>