如何在Docker上设置LEMP堆栈

时间:2020-03-05 15:25:26  来源:igfitidea点击:

在本教程中,我们将在Docker内设置LEMP堆栈。
我们可以在几分钟内轻松拉动和设置Docker内的LEMP图像。
但是为了更好地了解堆栈,我们将逐个设置nginx,mysql,php/phpmyadmin的每个图像。
一旦掌握了Docker中LEMP堆栈的核心思想,我们就可以尝试将堆栈设置为单个图像。

要在Docker中安装/设置LEMP,我们需要首先安装Docker和Docker。
执行以下命令以安装这两个。

root@demohost:~# apt-get install docker docker-compose

启动Docker服务

root@demohost:~# service docker start

文件夹设置

我们将为LEMP堆栈使用以下文件夹结构。

  • 由名称lemp-docker创建一个根目录和一个文件docker-compose.yml
  • 对于nginx日志,在LEMP-Docker内的名称"日志"创建目录,并在日志目录中创建两个文件nginx-access.log和nginx-error.log。
  • 对于nginx配置文件,通过LEMP-Docker内部的名称"站点可用"创建目录并创建默认配置文件。
  • 最后,PHP文件由LEMP-Docker中的名称uply_html创建一个目录。我们将在稍后阶段放置在此目录中的PHP文件。

所以我们的目录结构看起来像以下 -

LEMP-Docker /├──Docker组成。
yml├──日志│├──nginx-access。
日志│└──nginx-error。
log├──public_html│└──索引。
PHP└──可用└──默认

让我们快速创建上面的目录结构和文件。

root@demohost:~# cd ~
root@demohost:~# mkdir LEMP-Docker
root@demohost:~# cd LEMP-Docker/
root@demohost:~/LEMP-Docker# mkdir logs
root@demohost:~/LEMP-Docker# touch logs/nginx-access.log logs/nginx-error.log
root@demohost:~/LEMP-Docker# mkdir sites-available
root@demohost:~/LEMP-Docker# touch sites-available/default
root@demohost:~/LEMP-Docker# mkdir public_html
root@demohost:~/LEMP-Docker# touch docker-compose.yml

接下来,我们将编辑nginx默认配置"默认值"并添加以下内容。
在server_name指令中,放置Docker的IP地址。
要找到它使用命令$ifconfig并查找行inet addr:在行Docker中*

root@demohost:~/LEMP-Docker# vi sites-available/default
server {
listen  80;
# this path MUST be exactly as docker-compose.fpm.volumes,
# even if it doesn't exists in this dock.
root /usr/share/nginx/html;
index index.html;
server_name 172.17.0.1;
location/{
try_files $uri /index.html$is_args$args;
}
}

安装nginx.

要设置nginx容器,我们将在Docker-Compose中添加以下内容。
yml文件

root@demohost:~/LEMP-Docker# vi docker-compose.yml
nginx:
image: tutum/nginx
ports:
- "80:80"
volumes:
- ./sites-available/default:/etc/nginx/sites-available/default
- ./sites-available/default:/etc/nginx/sites-enabled/default
- ./logs/nginx-error.log:/var/log/nginx/error.log
- ./logs/nginx-access.log:/var/log/nginx/access.log

上面的Docker组合。
YML将从Tutum/nginx和代理端口80从容器中拉出Nginx图像,以送达Docker主机的端口80。
然后,我们将从nginx/default目录挂载默认的nginx配置文件到可用的站点和启用位站点的nginx容器文件夹。
Similary我们将链接日志/*。
从Docker主机记录以在容器内记录。

现在从CWD中,运行以下命令才能提取并创建nginx容器。

root@demohost:~/LEMP-Docker# docker-compose up -d
Pulling nginx (tutum/nginx:latest)...
latest: Pulling from tutum/nginx
faecf96fd5ab: Pull complete
995977506e98: Pull complete
------------------------
------------------------
Digest: sha256:69a727916ab40de88f66407fb0115e35b759d7c6088852d901208479bec47429
Status: Downloaded newer image for tutum/nginx:latest
------------------------

要检查实际创建nginx容器,请执行以下命令。

root@demohost:~/LEMP-Docker# docker ps

要在NGINX容器中创建隧道并获取Bash shell,请使用以下命令。

root@demohost:~/LEMP-Docker# docker exec -i -t 75088fe8fe60 bash

现在找到nginx进程

root@75088fe8fe60:/# ps -aux | grep NGINX
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.6  85892  6572 ?        Ss   07:13   0:00 nginx: master process /usr/sbin/nginx
www-data     6  0.0  0.3  86212  3428 ?        S    07:13   0:00 nginx: worker process
www-data     7  0.0  0.3  86212  3428 ?        S    07:13   0:00 nginx: worker process
www-data     8  0.0  0.3  86212  3428 ?        S    07:13   0:00 nginx: worker process
www-data     9  0.0  0.3  86212  3428 ?        S    07:13   0:00 nginx: worker process

退出nginx容器bash shell

root@75088fe8fe60:/#exit

最后打开我们喜欢的浏览器,将其指向http://<doocker_host_ip>。
我们将以下面的纽金克斯欢迎页面接受迎接。

停止并卸下容器的时间。

root@demohost:~/LEMP-Docker# docker stop 75088fe8fe60
root@demohost:~/LEMP-Docker# docker rm 75088fe8fe60

安装PHP/FPM

为了使用NGINX的PHP,我们需要使用FPM模块的PHP。
因此,我们将编辑Docker-Compose。
yml并选择图像php:fpm指定fpm的端口,它是9000,并将docker主机的public_html目录安装到/usr/share/nginx/html目录的php-fpm容器

phpfpm:
image: php:fpm
ports:
- "9000:9000"
volumes:
- ./public_html:/usr/share/nginx/html

我们将在后台启动容器并使它们使用以下命令离开它们。

root@demohost:~/LEMP-Docker# docker-compose up -d
Pulling phpfpm (php:fpm)...
fpm: Pulling from library/php
75a822cd7888: Pull complete
e4d8a4e038be: Pull complete
----------------------------
----------------------------
Digest: sha256:01d1d6345bc30f206fb048c5f1afa882f17f54f275ffe7fd5a83524d8294bc79
Status: Downloaded newer image for php:fpm
----------------------------

使用以下命令检查运行容器,PHP-FPM在端口9000中运行并映射到Docker主机的端口9000。

root@demohost:~/LEMP-Docker# docker ps -a

将隧道创建到PHP-FPM容器中并获取BASH Shell,使用以下命令。

root@demohost:~/LEMP-Docker# docker exec -i -t 841f20b8e7e3 bash

使用以下命令检查容器内的进程。

root@95dec1e1eb47:/var/www/html# ps -aux

一旦我们确定正在运行PHP-FPM容器,我们将修改默认的nginx配置文件,以便它可以处理PHP文件。
在Location/{}部分后,在文件站点中的可用/默认部分添加以下部分。

location ~ \.php${
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 172.17.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

所以我们的最终NGINX默认配置文件如下所示 -

接下来创建文件索引。
PHP INSION PUBLIC_HTML并添加以下并重新启动PHP-FPM Docker。

root@demohost:~/public_html# vi index.php
<?php
echo phpinfo();
?>

重新启动PHP-FPM容器。

root@demohost:~/public_html# docker restart lempdocker_phpfpm_1

将浏览器指向http://<docker-host-ip>/index。
PHP,将显示PHPINFO页面

安装mysql/phpmyadmin

在最后一步中,我们将在Docker主机内设置MySQL和PHPMyAdmin容器。
编辑文件Docker撰写。
yml并添加以下部分

mysql:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: password
phpmyadmin:
image: corbinu/docker-phpmyadmin
restart: always
links:
- mysql:mysql
ports:
- 8183:80
environment:
MYSQL_USERNAME: root
MYSQL_ROOT_PASSWORD: password

在MySQL部分中,我们将获取MariaDB图像并将环境变量调用mysql_root_password传递给图像。
图像将在构造MySQL容器时将此值作为密码。
在PHPMyAdmin部分中,从Corbinu/Docker-PhpMyAdmin获取图像并使用MySQL Container的MySQL数据库链接此容器。
Docker主机端口NO 8183将是容器端口80的代理(nginx)。
将PHPMyAdmin的用户名的环境设置为root和密码作为"密码"。

启动背景中的容器,并使它们使用以下命令运行。
在执行以下命令之前,不要忘记停止运行容器。

root@demohost:~/LEMP-Docker# docker-compose up -d
------------------------
Pulling mysql (mariadb:latest)...
latest: Pulling from library/mariadb
75a822cd7888: Already exists
b8d5846e536a: Pull complete
-----------------------
-----------------------
Digest: sha256:0ce9f13b5c5d235397252570acd0286a0a03472a22b7f0384fce09e65c680d13
Status: Downloaded newer image for mariadb:latest
-----------------------
Pulling phpmyadmin (corbinu/docker-phpmyadmin:latest)...
latest: Pulling from corbinu/docker-phpmyadmin
04c460fac791: Pull complete
0a0916b29f3e: Pull complete
b25f4e7a7766: Pull complete
----------------------------
----------------------------
44f124587a1d: Pull complete
Digest: sha256:8ba64f73a8f28f62c00c9515171361b9d5f7a0c6f6fa0aa4418839f9974d098d
Status: Downloaded newer image for corbinu/docker-phpmyadmin:latest
----------------------------

现在列出带有以下Docker命令的所有运行容器。

root@demohost:~/LEMP-Docker# docker ps -a

在MySQL容器中创建隧道,然后通过传递用户名和密码获取MySQL shell

root@demohost:~/LEMP-Docker# docker exec -i -t f63eadc48545 mysql -u root -ppassword
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.1.20-MariaDB-1~jessie mariadb.org binary distribution
Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

要获取PHPMYADMIN登录页面,将浏览器指向http://<docker_host_ip>:8183 /类型用户名作为root和密码作为密码,我们将被重定向到phpmyadmin的主页。

让我们现在尝试快速了解堆栈内的流程。
nginx的IP地址设置为Docker主机,默认配置将Web Root设置为/usr/share/nginx/html。
除此之外,CONFIC还从Docker主机安装卷,该卷包括来自Sites_Available的文件和日志目录到容器文件系统的/etc/nginx /站点 - /var/log/nginx目录中的卷:docker-compose的部分。
yml。
(nginx部分)。
Docker。
撰写。
YML还设置Nginx以通过PHP-FPM模块来了解PHP,并定义PHP源文件的基本路径是Public_html目录(PHP-FPM部分)。
MySQL将使用其默认端口3306并链接到nginx服务器,以便PHP应用程序知道其中建立数据库连接。
可以通过Docker主机的端口NO 8083访问PHPMyAdmin,该端口映射到容器的端口NO 80。
MySQL和PHPMyAdmin之间的链接是在将数据库名称为MySQL(MySQL:MySQL)的链接部分中完成的。

我们将LEMP堆栈作为容器安装为容器。
该过程有点耗时。
一旦我们对现在完成的设置有信心,那么我们可以从单个图像安装Docker堆栈。
查看DockerHub以探索所有图像。

要执行此操作,请使用终端的以下命令。

root@demohost:~ docker search LEMP
root@demohost:~ docker pull <IMAGE-Name>

然后使用Docker Run命令传递所需的所有参数/配置,在容器内部的LEMP堆栈将在几分钟内完成。