Docker

在建構時配置 PHP Apache Web 服務容器

  • August 27, 2021

我正在建構一個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 服務配置文件( ApachePHP等…)以獲得良好的可重現建構

我想出了一種方法來獲得對任何配置文件的完全訪問權限。

我從本教程中開發了關於數據庫容器配置和建構

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中。要解決任何問題,我需要能夠與原始配置文件進行比較。

沒有比這更簡單的了,將 COPY指令添加到您的 Dockerfile 中。

它看起來像這樣:

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

它將複製並覆蓋具有相同名稱的任何現有配置。

如果您想在建構映像之前測試配置,請將其安裝在容器的執行時。

引用自:https://serverfault.com/questions/1024606