Docker开发。 当地环境。 第2部分-Nginx + PHP + MySql + phpMyAdmin

为了更好地理解以下材料,建议您首先阅读上一篇文章

考虑一个开发由一系列Nginx + PHP + MySql + phpMyAdmin组成的本地环境的示例。 该捆绑包非常受欢迎,可以满足普通开发人员的许多标准需求。

与上一篇文章一样,重点将转向docker-compose实用程序,而不是最纯粹形式的docker。

所以走吧!

让我们从docker-compose.yml开始,它在一个单独的代理文件夹中:

用于nginx代理的docker-compose.yml
version: '3.0' services: proxy: image: jwilder/nginx-proxy ports: - 80:80 volumes: - /var/run/docker.sock:/tmp/docker.sock:ro networks: - proxy networks: proxy: driver: bridge 


呈现的文件描述了基于以下映像使用名称代理创建一个容器的配置:jwilder / nginx-proxy映像并创建具有相同名称的网络。 networks指令指示容器连接到哪个网络,在此示例中,这是我们的代理网络。

创建网络时,可以省略driver:bridge指令。 桥驱动程序是默认驱动程序。 该容器将通过网络与其他容器通信。

jwilder / nginx-proxy图像是基本图像,它已被使用,并且Docker Hub还提供了相当广泛和详细的使用说明。 nginx-proxy的操作原理非常简单:它通过转发的docker套接字访问有关正在运行的容器的信息,分析名称为VIRTUAL_HOST的环境变量的存在,并将请求从指定主机重定向到设置了给定环境变量的容器。

我们使用已知的docker-compose up -d命令启动代理,我们观察到以下输出:

 Creating network "proxy_proxy" with driver "bridge" Creating proxy_proxy_1 ... done 

这个结论告诉我们,一开始创建了proxy_proxy网络,然后创建了proxy_proxy_1容器。 网络名称是从docker-compose.yml文件所在的文件夹的名称获得的,我有一个代理,并且网络名称相同。

如果输入docker network ls命令 ,我们将在系统中看到一个docker网络列表,其中一个应该是proxy_proxy。

容器名称的建立与文件夹名称加上服务名称和编号的原则相同,这使得名称相似的容器不会重复。 使用container_name指令,可以显式指定容器的名称,但是我发现这是一个非常无用的功能。 在以下文章中将对此进行更详细的讨论。

使用以下内容创建第二个docker-compose.yml:

docker-compose.yml用于其他服务
 version: '3.0' services: nginx: image: nginx environment: - VIRTUAL_HOST=site.local depends_on: - php volumes: - ./docker/nginx/conf.d/default.nginx:/etc/nginx/conf.d/default.conf - ./html/:/var/www/html/ networks: - frontend - backend php: build: context: ./docker/php volumes: - ./docker/php/php.ini:/usr/local/etc/php/php.ini - ./html/:/var/www/html/ networks: - backend mysql: image: mysql:5.7 volumes: - ./docker/mysql/data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: root networks: - backend phpmyadmin: image: phpmyadmin/phpmyadmin:latest environment: - VIRTUAL_HOST=phpmyadmin.local - PMA_HOST=mysql - PMA_USER=root - PMA_PASSWORD=root networks: - frontend - backend networks: frontend: external: name: proxy_proxy backend: 


这里宣布什么?

列出了四个服务:nginx,php,mysql和phpmyadmin。 和两个网络。 一个称为前端的代理网络被公告为外部网络和新的内部后端网络。 没有指定它的驱动程序,如我之前所写,将使用网桥类型的默认驱动程序。

Nginx的


这里的一切都应该清楚。 我们将基本映像与docker hub一起使用。 环境变量是代理工作所必需的,并告诉它容器应可访问的地址。 depends_on选项指示此容器对php容器的依赖性。 这意味着将先启动php容器,然后再启动依赖它的nginx容器。 接下来,我们转发nginx的配置。 它将降低一点并使用html挂载文件夹。 我们还注意到该容器可以一次访问两个网络。 它必须同时通信来自前端网络的代理和来自后端网络的php。 原则上,可以将所有容器都推入一个前端,然后将其推入一个网络,但是我坚持认为这样的分隔更为正确。

default.nginx
 server { listen 80; server_name_in_redirect off; access_log /var/log/nginx/host.access.log main; root /var/www/html/; location / { try_files $uri /index.php$is_args$args; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } location ~ /\.ht { deny all; } } 


default.nginx是nginx的配置,转发到容器。 这里的关键点是fastcgi_pass php指令:9000 。 它设置FastCGI服务器的地址。 该地址可以指定为域名或IP地址和端口。

php:9000-服务的名称是FastCGI服务器的地址。 Nginx访问php将获得运行php的容器的IP地址。 端口9000是标准端口,在创建基本容器时声明。 该端口可用于网络上的nginx,但由于未转发,因此在主机上不可用。

的PHP


没有显示图像是不寻常的。 相反,它直接从撰写文件构建自己的映像。 context指令指向Dockerfile所在的文件夹。

Docker文件
 FROM php:7.3.2-fpm RUN apt-get update && apt-get install -y \ libzip-dev \ zip \ && docker-php-ext-configure zip --with-libzip \ && docker-php-ext-install zip \ && docker-php-ext-install mysqli COPY --from=composer:latest /usr/bin/composer /usr/bin/composer WORKDIR /var/www/html 


Dockerfile声明该构建使用基本的php映像:7.3.2-fpm,然后运行用于安装php扩展的命令。 接下来,从另一个基本映像复制composer,并设置项目的工作目录。 我将在其他帖子中更详细地讨论组装问题。

同样,带有我们项目的php.ini文件和html文件夹也被抛出到容器内。

请注意,php位于后端网络上,例如,代理无法再访问它。

MySQL的


基本mysql映像是使用5.7标记获取的,该标记负责mysql版本。 ./docker/mysql/data文件夹用于存储数据库文件(您甚至不需要创建它,它是在启动时创建的)。 并通过环境变量为root用户(也为root)设置密码。

该数据库位于后端网络上,因此可以与php保持联系。 基本映像使用标准端口3306。它在docker网络上可用于php,但在主机上不可用。 如果转发该端口,则可以例如从同一PHPSTORM连接到该端口。 但是,如果phpmyadmin界面足以满足您的需求,那么您将无法做到这一点。

phpmyadmin


phpmyadmin的官方图片。 环境变量使用VIRTUAL_HOST与代理进行交互,类似于nginx。 PMA_USER和PMA_PASSWORD访问数据库。 和PMA_HOST主机数据库本身。 但这不是localhost(通常是这样),而是mysql。 即 与数据库的通信可通过其服务名称进行,即 MySQL的。 phpmyadmin容器可以与数据库通信,因为它具有到前端网络的连接。

我们使用常用命令启动服务:docker-compose -d。

我们看到以下输出:

服务启动
 Creating network "lesson2_backend" with the default driver Building php Step 1/4 : FROM php:7.3.2-fpm ---> 9343626a0f09 Step 2/4 : RUN apt-get update && apt-get install -y libzip-dev zip && docker-php-ext-configure zip --with-libzip && docker-php-ext-install zip && docker-php-ext-install mysqli ---> Using cache ---> 5e4687b5381f Step 3/4 : COPY --from=composer:latest /usr/bin/composer /usr/bin/composer ---> Using cache ---> 81b9c665be08 Step 4/4 : WORKDIR /var/www/html ---> Using cache ---> 3fe8397e92e6 Successfully built 3fe8397e92e6 Successfully tagged lesson2_php:latest Pulling mysql (mysql:5.7)... 5.7: Pulling from library/mysql fc7181108d40: Already exists 787a24c80112: Already exists a08cb039d3cd: Already exists 4f7d35eb5394: Already exists 5aa21f895d95: Already exists a742e211b7a2: Already exists 0163805ad937: Already exists 62d0ebcbfc71: Pull complete 559856d01c93: Pull complete c849d5f46e83: Pull complete f114c210789a: Pull complete Digest: sha256:c3594c6528b31c6222ba426d836600abd45f554d078ef661d3c882604c70ad0a Status: Downloaded newer image for mysql:5.7 Creating lesson2_php_1 ... done Creating lesson2_mysql_1 ... done Creating lesson2_phpmyadmin_1 ... done Creating lesson2_nginx_1 ... done 


我们看到,在开始时创建了lesson2_backend网络,然后组装了php映像,然后可以下载系统中尚未存在的映像(拉出),并且实际上启动了所描述的服务。

最后的修改,以便一切正常,此添加到主机或sites.local和phpmyadmin.local域。

index.php的内容可能如下:

index.php
 <?php //phpinfo(); $link = mysqli_connect('mysql', 'root', 'root'); if (!$link) { die(' : ' . mysqli_error()); } echo ' '; mysqli_close($link); 


在这里,我们检查php扩展名-mysqli(在Dockerfile的汇编过程中添加)的连接是否正确。

并注意,对于与容器的连接,将使用服务的名称-mysql。

整个项目的结构如下:

项目结构
 habr/lesson2$ tree . ├── docker │ ├── mysql │ │ └── data │ ├── nginx │ │ └── conf.d │ │ └── default.nginx │ └── php │ ├── Dockerfile │ └── php.ini ├── docker-compose.yml ├── html │ └── index.php └── proxy └── docker-compose.yml 

Source: https://habr.com/ru/post/zh-CN460173/


All Articles