Dockerfile构建LNMP镜像

要求,构建完成后,进入容器可以直接访问到index.php

编写Dockerfile,为了方便看,将LNMP分为来写

准备本地环境

先将以下包,nginx/mysql/php所需的tar包拖入物理机

nginx-1.11.1.tar.gz
cmake-3.15.1.tar.gz
mysql-5.6.33.tar.gz
php-5.3.28.tar.gz

编写index.php页面,用于最后验证

[root@localhost ~]# vim index.php
<?php
$link=mysql_connect('localhost','root');
if($link) echo "裴金凤我爱你!!\n";
mysql_close($link);
?>

将以下每一步的内容复制到Dockerfile文件中进行构建即可

定义变量

FROM centos  # 调用docker中已下载的centos镜像
MAINTAINER FeiYi  # 作者名为FeiYi
ENV NGINX_DIR /usr/src/nginx-1.11.1
ENV CMAKE_INSTALL_DIR /usr/src/cmake-3.15.1
ENV MYSQL_INSTALL_DIR /usr/src/mysql-5.6.33
ENV MYSQL_DIR /usr/local/mysql
ENV MYSQL_SH /etc/init.d/mysqld
ENV PHP_INSTALL_DIR /usr/src/php-5.3.28
ENV PHP_DIR /usr/local/php
ENV PHP_SH /etc/init.d/php-fpm

解压包

ADD nginx-1.11.1.tar.gz /usr/src
ADD cmake-3.15.1.tar.gz /usr/src
ADD mysql-5.6.33.tar.gz /usr/src
ADD php-5.3.28.tar.gz /usr/src

Nginx镜像

直接使用上一篇文档的构建方法

# 安装lnmp环境所需包
RUN yum -y install net-tools coreutils chkconfig iproute sed \
pcre-devel ncurses-devel openssl-devel zlib-devel autoconf \
libjpeg-devel libxml2-devel libpng-devel gd gcc gcc-c++ make perl perl-devel
WORKDIR $NGINX_DIR
RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
WORKDIR /
RUN useradd nginx
RUN ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx

MySQL镜像

WORKDIR $CMAKE_INSTALL_DIR
RUN ./configure && gmake && gmake install
WORKDIR $MYSQL_INSTALL_DIR
RUN cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DSYSCONFDIR=/etc \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all && make && make install
WORKDIR /
RUN useradd -M -s /sbin/nologin mysql && chown -R mysql:mysql $MYSQL_DIR
RUN cp $MYSQL_DIR/support-files/mysql.server $MYSQL_SH
RUN chmod +x $MYSQL_SH && chkconfig --add mysqld && systemctl enable mysqld
RUN ln -s /usr/local/mysql/bin/* /usr/local/bin
WORKDIR $MYSQL_DIR/scripts/
RUN ./mysql_install_db --user=mysql --group=mysql \
--basedir=$MYSQL_DIR \
--datadir=$MYSQL_DIR/data
# 稍后在启动添加端口

php镜像

这里需要去修改配置文件,两种方法

方法一:

使用sed -i

WORKDIR $PHP_INSTALL_DIR
RUN ./configure --prefix=$PHP_DIR --with-gd --with-zlib \
--with-mysql=$MYSQL_DIR --with-config-file-path=$PHP_DIR \
--enable-fpm --enable-mbstring --with-jpeg-dir=/usr/lib && make && make install
WORKDIR /
RUN cp $PHP_INSTALL_DIR/php.ini-development $PHP_DIR/php.ini
RUN sed -i '/default_charset/c \default_charset = "utf-8"' $PHP_DIR/php.ini
RUN sed -i '/short_open_tag/c \short_open_tag = On' $PHP_DIR/php.ini
RUN cp $PHP_INSTALL_DIR/sapi/fpm/init.d.php-fpm $PHP_SH
RUN chmod +x $PHP_SH && chkconfig --add php-fpm
RUN cp $PHP_DIR/etc/php-fpm.conf.default $PHP_DIR/etc/php-fpm.conf
RUN sed -i '/;pid = run/c \pid = run/php-fpm.pid' $PHP_DIR/etc/php-fpm.conf && \
sed -i '/user =/c \user = nginx' $PHP_DIR/etc/php-fpm.conf && \
sed -i '/group =/c \group = nginx' $PHP_DIR/etc/php-fpm.conf && \
sed -i '/pm.max_children/c \pm.max_children = 50' $PHP_DIR/etc/php-fpm.conf && \
sed -i '/pm.start_servers/c \pm.start_servers = 20' $PHP_DIR/etc/php-fpm.conf && \
sed -i '/pm.min_spare_servers/c \pm.min_spare_servers = 5' $PHP_DIR/etc/php-fpm.conf && \
sed -i '/pm.max_spare_servers/c \pm.max_spare_servers = 35' $PHP_DIR/etc/php-fpm.conf
稍后在启动

方法二:

在本地准备一个配置好的文件去复制到内容中,建议使用这种方法,第一种方法使用sed可能并不会那么精准的去修改文件中的内容

最好是按照自己的需要更改。

准备好文件后在Dockerfile中接着写入

COPY php.ini $PHP_DIR/php.ini
COPY php-fpm.conf $PHP_DIR/etc/php-fpm.conf

整合php-fpm和nginx

方法一

sed -i

RUN sed -i '/        server_name  localhost;/a \        location ~ \.php$ {\n            root           html;\n            fastcgi_pass   127.0.0.1:9000;\n            fastcgi_index  index.php;\n            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;\n            include        fastcgi.conf;\n}' /usr/local/nginx/conf/nginx.conf
RUN sed -i '/            index  index.html index.htm;/c \            index  index.html index.htm index.php;' /usr/local/nginx/conf/nginx.conf

方法二

在本地准备一个配置好的文件去复制到内容中

准备好配置文件后,在Dockerfile中接着写入

COPY nginx.conf $NGINX_DIR/conf/nginx.conf

导入index.php文件

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

启动服务并监听端口

这里启动多个服务,需要借助shell脚本

在本地编写脚本

[root@localhost ~]# vim start.sh
#!/bin/bash
nginx
/etc/init.d/mysqld start
/etc/init.d/php-fpm start
/bin/bash

注意:脚本最后添加的/bin/bash,是为了防止脚本运行完退出,退出结束后,使用该镜像运行的容器也会自动退出,/bin/bash是一个不会退出的程序

在Dockerfile结尾输入以下

EXPOSE 80 3306 9000
COPY start.sh /usr/bin/start.sh
RUN chmod +x /usr/bin/start.sh
ENTRYPOINT /usr/bin/start.sh

这里使用ENTRYPOINT可以直接使用docker run启动并进入容器,如果是CMD就要使用docker rundocker exec搭配来使用

构建镜像

[root@localhost ~]# docker build -t chai/lnmp1 /root
Successfully built 9ef7a1665e87
Successfully tagged test5:latest

经过很漫长的等待和拍错后,获得了成功的喜悦

[root@localhost ~]# docker images
REPOSITORY    TAG            IMAGE ID            CREATED             SIZE
chai/lnmp1    latest         04536a77eac3        7 minutes ago       5.65GB
busybox       latest         83aa35aa1c79        2 weeks ago         1.22MB
httpd         latest         c5a012f9cf45        4 weeks ago         165MB
centos        latest         5e35e350aded        4 months ago        203MB

进入容器验证

查看端口是否监听

[root@localhost ~]# docker run -it --name lnmptest chai/lnmp1 /bin/bash
Starting MySQL .. SUCCESS!
Starting php-fpm ......SUCCESS!
[root@940cf4ce039e /]# 

有的人在这里可能会出现php-fpm启动失败的问题,但是端口已经在监听,并且正常使用,这是因为php-fpm.conf文件中和/etc/init.d/php-fpm中指定的pid文件路径不一致,查看两个文件中的pid文件位置,更改为和其中一个一样即可

查看ip,用来访问

# ip a 查看到ip为172.17.0.2
[root@940cf4ce039e /]# curl 172.17.0.2/index.php
裴金凤我爱你!!

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0