Docker搭建LNMP环境

Posted wujuntian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Docker搭建LNMP环境的主要内容,如果未能解决你的问题,请参考以下文章

Mac下docker搭建lnmp环境 + redis + elasticsearch

docker搭建lnmp环境

docker搭建 LNMP 环境

docker搭建lnmp环境

docker搭建自己的Lnmp环境+宝塔

docker部署lnmp环境搭建php项目