docker-compose构建并启动LNMP
真的是太不容易了,这个实验贼**难
开始吧~~
奥里给!!!
创建docker-compose执行目录/lnmp
[root@localhost ~]# mkdir /lnmp
创建nginx/mysql/php的构建镜像目录
[root@localhost ~]# cd /lnmp
[root@localhost lnmp]# mkdir {nginx,mysql,php}
拖包
很关键,不然第一个报错就是找不到文件,放到相应目录下
/lnmp
├── docker-compose.yml
├── mysql
│ ├── cmake-3.15.1.tar.gz
│ ├── Dockerfile
│ ├── mysql-5.6.33.tar.gz
│ └── mysql.sh
├── nginx
│ ├── Dockerfile
│ └── nginx-1.11.1.tar.gz
└── php
├── Dockerfile
├── php-5.3.28.tar.gz
└── php.sh
Nginx
编写nginx的Dockerfile
[root@localhost lnmp]# vim nginx/Dockerfile
FROM centos
MAINTAINER FeiYi
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
RUN yum -y install net-tools iproute pcre-devel openssl-devel gcc gcc-c++ make zlib-devel elinks
ADD nginx-1.11.1.tar.gz /usr/src
ENV NGINX_DIR /usr/src/nginx-1.11.1
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
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
MySQL
编写mysql启动脚本
也为了防止启动容器后,自动exited
[root@localhost lnmp]# vim mysql/mysql.sh
#!/bin/bash
/etc/init.d/mysqld start
/bin/bash
编写mysql的Dockerfile
[root@localhost lnmp]# vim mysql/Dockerfile
FROM centos
MAINTAINER FeiYi
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
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
ADD cmake-3.15.1.tar.gz /usr/src
ADD mysql-5.6.33.tar.gz /usr/src
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
WORKDIR /
COPY mysql.sh /root/mysql.sh
RUN chmod +x /root/mysql.sh
EXPOSE 3306
CMD ["/root/mysql.sh"]
PHP
php启动脚本
与mysql原因一样
[root@localhost lnmp]# vim php/php.sh
#!/bin/bash
/etc/init.d/php-fpm start
/bin/bash
php的Dockerfile
[root@localhost lnmp]# vim php/Dockerfile
FROM centos
MAINTAINER FeiYi
RUN yum -y install net-tools coreutils chkconfig iproute sed \
pcre-devel ncurses-devel openssl-devel zlib-devel autoconf php-mysql mysql-devel \
libjpeg-devel libxml2-devel libpng-devel gd gcc gcc-c++ make perl perl-devel
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 php-5.3.28.tar.gz /usr/src
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 /
WORKDIR $PHP_INSTALL_DIR
RUN ./configure --prefix=$PHP_DIR --with-gd --with-zlib \
--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 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 mkdir /www/php -p
RUN useradd -M -s /sbin/nologin nginx
COPY php.sh /root/php.sh
RUN chmod +x /root/php.sh
EXPOSE 9000
CMD ["/root/php.sh"]
编写docker-compose.yml
[root@localhost lnmp]# vim docker-compose.yml
version: "3"
services:
nginx:
container_name: nginx_cyj # 容器名
build: /lnmp/nginx # 构建目录
volumes:
- nginx_dir:/usr/local/nginx/conf/ # 映射目录
links:
- php:phpfpm # 与php服务器的链接
restart: always
ports:
- "80:80"
hostname: nginx_cyj # 主机名
mysql:
hostname: mysql_cyj
container_name: mysql_cyj
build: /lnmp/mysql/
volumes:
- mysql_conf:/etc/my.cnf
- mysql_data:/usr/local/mysql
ports:
- "3306:3306"
stdin_open: true
php:
hostname: php_cyj
container_name: php_cyj
build: /lnmp/php
volumes:
- php_dir:/usr/local/php/
- php_index:/www/php
restart: always
ports:
- "9000:9000"
stdin_open: true
links:
- mysql:mysql
volumes:
nginx_dir:
mysql_conf:
mysql_data:
php_dir:
php_index:
执行docker-compose启动容器
经过漫长的构建镜像
[root@localhost lnmp]# docker-compose up -d
Creating mysql_cyj ... done
Creating php-fpm_cyj ... done
Creating nginx_cyj ... done
修改配置文件
nginx容器
因为容器中的目录都做了映射,所以只在物理机修改即可
[root@localhost lnmp]# vim /var/lib/docker/volumes/lnmp_nginx_dir/_data/nginx.conf
location / {
root html;
index index.html index.htm index.php; # 添加index.php
}
location ~ \.php$ {
root /www/php/; # 修改为php主机中php页面所在目录
fastcgi_pass phpfpm:9000; # 修改为nginx所links的php
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf; # 修改为fastcgi.conf
}
php容器
[root@localhost lnmp]# vim /var/lib/docker/volumes/lnmp_php_dir/_data/php.ini
short_open_tag = On
default_charset = "utf-8"
[root@localhost lnmp]# vim /var/lib/docker/volumes/lnmp_php_dir/_data/etc/php-fpm.conf
pid = run/php-fpm.pid
user = nginx
group = nginx
listen = 0.0.0.0:9000
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
编写php文件
[root@localhost lnmp]# vim /var/lib/docker/volumes/lnmp_php_index/_data/index.php
<?php
phpinfo();
?>
编写连接数据库文件
[root@localhost lnmp]# vim /var/lib/docker/volumes/lnmp_php_index/_data/mysql.php
<?php
$link=mysql_connect('mysql','root','123.com');
if($link) echo "数据库连接成功!!\n";
mysql_close($link);
?>
mysql授权验证数据库
[root@localhost lnmp]# docker exec -it mysql_cyj /bin/bash
[root@mysql /]# mysql
mysql> grant all on *.* to 'root'@'%' identified by '123.com';
mysql> exit
Bye
[root@mysql_cyj /]# exit
php打入模块
# Dockerfile中安装了php-mysqlnd
[root@localhost lnmp]# docker exec -it php_cyj /bin/bash
[root@7d7d33420e36 /]# cd /usr/src/php-5.3.28/ext/mysql
# 生成mysql模块,用于连接mysql
[root@7d7d33420e36 mysql]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version: 20090626
Zend Module Api No: 20090626
Zend Extension Api No: 220090626
configure.in:3: warning: prefer named diversions
configure.in:3: warning: prefer named diversions
[root@7d7d33420e36 mysql]# cp -rp /usr/lib64/mysql/libmysqlclient.so.18.0.0 /usr/lib/libmysqlclient.so
[root@7d7d33420e36 mysql]# ./configure --with-mysql --with-php-config=/usr/local/php/bin/php-config
[root@7d7d33420e36 mysql]# make && make install
# 生成mysqli模块,用于调用mysqli_connect函数
[root@7d7d33420e36 /]# cd /usr/src/php-5.3.28/ext/mysqli
[root@7d7d33420e36 mysqli]# /usr/local/php/bin/phpize
[root@7d7d33420e36 mysqli]# ./configure --with-mysqli --with-php-config=/usr/local/php/bin/php-config
[root@7d7d33420e36 mysqli]# make && make install
[root@7d7d33420e36 ~]# vi /usr/local/php/php.ini
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/mysqli.so
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/mysql.so
[root@php_cyj mysqli]# exit
exit
重启容器服务
# 重启mysql
[root@localhost lnmp]# docker exec -it mysql_cyj /bin/bash
[root@mysql /]# /etc/init.d/mysqld restart
Shutting down MySQL. SUCCESS!
Starting MySQL. SUCCESS!
[root@mysql /]# exit
# 重启php
[root@localhost lnmp]# docker exec -it php_cyj /bin/bash
[root@7d7d33420e36 /]# /etc/init.d/php-fpm restart
Gracefully shutting down php-fpm warning, no pid file found - php-fpm is not running ?
Starting php-fpm done
# 重启nginx
[root@localhost lnmp]# docker exec -it nginx_cyj /bin/bash
[root@nginx_cyj /]# nginx -s reload
[root@nginx_cyj /]# exit
验证访问
curl 192.168.1.14
curl 192.168.1.14/index.php
crul 192.168.1.14/mysql.php