1、新建一個dockerfile文件 touch test.Dockerfile 2、找一個centos基礎鏡像 可以去docker hub上尋找,鏈接:docker-hub 在搜索框搜索'centos',或者直接點擊docker-hub-centos。裡面有從centos 6 到最新的centos ...
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 { } } }