Docker 搭建 LNMP 环境
一:安装和启动 Docker
1、安装 Docker
Docker 的安装过程十分的简单:
Debian、Ubuntu 等操作系统:
mkdir ~/docker && cd ~/docker && sudo apt-get -y install docker.io
CentOS 等操作系统:
yum install -y yum-utils device-mapper-persistent-data lvm2 && yum-config-manager --add-repo https://mirrors.cloud.tencent.com/docker-ce/linux/centos/docker-ce.repo && yum install -y docker-ce docker-ce-cli containerd.io
注意:apt-get 命令适用于 deb 包管理式的 Linux 操作系统(Debian、Ubuntu等), CentOS请使用 yum 命令
执行docker 并查看状态
systemctl start docker && service docker status
完成后,您可以通过
docker version
来查看 Docker 的版本信息,
docker help
来查看 Docker 的帮助文档。
2、更换镜像源
Docker 工作的基础即是镜像。您可以认为一个镜像即是一个独立的由应用组成的虚拟机。为此,docker 建立了 Docker Hub 来存贮镜像(就像GitHub一样)。
但是由于网络原因, Docker Hub 的访问速度过慢,推荐您更换为国内的镜像源地址。这里我们采用 腾讯云 Docker 镜像加速,请输入下面的命令:
sudo su -
cat >> /etc/docker/daemon.json <<- EOF
{"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}
EOF
systemctl restart docker
exit
二:下载需要用到的 Docker 镜像
Docker 使用docker pull <镜像>
来完成镜像的下载工作,而我们本次实验需要使用到的镜像有。
- Nginx
- PHP
- PostgreSQL
您可以通过以下相关命令获取这几个软件的镜像。您也随时可以使用sudodocker image ls
来查看已下载的镜像。
1、下载 Nginx 镜像
运行以下命令:
sudo docker pull nginx:alpine
2、下载 PHP 镜像
运行以下命令:
sudo docker pull php:7-fpm-alpine
3、下载 PostgreSQL 镜像
您可能注意到了,我们使用 PostgreSQL 代替了 MySQL 。两者在使用上的差异并不大,但是从大小上看, PostgreSQL 更适合于容器化,因此我们选择了它。
可观看视频了解 PostgreSQL介绍
运行以下命令:
sudo docker pull postgres:alpine
三:启动 Nginx
本节的目的是为了让您尝试使用docker run
来启动容器(启动后的镜像即为容器)。此处只介绍其主要用法。
1、启动容器
您可以使用以下命令来启动容器:
sudo docker run --rm -d -p 80:80 --name nginx nginx:alpine
- 这个命令中涉及到的参数有:
--rm
:表示这个容器执行完后会被直接销毁(docker stop nginx之后,该容器被销毁)。--name
:指定这个容器的名称。-d
:表示这个容器会在后台运行。-p
:表示开放容器的80端口到主机的80端口。-v
:表示将nginx的配置文件挂载到容器的对应目录下。
- 如果您发现无法访问,请检查:
- 网址是否正确(网址后面不能接任何东西)
- 容器是否已启动
- 容器的80端口是否已开放
- 如果以上操作仍然未解决问题,请尝试重启。
2、停止容器
完成后您应该可以在对应的网址(http://175.178.122.115/,此处为服务器的IP地址
)上看到 Nginx 的默认欢迎界面了。
您可以使用以下命令来停止一个容器:
sudo docker stop <容器ID或容器名称>
容器ID就是您在运行上面那个命令时显示的一串字符,或者您可以使用
sudo docker container ls
来查看所有容器及其ID。
对于使用容器ID停止容器,您可以只输入前几个字符,Docker会自动匹配剩下的字符。
但是对于使用容器名称停止容器,您必须完整地输入容器名称。
例如:sudo docker stop 91b6
请尝试停止Nginx:
sudo docker stop nginx
3、挂载Nginx配置文件到宿主机
- 首先,运行一个Nginx容器
docker run -d -p 8080:80 --name nginx_demo nginx
- 将nginx1的配置文件复制到宿主机
mkdir -p /data/nginx1/{conf,html}
docker cp nginx_demo:/usr/share/nginx/html /data/nginx1
docker cp nginx_demo:/etc/nginx/nginx.conf /data/nginx1/conf/nginx.conf
docker cp nginx_demo:/etc/nginx/conf.d/default.conf /data/nginx1/conf/default.conf
docker cp nginx_demo:/var/log/nginx /data/nginx1
mv /data/nginx1/nginx /data/nginx1/logs //更改文件夹的名字,此处根据个人习惯,只要后面的挂载路径相匹配就行
- 运行新的Nginx容器,并挂载相应的目录
docker run -d -p 80:80 \
-v /data/nginx1/html:/usr/share/nginx/html \
-v /data/nginx1/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /data/nginx1/conf/default.conf:/etc/nginx/conf.d/default.conf \
-v /data/nginx1/logs:/var/log/nginx \
--name nginx_test1 nginx
此时,就可以直接在宿主机的 /data/nginx1目录下,修改ngnix_test1 容器的nginx配置信息。
可以启动
n
个nginx容器,命名nginx_testn ,并在宿主机的 /data/nginxn目录下存放相应容器的配置信息。
映射的端口不能重复
,否则创建失败
四:启动PHP
1、启动一个草稿 php (因为要去复制一些默认配置文件,如果有可省略)
docker run --rm --name php-test -p 9000:9000 -d php:7-fpm-alpine
2、创建存放 php 配置文件和日志的目录
mkdir /data/php/{conf,logs}
3、复制容器内的默认配置文件 #我只复制了这一份
docker cp php-test:/usr/local/etc/php/php.ini-production /data/php/conf/php.ini
4、创建 php 正式使用的容器
docker run -p 9000:9000 --name php \
-v /data/php7/conf:/usr/local/etc/php \
-v /data/php7/logs:/phplogs \
-v /data/nginx1/html:/usr/share/nginx/html \
-d php:7-fpm-alpine
-v /data/nginx1/html:/usr/share/nginx/html 这个配置一定要与Nginx的项目路径一致,否则会报 File Not Found 错误❌
5、注意:最大的坑就是上面的 File Not Found! Nginx明明访问 index.html(静态资源) 正常,访问不了 index.php。php 默认访问的 ip 不再是 127.0.0.1:9000 了!!!
docker inspect php
找到这个 IPAddress 的值,填入 nginx 的配置配件 default.conf
"IPAddress": "172.17.0.2"
location ~ \.php$ {root /usr/share/nginx/html;fastcgi_pass 172.17.0.2:9000;#这里的值改成之前查到的#fastcgi_pass php:9000;#或者容器名:9000 我好像没成功,应该是没配置网络组的问题fastcgi_index index.php;#fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;#这里用绝对路径fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;#或者用$document_root变量fastcgi_param SCRIPT_NAME $fastcgi_script_name;include fastcgi_params;}
然后重启 nginx
docker restart nginx
五:启动 LNMP
由于 LNMP 共由3个容器组成,单个启动过于麻烦,推荐您使用 docker-compose
管理并启动它们。
1、安装 docker-compose
docker-compose 是 Docker 的多个服务部署工具,以方便地同时启动多个容器。
您可以使用以下命令方便地安装它。
sudo apt-get install -y python-pip && sudo pip install docker-compose
2、创建 docker-compose 的配置文件
对于每一个您希望使用 docker-compose
来启动的项目,您都应该在 该项目的目录下
配置 docker-compose.yml
创建docker-compose.yml文件
touch ~/docker/docker-compose.yml
3、编辑 docker-compose 的配置文件
点击打开 docker-compose.yml
文件进行编辑,参考内容如下:
##docker-compose.yml
version: "3"
services:Nginx:image: nginx:alpineports:- 80:80volumes:- ./web:/usr/share/nginx/html:ro- ./nginx.conf:/etc/nginx/conf.d/default.conf:roPHP:image: undefined01/php:7-fpm-alpinevolumes:- ./web:/var/www/html:rwDatabase:image: postgres:alpineenvironment:POSTGRES_USER: "postgres"POSTGRES_PASSWORD: "rootroot"volumes:- ./data:/var/lib/postgresql/data:rw
记得保存!
保存方法:Windows 系统点击 ctrl+s
,Mac OS 点击 command+s
保存
- 这个配置文件中涉及到的参数有:
version
:表示这个配置文件使用第三套标准。services
:表示需要启动的服务(容器)列表。
- 对于每一个服务,又有:
image
:表示该服务使用的镜像。ports
:表示该服务开放的端口。volumes
:表示将某目录或文件挂载到容器的相应位置上,后面的ro、rw表示对于容器是否可读写。此处挂载了配置文件、数据库和网站代码。enviornment
:设置该容器的环境变量。此处通过环境变量的形式设置数据库的账号和密码。
4、创建 Nginx 的配置文件
创建nginx.conf文件
touch ~/docker/nginx.conf
5、编辑 Nginx 的配置文件
为了让 Nginx 能够将请求顺利的转交给 PHP 处理,我们需要更改 Nginx 的配置文件。
点击打开 nginx.conf 文件进行编辑,参考内容如下:
##nginx.conf
server {listen 80;server_name localhost;location / {root /usr/share/nginx/html;index index.php index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}location ~ \.php$ {fastcgi_pass PHP:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;include fastcgi_params;}
}
如何更改容器里的配置文件?
很简单,我们只需要在本地编辑好后挂载到容器中去(会覆盖容器中的文件),前面小节中预留的nginx.conf
就是为此。
如何让 Nginx 容器与 PHP 容器通讯?
您可能注意到了下面提供参考的 nginx.conf
里用到了PHP:9000
这样的地址。没错,对于由 docker-compose 启动的所有容器,都会自动加入由 docker 维护的局域网中,并且会自动为其他容器将某容器的名称(如 PHP )解析成相应的局域网IP。
6、使用 docker-compose 启动服务
使用以下命令来启动服务:
sudo docker-compose up -d
可以使用以下命令来查看启动服务:
sudo docker container ls
六:测试 LNMP 环境
编辑权限
以上命令都使用了root
权限,因此您如果想要修改其中的内容可能不太方便。您可以使用以下命令来获取编辑权限。
sudo chmod -R 777 ./data ./web
七:测试 PHP
1、创建index.php文件
touch ~/docker/web/index.php
2、编辑index.php文件
点击打开 web/index.php
进行编辑, 参考内容如下:
## index.php
<?php
phpinfo();
?>
如果一切顺利的话,您就可以在http://175.178.122.115/index.php (此处为服务器的IP地址
)看到 php 的相关信息了。
八:测试 PostgreSQL
您还记得密码吗?就在 docker-compose
中配置了。因此在实际环境中您一定要注意该文件的访问权限。
至于 PostgreSQL 数据库的地址嘛,就是这个容器的名称(此处是 Database )。您可以把它想象为一个域名就好了。
1、创建test.php文件
创建test.php文件
touch ~/docker/web/test.php
2、编辑test.php文件
点击打开 web/test.php
进行编辑, 参考内容如下:
##test.php
<?php
$dbconn = pg_connect('host=Database user=postgres password=rootroot') or die('Could not connect: ' . pg_last_error());
pg_query('CREATE TABLE IF NOT EXISTS test ( tester INT )');pg_query('INSERT INTO test VALUES (0)');
$res = pg_query('SELECT * FROM test') or die('Query failed: ' . pg_last_error());
$num = pg_num_rows($res);
echo "You have visited this site $num times";pg_free_result($res);
pg_close($dbconn);
?>
3、使用 docker-compose 停止服务
如果一切顺利的话,您就可以在http://175.178.122.115/test.php (此处为服务器的IP地址
)看到一个网页计数器。
不断刷新它试试看。
您可以使用以下命令来停止服务,它会自动销毁相应的容器:
sudo docker-compose down
用命令查看 docker 目录:
ls -la ~/docker
您的数据库已经保存在当前 docker
目录下的 data
文件夹中了,用命令查看:
ls -lf ./data
什么?销毁?别担心,迁移到任何一台新的主机,只需要将该目录打包带走就行了!
不信?您可以重新启动上面的示例,刷新 test.php 这个计数网页, 看看数据库是否被保存了下来。
Docker 搭建 LNMP 环境相关推荐
- docker搭建 LNMP 环境
一.准备镜像 安装完docker后,更换完镜像源(docker的安装十分简单自行百度即可) 打开/etc/docker目录下的daemon.json 添加以下内容 { "registry-m ...
- Docker - 搭建LNMP环境 - 学习/实践
1.应用场景 主要用于学习使用docker搭建开发环境. 学习容器化技术. 以及快速搭建开发环境, 同时保持团队之间开发/测试环境相同~~~~ 2.学习/操作 1.文档阅读 Docker - 学习/实 ...
- docker搭建lnmp环境
1.搭建lnmp网站平台 1.创建mysql数据库容器 docker run -it -d --name lnmp_mysql -p 3308:3306 -e MYSQL_ROOT_PASSWORD= ...
- docker搭建lnmp环境错误总结
1.SQLSTATE[HY000] [2002] Connection refused 方法一: 以上错误主要是对 Docker 容器的隔离机制理解不够,其实每个容器之间都是隔离的,如果有相互依赖的服 ...
- 用Docker构建LNMP环境(上)
利用docker搭建lnmp环境(上) 小知识: docker镜像运行之后变成容器(docker run) Registry 是Docker镜像的中央存储仓库(pull/push) https://g ...
- ubuntu通过apt-get方式搭建lnmp环境以及php扩展安装
v 一直是在用的lnmp的集成安装包搭建lnmp环境,因为工作需要需要安装ldap扩展,在网上怎么都找不到源码安装包,只能卸载掉原来的lnmp环境,用ubuntu的php5-ldap扩展, 在安装中遇 ...
- 安装虚拟机Ubuntu,搭建lnmp环境碰到的坑(二)
上一篇文章是基础的搭建ubuntu,安装好了之后就该搭建lnmp环境了,在此楼主也是第一次用nginx,如果有什么错误之后,请告知,万分感谢 搭建lnmp的一些基础命令在网上都可以查到,楼主只贴出自己 ...
- centos 6.5 搭建lnmp环境
centos 6.5 搭建lnmp环境 建议安装顺序: mysql------->>编译php---->>编译nginx 最麻烦:编译php出各种错. 最简单:mysql 软件 ...
- virtualbox php mac,详解mac下通过docker搭建LEMP环境
在mac下通过docker搭建LEMP环境境 1.安装virtualbox.由于docker是在lxc环境的容器 2.安装boot2docker,用于与docker客户端通讯 > brew up ...
最新文章
- 微生物预测年龄,皮肤比肠道更准确
- python 类-python 类如何使用
- 数据量庞大的分页穿梭框实现
- socket-tcp 、udp、rawIP
- mysql 查找配置文件 my.ini 位置方法
- Mysql介绍与安装LinuxmacOS系统
- python abc
- topjui.core.js
- 线性表的链式存储结构基本操作代码实现
- 关于WinPE安装操作系统
- KingbaseES和PostgreSQL兼容
- linux各种桌面系统图片,四大Linux图形界面赏析:KDE、Gnome、Xfce、LXDE
- Java的JVM,GC是什么?
- 学习编程需要什么英语基础?
- ipad iphone开发_如何从iPhone或iPad连接到Windows远程桌面
- IDEA设置中文/更改页面/IDEA字体大小颜色设置/IDEA注释取消斜体
- div设置行高后内容未垂直居中
- 抖音小程序实践一:申请初始化
- 狂神说 SpringBoot笔记
- fiddler连接IOS、Android、winphone,以及常见失败解决方法
热门文章
- 救急修复17款MacBook Pro键盘出现某些健按一下被识别成两下,然后打出2个字母的情况
- /includes/fckeditor/editor/filemanager/connectors/php/upload.php
- 研发首款高精度双频北斗芯片,「华大北斗」获数亿元人民币A轮融资
- Bootstrap Modal 从左侧和右侧滑入
- 推荐一本DeFi电子书:《How To DeFi》中文版
- 采集爆文,告诉你10W+背后隐藏的规律!
- IOS_Swift_字符串的处理
- 美国陆军:2045年20项新兴科技趋势报告
- PYTHON实现排赛程(淘汰制)
- 学习笔记_巴特沃斯型LPF设计_LC滤波