我正在构建一个PHP Apache Web 服务 Docker 容器原型。
- 第一种也是最简单的方法是使用WordPress
发布的官方图片创建一个容器, 简单Dockerfile
如下:
FROM wordpress:latest
哪个构建但无法运行:
# docker run -it wordpress_local apache2-foreground
WordPress not found in /var/www/html - copying now...
Complete! WordPress has been successfully copied to /var/www/html
AH00534: apache2: Configuration error: No MPM loaded.
这是一个无法修复的已知错误。所以图像坏了。
其他类似的图像php7-apache2
也会产生相同的错误。
- 无法找到实际运行的预构建映像,我开始从头开始构建映像。它包含
- 高山 Linux 3.12
- 阿帕奇 2.4
- PHP 7.3
与Dockerfile
:
# cat Dockerfile
FROM alpine:3.12
RUN apk add apache2 php7 php7-apache2
ADD html/ /var/www/html/
WORKDIR /var/www/html/
CMD ["httpd", "-DNO_DETACH -DFOREGROUND -e debug"]
和一个docker-compose.yml
:
# cat docker-compose.yml
version: '3'
services:
web:
image: php_web_alpine
build: .
ports:
- "8081:8081"
这很好地构建:
# docker build -t php_web_alpine .
Sending build context to Docker daemon 7.68 kB
Step 1/5 : FROM alpine:3.12
---> a24bb4013296
Step 2/5 : RUN apk add apache2 php7 php7-apache2
---> Using cache
---> bf59e0c43f1f
Step 3/5 : ADD html/ /var/www/html/
---> 0fe4bfd871b2
Removing intermediate container cec9de242174
Step 4/5 : WORKDIR /var/www/html/
---> 03d3fe0a077f
Removing intermediate container b1763eb3e56b
Step 5/5 : CMD httpd -DNO_DETACH -DFOREGROUND -e debug
---> Running in 4ca69abc9f52
---> e3a33ae6e028
Removing intermediate container 4ca69abc9f52
Successfully built e3a33ae6e028
但是由于一个简单的配置错误而无法运行:
# docker-compose up
Recreating phpalpine_web_1 ... done
Attaching to phpalpine_web_1
web_1 | AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.20.0.2. Set the 'ServerName' directive globally to suppress this message
phpalpine_web_1 exited with code 0
它只需要httpd.conf
用正确的值填充配置文件。
那么,如何在构建时填写 Web 服务配置文件( Apache和PHP等...)以获得良好的可重现构建?
没有比这更简单的了,将 COPY指令添加到您的 Dockerfile 中。
它看起来像这样:
它将复制并覆盖具有相同名称的任何现有配置。
如果您想在构建映像之前测试配置,请将其安装在容器的运行时。
我想出了一种方法来获得对任何配置文件的完全访问权限。
我从本教程中开发了关于数据库容器配置和构建
MySQL 容器构建和配置的解决方案
以及来自官方文档:
Docker Volumes Configuration and Usage
这是一个多步骤过程,但仅在原始配置文件更改时才需要完成。该概念包括在容器构建时导出和重新导入已配置的配置文件。
(重要的是
:Z
能够在那里导出任何内容)Dockerfile
构建完全配置的 Web 服务器容器中.save
现在我可以启动它并且它运行顺利:
我发现 Web 服务器已启动并正在运行:
讨论:
配置文件和包布局因分发而异。我可能没有正确的,因此服务的配置可能与预期不符。
在构建时,包可能会更新,并且某些更新可能会更改配置中的某些内容,因为它经常发生在MySQL / MariaDB中。要解决任何问题,我需要能够与原始配置文件进行比较。