• Docker搭建LNMP环境


    Docker
    若未安装Docker,可参考以下资料进行安装:
    https://books.studygolang.com/docker_practice/install/

    Nginx
    1. 拉取镜像

    docker pull nginx
    

    2. 运行容器
    (1)创建项目程序根目录,编写一个简单测试的html文件:

    cd /
    mkdir www
    cd www
    vim index.html
    

    index.html文件内容如下:

    <html>
            <head>
                    <title>Docker Nginx Testing</title>
            </head>
            <body>
                    <div>
                            <h3>When you see this message, it means the docker nginx is successfully running!</h3>
                    </div>
            </body>
    </html>
    

    (2)创建nginx目录,创建nginx配置文件nginx-test.conf:

    cd /usr/local
    mkdir nginx
    cd nginx
    mkdir conf
    cd conf
    vim nginx-test.conf
    

    nginx-test.conf文件内容如下:

    server {
        listen       80;
        location / {
            root   /www;
            index  index.html index.htm;
        }
    }
    

    (3)宿主主机8080端口映射nginx容器80端口,宿主主机/usr/local/nginx/conf目录映射nginx容器/etc/nginx/conf.d目录,宿主主机/www目录映射nginx容器/www目录,启动容器:

    docker run --name nginx -p 8080:80 -v /usr/local/nginx/conf:/etc/nginx/conf.d -v /www:/www nginx
    

    3. 浏览器访问验证

    PHP
    1. 拉取镜像

    docker pull php:7.1-fpm
    

    2. 定制并构建镜像
    (1)创建php目录

    cd /usr/local
    mkdir php
    cd php
    mkdir etc #此目录需要放置一个php配置文件,命名php.ini
    vim Dockerfile
    

    注:关于php的配置文件,我的操作是先运行php容器,将其配置文件复制到宿主主机上,然后再进行目录映射。复制指令:

    docker cp php:/usr/local/etc/php/php.ini-development /usr/local/php/etc/php.ini
    

    (2)Dockerfile文件内容:

    FROM php:7.1-fpm #基于镜像文件php:7.1-fpm构建
    COPY ./etc/php.ini /usr/local/etc/php/php.ini #复制上下文目录的php配置文件
    RUN docker-php-ext-install pdo_mysql #使用镜像提供的安装扩展的快捷操作安装pdo_mysql扩展
    

    (3)构建镜像:

    docker build -t php:my-php .
    

    3. 运行容器
    宿主主机9000端口映射php容器9000端口,宿主主机/www目录映射php容器/www目录,启动容器:

    docker run --name php -p 9000:9000 -v /www:/www php:my-php
    

    4. nginx支持php
    (1)把nginx和php两个容器通过网卡连接起来:

    docker network create --driver bridge lnmp #新建一个桥接网卡,名为lnmp
    docker network connect lnmp php #php容器连接网卡lnmp
    docker network connect lnmp nginx #nginx容器连接网卡lnmp
    docker network ls #查看网卡列表
    docker network inspect lnmp #查看网卡lnmp详情
    

    (2)修改nginx配置文件nginx-test.conf,把PHP脚本转发给php-fpm,php-fpm地址通过容器名进行识别:

    server {
        listen       80;
        location / {
            root   /www;
            index  index.php index.html index.htm;
        }
        location ~ .php$ {
            root           /www;
            fastcgi_pass   php:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
    

    (3)让nginx容器重新加载配置文件:

    docker exec -it nginx nginx -s reload
    

    5. 运行验证
    在宿主主机/www下创建文件phpinfo.php:

    <?php
    phpinfo();
    

    保存,浏览器访问:

    MySQL
    1. 拉取镜像

    docker pull mysql:5.7
    

    2. 定制并构建镜像
    (1)创建mysql目录:

    cd /usr/local
    mkdir mysql
    cd mysql
    

    (2)创建测试数据文件test.sql:

    create table student(
            id int not null primary key auto_increment comment '主键ID',
            name varchar(20) not null comment '姓名',
            age int not null comment '年龄'
    )engine=InnoDB default charset=utf8 comment '学生数据表';
    
    insert into student(name, age) values('小明', 18);
    insert into student(name, age) values('啊俊', 28);
    

    (3)创建Dockerfile:

    FROM mysql:5.7 #基于镜像文件mysql:5.7构建
    ENV MYSQL_ROOT_PASSWORD=123456 MYSQL_DATABASE=test #设置root用户密码
    COPY ./test.sql /var/data/test.sql #复制上下文目录的SQL文件
    

    (4)构建镜像:

    docker build -t mysql:my-mysql .
    

    3. 运行容器
    宿主主机3306端口映射mysql容器3306端口,启动容器并加入网络lnmp:

    docker run --name mysql --network lnmp -p 3306:3306 mysql:my-mysql
    

    4. 运行验证
    (1)进入容器,将测试数据导入mysql:

    docker exec -it mysql bash
    mysql -u root -p
    mysql> use test
    mysql> source /var/data/test.sql
    

    (2)在宿主主机/www目录创建测试文件testmysql.php:

    <?php
    $dsn = 'mysql:dbname=test;host=mysql';
    $user = 'root';
    $password = '123456';
    
    try {
        $dbh = new PDO($dsn, $user, $password);
        $sql = 'SELECT * FROM student where id=?';
        $sth = $dbh->prepare($sql);
        $sth->execute([2]);
        $result = $sth->fetch(PDO::FETCH_ASSOC);
        var_dump($result);
    } catch (PDOException $e) {
        echo 'Error: ' . $e->getMessage();
    }
    

    (3)访问运行:

    至此,docker搭建lnmp环境大功告成!

    查看运行中容器列表:

    查看网络lnmp信息:

      上述实践中,我们将nginx的配置文件放在宿主主机上,然后通过映射nginx容器目录到宿主主机目录,让nginx使用宿主主机上的配置文件,这样做的好处是当nginx容器被删除时,配置文件中的更改不会丢失,以后创建的nginx容器可以继续使用这个配置文件。
      在实际项目中,我们应该把不希望随着容器删除而丢失的配置和数据都保存在宿主主机上,通过容器与宿主主机的目录映射来使用这些配置和数据,例如php的配置,以及mysql的配置,特别是mysql的数据库数据。
      将MySQL数据库数据保存在宿主主机的操作:首先运行mysql容器,然后将mysql容器的配置目录文件和数据目录文件都复制到宿主主机上,最后停止并删除正在运行的mysql容器,映射相应目录,重新创建并启动一个mysql容器。这样,即使mysql容器被删除了,mysql数据库的配置和数据还是不会丢失。

    docker container start mysql
    cd /usr/local/mysql
    docker cp mysql:/var/lib/mysql .
    mkdir data
    mv ./mysql/* ./data
    rmdir mysql
    docker cp mysql:/etc/mysql .
    mkdir etc
    mv ./mysql/* ./etc
    rmdir mysql
    docker stop mysql
    docker container rm mysql
    docker run --name mysql --network lnmp -p 3306:3306 -v /usr/local/mysql/data:/var/lib/mysql -v /usr/local/mysql/etc:/etc/mysql mysql:my-mysql
    

    参考:
    https://books.studygolang.com/docker_practice/
    https://www.cnblogs.com/justlikeheaven/p/11110671.html

  • 相关阅读:
    读《编写可维护的JavaScript》第七章总结
    读《编写可维护的JavaScript》第六章总结
    最新Blog
    cnUVA情况
    Casio普通计算器编程
    大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
    Pascal <-> C/C++ 转换简明教程
    [互动][扫盲]信息学奥林匹克竞赛是什么
    以后这个博客可能不会用啦 请到新地址...
    算法专题训练 搜索a-T3 Ni骑士(ni)
  • 原文地址:https://www.cnblogs.com/wujuntian/p/13095932.html
Copyright © 2020-2023  润新知