基于Dockerfile搭建LNMP环境

准备工作

#关闭防火墙和防护机制
systemctl stop firewalld 
systemctl disable firewalld
setenforce 0

docker network create --subnet=172.18.0.0/16 
--opt "com.docker.network.bridge.name"="docker1"  mynetwork

#设置自定义网络模式,模式为bridge模式,
docker1的ip地址为172.18.0.1,显示的网络名称mynetwork。

docker network ls
#查看使用的网络模式

ifconfig

部署nginx

(容器IP 为 172.18.0.10)

编写Dockerfile文件

mkdir /opt/nginx
cd /opt/nginx/

上传 nginx-1.12.0.tar.gz、wordpress-4.9.4-zh_CN.tar.gz 到 /opt/nginx/ 目录中


#解压wordpress
mkdir /opt/nginx/html
tar zxvf wordpress-4.9.4-zh_CN.tar.gz -C /opt/nginx/html

vim Dockerfile

FROM centos:7
#指定基础镜像

MAINTAINER this is nginx image <wl>
#指定维护者信息

RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
#安装依赖包,安装环境

RUN useradd -M -s /sbin/nologin nginx
#创建nginx用户

ADD nginx-1.12.0.tar.gz /usr/local/src/
#将本地安装包上传指定目录 解压

WORKDIR /usr/local/src/nginx-1.12.0
#进入到/opt/nginx-1.12.2目录中

RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
#开始编译安装,加上&&符号,只有前面执行完成,后面才会执行

ENV PATH /usr/local/nginx/sbin:$PATH

ADD nginx.conf /usr/local/nginx/conf/
#开始编译安装,加上&&符号,只有前面执行完成,后面才会执行

#ADD wordpress-4.9.4-zh_CN.tar.gz /usr/local/nginx/html/
#上传论坛的包

RUN chmod 777 -R /usr/local/nginx/html/
#给html文件所有权限

EXPOSE 80
EXPOSE 443
#开放80 443 端口

VOLUME ["/usr/local/nginx/html/"]
#挂载目录(相当于将/usr/local/nginx/html目录共享,
会在宿主机上自动生成共享目录,主要目的是为了让容器之间共享这个文件)(视情况可不需要)

ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]
#执行启动nginx命令,并且关闭nginx的后台启动,因为需要它占用前台,让docker不关闭

配置nginx.conf文件

vim nginx.conf

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        charset utf-8;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.php;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
            root           html;
            fastcgi_pass   172.18.0.30:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;
            include        fastcgi_params;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

对接php的IP地址

构建启动nginx镜像

docker build -t nginx:lnmp .
#构建nginx镜像(别忘记最后的点)

docker run -d --name nginx -p 80:80 -v /opt/nginx/html:/usr/local/nginx/html --net mynetwork --ip 172.18.0.10 nginx:lnmp
#启动容器

docker ps -a 
#查看容器

部署mysql

(容器IP 为 172.18.0.20)

mkdir /opt/mysqld
cd /opt/mysqld

上传 mysql-boost-5.7.20.tar.gz 到 /opt/mysqld 目录中

编写Dockerfile文件

vim Dockerfile

FROM centos:7
#基础镜像

MAINTAINER this is mysql image <wl>
#维护人描述信息

RUN yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake make
#安装依赖环境

ADD mysql-boost-5.7.20.tar.gz /usr/local/src/
#上传包到指定目录

WORKDIR /usr/local/src/mysql-5.7.20/
#切换到解压后的目录

RUN cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8  \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1 && make && make install
#编译安装

ADD my.cnf /etc/
#将主机上的 "my.cnf" 文件复制到镜像中的 "/etc/" 目录中

ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
#设置环境变量

RUN useradd -M -s /sbin/nologin  mysql
创建mysql用户

RUN chown mysql:mysql /etc/my.cnf
#将 "/etc/my.cnf" 文件的所有者和组设置为 "mysql:mysql"

RUN chown -R mysql:mysql /usr/local/mysql/
#将 "/usr/local/mysql/" 目录及其子目录下的所有文件的所有者和组设置为 "mysql:mysql"

RUN /usr/local/mysql/bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
#初始化mysql

EXPOSE 3306
#开放3306端口

CMD ["/usr/local/mysql/bin/mysqld"]

配置my.conf文件

vim my.cnf

[client]
port = 3306
socket = /usr/local/mysql/mysql.sock

[mysql]
port = 3306
socket = /usr/local/mysql/mysql.sock

[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES

构建启动Mysql镜像

docker build -t mysql:lnmp .

docker run --name=mysql -d --privileged -v /usr/local/mysql --net mynetwork --ip 172.18.0.20 mysql:lnmp

-----------------------------------------
--privileged: #让容器内拥有root权限
-v /usr/local/mysql: #共享这个目录,其它容器可以使用--volumes-from 指定读取本容器的共享目录。然后也会生成一样的目录。
--net mynetwork: #指定--net网络模式,mynetwork为自定义网络模式。
--ip 172.18.0.20: #指定ip地址,自定义网络模式也可以指定ip地址。
-----------------------------------------
docker ps -a
#查看容器

部署php

(容器IP 为 172.18.0.30)

mkdir /opt/php
cd /opt/php

上传 php-7.1.10.tar.bz2 到 /opt/php 目录中

编写Dockerfile文件

vim Dockerfile

FROM centos:7
MAINTAINER this is php image <wl>
RUN yum -y install gd \
libjpeg libjpeg-devel \
libpng libpng-devel \
freetype freetype-devel \
libxml2 libxml2-devel \
zlib zlib-devel \
curl curl-devel \
openssl openssl-devel \
gcc gcc-c++ make pcre-devel 
RUN useradd -M -s /sbin/nologin nginx
#下载环境 创建用户

ADD php-7.1.10.tar.bz2 /usr/local/src/
#上传包到指定目录

WORKDIR /usr/local/src/php-7.1.10
进入到指定目录

RUN ./configure \
--prefix=/usr/local/php \
--with-mysql-sock=/usr/local/mysql/mysql.sock \
--with-mysqli \
--with-zlib \
--with-curl \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-openssl \
--enable-fpm \
--enable-mbstring \
--enable-xml \
--enable-session \
--enable-ftp \
--enable-pdo \
--enable-tokenizer \
--enable-zip && make && make install
#编译安装

ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH
设置环境变量

ADD php.ini    /usr/local/php/lib/
ADD php-fpm.conf /usr/local/php/etc/
ADD www.conf /usr/local/php/etc/php-fpm.d/
#上传配置文件到指定目录

EXPOSE 9000
ENTRYPOINT [ "/usr/local/php/sbin/php-fpm", "-F" ]
#启动镜像 占用前台

配置php的配置文件

vim php.ini

vim www.conf

vim php-fpm.conf

构建启动php镜像

docker build -t php:lnmp .

docker run --name=php -d -p 9000:9000 --volumes-from mysql --volumes-from nginx --net mynetwork --ip 172.18.0.30 php:lnmp

登陆mysql容器 授权

docker exec -it mysql /bin/bash
#进入mysql容器

mysql
#登录mysql

create database wordpress;
#创建数据库
grant all privileges on wordpress.* to 'wordpress'@'%' identified by '123456';
grant all privileges on *.* to 'root'@'%' identified by 'abc123';
flush privileges;

访问测试wordpress

浏览器访问

http://20.0.0.60/wordpress/index.php

相关推荐
雪域迷影3 小时前
PostgreSQL Docker Error – 5432: 地址已被占用
数据库·docker·postgresql
莹雨潇潇4 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
tangdou3690986558 小时前
Docker系列-5种方案超详细讲解docker数据存储持久化(volume,bind mounts,NFS等)
docker·容器
代码敲上天.10 小时前
数据库语句优化
android·数据库·adb
漫无目的行走的月亮11 小时前
在Docker中运行微服务注册中心Eureka
docker
大道归简14 小时前
Docker 命令从入门到入门:从 Windows 到容器的完美类比
windows·docker·容器
zeruns80214 小时前
如何搭建自己的域名邮箱服务器?Poste.io邮箱服务器搭建教程,Linux+Docker搭建邮件服务器的教程
linux·运维·服务器·docker·网站
爱跑步的程序员~14 小时前
Docker
docker·容器
疯狂的大狗15 小时前
docker进入正在运行的容器,exit后的比较
运维·docker·容器
看山还是山,看水还是。15 小时前
MySQL 管理
数据库·笔记·mysql·adb