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
[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 run
和docker 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
裴金凤我爱你!!