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

compose_nginx

curl 192.168.1.14/index.php

compose_php

crul 192.168.1.14/mysql.php

compose_mysql

评论




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