Dockerfile編寫制作centos7.7+php5.6+nginx鏡像


1、新建一個dockerfile文件

touch test.Dockerfile

2、找一個centos基礎鏡像

 可以去docker hub上尋找,鏈接:docker-hub 在搜索框搜索'centos',或者直接點擊docker-hub-centos。里面有從centos 6 到最新的centos 8 等各版本的基礎鏡像,此處我選擇版本:centos:7.7.1908,當然也可以選擇其它版本。

 所以,在test.Dockerfile第一行為:

FROM centos:7.7.1908

3、MAINTAINER 指定作者  (非必要)

MAINTAINER wu "471515***@qq.com"

4、使用RUN命令安裝php5.6

  因為我采用yum安裝,所在需要先配置和更新yum源,然后再進行php5.6安裝,。原本在centos的命令如下:

yum install -y epel-release
yum -y install wget
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum -y install --enablerepo=remi --enablerepo=remi-php56 php php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-mysql php-odbc php-pdo php-mssql php-mysqli php-gd php-xml php-pear php-bcmath php-pecl-swoole php-pecl-redis php-pecl-mongo  --skip-broken

  其中yum后都加要-y,避免在執行dockerfile安裝時因等待確認而失敗。在dockerfile中為了避免太多層,可以使用‘&&’將多個使命合並。最終dockerfile中增加命令如下:

RUN yum install -y epel-release \
    && yum -y install wget \
    && wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo \
    && rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm \
    && yum install -y --enablerepo=remi --enablerepo=remi-php56 php php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-mysql php-odbc php-pdo php-mssql php-mysqli php-gd php-xml php-pear php-bcmath php-pecl-swoole php-pecl-redis php-pecl-mongo  --skip-broken \

  注意:其中php擴展可以按需求增減。

5、安裝php-fpm

  原本在centos中執行的命令如下:

yum install -y --enablerepo=remi --enablerepo=remi-php56 php-fpm 

  則在dockerfile增加:

&& yum install -y --enablerepo=remi --enablerepo=remi-php56 php-fpm \

6、安裝nginx

 原本在centos中執行的命令如下:

yum install -y nginx

  則在dockerfile增加:

&& yum install -y nginx \

7、添加www用戶組和用戶並安裝vim

  原本在centos中執行的命令如下:

groupadd www
useradd -g www -s /sbin/nologin www
yum install vim -y

  則在dockerfile增加:

    && groupadd www \
    && useradd -g www -s /sbin/nologin www \
    && yum install vim -y

注意:每一行的 \ 是為了合並命令之后的換行,所以最后一行不需要 \ 。

8、修改nginx配置

  此處用COPY命令直接將配置好的nginx.conf復制到鏡像里面:

COPY nginx.conf /etc/nginx/nginx.conf

  對於nginx.conf文件,增加了對php文件的解析:

location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
            include        fastcgi_params;
        }

9、加入測試用的index.php文件

  此處用COPY命令直接將index.php文件復制到鏡像里相應的目錄:

COPY index.php /usr/share/nginx/html/index.php

  index.php文件中內容為:

<?php
phpinfo();

10、添加容器啟動腳本文件run.sh

  為了讓最終創建的容器在啟動時能啟動nginx和php-fpm服務,需要建一個run.sh,用於在啟動時執行,其中命令為:

#!/bin/bash

nginx
php-fpm
tail -f /dev/null

  其中最后一行的'tail -f /dev/null',是為了避免在CMD執行完這個命令腳本后主進程退出時將導致容器也退出,才加的阻塞操作,因為這個命令永遠都執行不完。然后在dockerfile文件中用COPY命令直接將run.sh文件復制到鏡像里相應的目錄:

COPY run.sh /mnt/run.sh

  特別注意:run.sh必須要有執行權限!

11、開放80端口

EXPOSE 80

12、CMD命令執行run.sh

CMD ["/mnt/run.sh"]

13、使用docker build命令構建鏡像

  將上述步驟中建好的四個文件放在同一目錄下,然后使用命令構建:

  

sudo docker build -t centos7.7:v2 -f test.Dockerfile .

  等待幾分鍾,鏡像就構建好了。因為涉及到下載安裝過程,網絡不好可能失敗,可以重新運行命令。

  

14、使用docker run創建一個容器並運行

sudo docker run -d --name test -p 8010:80 -it centos7.7:v2

  然后,在瀏覽器中訪問:http://127.0.0.1:8010/,即出現熟悉的頁面:  

  

 15、附錄:各文件中最終內容

  test.dockerfile文件內容如下:

FROM centos:7.7.1908
MAINTAINER wu "471515***@qq.com"

RUN yum install -y epel-release \
    && yum -y install wget \
    && wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo \
    && rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm \
    && yum install -y --enablerepo=remi --enablerepo=remi-php56 php php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-mysql php-odbc php-pdo php-mssql php-mysqli php-gd php-xml php-pear php-bcmath php-pecl-swoole php-pecl-redis php-pecl-mongo  --skip-broken \
    && yum install -y --enablerepo=remi --enablerepo=remi-php56 php-fpm \
    && yum install -y nginx \
    && groupadd www \
    && useradd -g www -s /sbin/nologin www \
    && yum install vim -y
COPY nginx.conf /etc/nginx/nginx.conf
COPY index.php /usr/share/nginx/html/index.php
COPY run.sh /mnt/run.sh
EXPOSE 80
CMD ["/mnt/run.sh"]

  nginx.conf文件內容如下:

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80;
        server_name  _;
        root         /usr/share/nginx/html;.
        include /etc/nginx/default.d/*.conf;
    
        location / {
        root   html;
        index  index.php index.html index.htm;
        }
    
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
            include        fastcgi_params;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM