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