一、使用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(); ?>