AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1024606
Accepted
Bodo Hugo Barwich
Bodo Hugo Barwich
Asked: 2020-07-10 01:53:59 +0800 CST2020-07-10 01:53:59 +0800 CST 2020-07-10 01:53:59 +0800 CST

在构建时配置 PHP Apache Web 服务容器

  • 772

我正在构建一个PHP Apache Web 服务 Docker 容器原型。

  1. 第一种也是最简单的方法是使用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也会产生相同的错误。

  1. 无法找到实际运行的预构建映像,我开始从头开始构建映像。它包含
  • 高山 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等...)以获得良好的可重现构建?

configuration docker alpine
  • 2 2 个回答
  • 5119 Views

2 个回答

  • Voted
  1. AtomiX84
    2020-07-11T07:53:05+08:002020-07-11T07:53:05+08:00

    没有比这更简单的了,将 COPY指令添加到您的 Dockerfile 中。

    它看起来像这样:

    COPY MyWebConf.conf /etc/apache2/sites-enabled/
    

    它将复制并覆盖具有相同名称的任何现有配置。

    如果您想在构建映像之前测试配置,请将其安装在容器的运行时。

    • 0
  2. Best Answer
    Bodo Hugo Barwich
    2020-07-14T06:35:50+08:002020-07-14T06:35:50+08:00

    我想出了一种方法来获得对任何配置文件的完全访问权限。

    我从本教程中开发了关于数据库容器配置和构建
    MySQL 容器构建和配置的解决方案

    以及来自官方文档:
    Docker Volumes Configuration and Usage

    这是一个多步骤过程,但仅在原始配置文件更改时才需要完成。该概念包括在容器构建时导出和重新导入已配置的配置文件。

    1. 我创建了一个将原始配置文件导出到的本地目录。
        $ mkdir config
        $ mkdir uploads/config -p
        $ vi Dockerfile
        RUN mkdir /home/uploads
        VOLUME /home/uploads
    
    1. 要访问图像,我启动它将本地目录安装到卷安装点
      (重要的是:Z能够在那里导出任何内容)
        # docker run  -it --entrypoint sh -v /absolute/path/uploads:/home/uploads:Z php_web_alpine
    
    1. 现在我可以访问配置目录并将我需要编辑的任何文件复制到导出目录
    /var/www/html # cd /etc/ap*
    /etc/apache2 # pwd
    /etc/apache2
    /etc/apache2 # ls -lah
    total 188K   
    drwxr-xr-x    1 root     root        4.0K Jul  7 11:30 .
    drwxr-xr-x    1 root     root          62 Jul  7 11:33 ..
    drwxr-xr-x    2 root     root        4.0K Jul  7 11:30 conf.d
    -rw-r--r--    1 root     root       17.3K Jul  7 11:30 httpd.conf
    -rw-r--r--    1 root     root       17.4K Apr  1 18:18 httpd.conf.save
    -rw-r--r--    1 root     root       17.4K Jul  7 11:30 httpd.conf.setup.1
    -rw-r--r--    1 root     root       17.3K Jul  7 11:30 httpd.conf.setup.2
    -rw-r--r--    1 root     root       17.3K Jul  7 11:30 httpd.conf.setup.3
    -rw-r--r--    1 root     root       12.8K Apr  1 18:18 magic
    -rw-r--r--    1 root     root       59.4K Apr  1 18:18 mime.types
    /etc/apache2 # cp httpd.conf /home/uploads/config/apache/
    /etc/apache2 # cd conf.d
    /etc/apache2/conf.d # ls -lah
    total 40K    
    drwxr-xr-x    2 root     root        4.0K Jul  7 11:30 .
    drwxr-xr-x    1 root     root        4.0K Jul  7 11:30 ..
    -rw-r--r--    1 root     root        2.2K Apr  1 18:18 default.conf
    -rw-r--r--    1 root     root        1.2K Apr  1 18:18 info.conf
    -rw-r--r--    1 root     root        5.0K Apr  1 18:18 languages.conf
    -rw-r--r--    1 root     root        4.3K Apr  1 18:18 mpm.conf
    -rw-r--r--    1 root     root         378 Jun 12 12:27 php7-module.conf
    -rw-r--r--    1 root     root         732 Apr  1 18:18 userdir.conf
    /etc/apache2/conf.d # cp mpm.conf /home/uploads/config/apache/
    /var/www/html # cd /etc/php7
    /etc/php7 # pwd
    /etc/php7
    /etc/php7 # mkdir /home/uploads/config/php/
    /etc/php7 # cp php.ini /home/uploads/config/php/
    /etc/apache2 # exit
    
    1. 导出后,我从本地目录中的映像中找到配置文件,并且可以将它们移动到容器构建的配置目录
    # cd config
    # pwd
    /apsolute/path/uploads/config
    # ls -lah apache
    insgesamt 28K
    drwxr-xr-x. 2 user_name user_group   38 jul  7 12:45 .
    drwxr-xr-x. 3 user_name user_group   19 jul  7 12:25 ..
    -rw-r--r--. 1 root  root    18K jul  7 12:45 httpd.conf
    -rw-r--r--. 1 root  root   4,4K jul  7 12:45 mpm.conf
    # ls -lah php
    insgesamt 72K
    drwxr-xr-x. 2 root  root    20 jul  7 13:32 .
    drwxr-xr-x. 4 user_name user_group  29 jul  7 13:33 ..
    -rw-r--r--. 1 root  root   70K jul  7 13:32 php.ini
    # mv apache ../../config/
    # mv php ../../config/
    # cd ../../config/
    
    1. 现在我可以完全、轻松、自然地编辑配置文件。
    2. 我将配置的配置文件包含在Dockerfile构建完全配置的 Web 服务器容器中
    • 请记住,配置文件会随着时间而改变,我将避免在没有保存副本的情况下破坏原始文件。带有扩展的漂亮RPM风格.save
    $ vi Dockerfile
    COPY config/apache/httpd.conf /etc/apache2/httpd.conf.setup
    COPY config/apache/mpm.conf /etc/apache2/conf.d/mpm.conf.setup
    COPY config/php/php.ini /etc/php7/php.ini.setup
    RUN cd /etc/apache2\
      && mv httpd.conf httpd.conf.save\
      && cp -f httpd.conf.setup httpd.conf
    RUN cd /etc/apache2/conf.d\
      && mv mpm.conf mpm.conf.save\
      && cp -f mpm.conf.setup mpm.conf
    RUN cd /etc/php7\
      && mv php.ini php.ini.save\
      && cp -f php.ini.setup php.ini
    
    1. 现在我可以节省地构建容器
    # docker build -t php_web_alpine .
    Sending build context to Docker daemon 122.9 kB
    Step 1/12 : FROM alpine:3.12
     ---> a24bb4013296
    Step 2/12 : RUN apk add apache2 php7 php7-apache2
     ---> Using cache
     ---> bf59e0c43f1f
    Step 3/12 : COPY MyWeb.conf /etc/apache2/sites-enabled/
     ---> Using cache
     ---> f38a0d067fdd
    Step 4/12 : COPY config/apache/httpd.conf /etc/apache2/httpd.conf.setup
     ---> d29e5b94e1ab
    Removing intermediate container 9efaed4b5da5
    Step 5/12 : COPY config/apache/mpm.conf /etc/apache2/conf.d/mpm.conf.setup
     ---> 286100656541
    Removing intermediate container 2cc1ebac920a
    Step 6/12 : COPY config/php/php.ini /etc/php7/php.ini.setup
     ---> cb12fe5aa008
    Removing intermediate container 7dd9bde72996
    Step 7/12 : RUN cd /etc/apache2  && mv httpd.conf httpd.conf.save  && cp -f httpd.conf.setup httpd.conf
     ---> Running in d29ed8f6c3a1
    
     ---> dc1dcbc6adf6
    Removing intermediate container d29ed8f6c3a1
    Step 8/12 : RUN cd /etc/apache2/conf.d  && mv mpm.conf mpm.conf.save  && cp -f mpm.conf.setup mpm.conf
     ---> Running in 1667394701de
    
     ---> ecf4b961add4
    Removing intermediate container 1667394701de
    Step 9/12 : RUN cd /etc/php7  && mv php.ini php.ini.save  && cp -f php.ini.setup php.ini
     ---> Running in 55502cdfc2da
    
     ---> c32bfcb13c4a
    Removing intermediate container 55502cdfc2da
    Step 10/12 : ADD html/ /var/www/html/
     ---> c458eec870e2
    Removing intermediate container 2359ebc7b630
    Step 11/12 : WORKDIR /var/www/html/
     ---> 56790c506e0d
    Removing intermediate container ef739299fb95
    Step 12/12 : ENTRYPOINT httpd -DNO_DETACH -DFOREGROUND -e info
     ---> Running in cb6d5ff8b90c
     ---> e2abe6e4091a
    Removing intermediate container cb6d5ff8b90c
    Successfully built e2abe6e4091a
    

    现在我可以启动它并且它运行顺利:

    # docker-compose up -d
    Recreating phpalpine_web_1 ... done
    # docker-compose ps
            Name               Command                         State     Ports         
    ---------------------------------------------------------------------------------------
    phpalpine_web_1            httpd -DNO_DETACH -DFOREGR ...   Up      0.0.0.0:8081->8081/tcp
    

    我发现 Web 服务器已启动并正在运行:

    # netstat -lpn|grep -i :80
    tcp6       0      0 :::8081                 :::*                    LISTEN      31528/docker-proxy- 
    # wget -S -O - "http://localhost:8081"
    --2020-07-13 15:43:55--  http://localhost:8081/
    Resolving localhost (localhost)... ::1, 127.0.0.1
    Connecting to localhost (localhost)|::1|:8081... connected.
    HTTP request sent, awaiting response... 
      HTTP/1.1 200 OK
      Date: Mon, 13 Jul 2020 14:43:55 GMT
      Server: Apache/2.4.43 (Unix)
      X-Powered-By: PHP/7.3.19
      Content-Length: 0
      Keep-Alive: timeout=5, max=100
      Connection: Keep-Alive
      Content-Type: text/html; charset=UTF-8
    Length: 0 [text/html]
    Saving to: ‘STDOUT’
    
        [ <=>                                                       ] 0           --.-K/s   in 0s      
    
    2020-07-13 15:43:55 (0,00 B/s) - written to stdout [0/0]
    

    讨论:

    • 为什么要导出原始配置文件?
      配置文件和包布局因分发而异。我可能没有正确的,因此服务的配置可能与预期不符。
    • 为什么要在构建时保留原始配置文件?
      在构建时,包可能会更新,并且某些更新可能会更改配置中的某些内容,因为它经常发生在MySQL / MariaDB中。要解决任何问题,我需要能够与原始配置文件进行比较。
    • 0

相关问题

  • 小型企业的服务器虚拟化/RAID 配置

  • httpd.conf 用于不区分大小写的文件服务

  • Windows Server 2003 DNS 添加的 CNAME 不起作用

  • 我应该使用什么策略在 linux 上安装 smtp 服务器?用于多线程服务

  • 为什么我的站点在配置为直通身份验证时使用 IUSR 帐户?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve