Docker
在建構時配置 PHP Apache Web 服務容器
我正在建構一個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等…)以獲得良好的可重現建構?
我想出了一種方法來獲得對任何配置文件的完全訪問權限。
我從本教程中開發了關於數據庫容器配置和建構
以及來自官方文件:
Docker Volumes Configuration and Usage
這是一個多步驟過程,但僅在原始配置文件更改時才需要完成。該概念包括在容器建構時****導出和重新導入已配置的配置文件。
- 我創建了一個將原始配置文件導出到的本地目錄。
$ mkdir config $ mkdir uploads/config -p $ vi Dockerfile RUN mkdir /home/uploads VOLUME /home/uploads
- 要訪問圖像,我啟動它將本地目錄安裝到卷安裝點
(重要的是
:Z
能夠在那裡導出任何內容)# docker run -it --entrypoint sh -v /absolute/path/uploads:/home/uploads:Z php_web_alpine
- 現在我可以訪問配置目錄並將我需要編輯的任何文件複製到導出目錄
/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
- 導出後,我從本地目錄中的映像中找到配置文件,並可以將它們移動到容器建構的配置目錄
# 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/
- 現在我可以完全、輕鬆、自然地編輯配置文件。
- 我將配置的配置文件包含在
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
- 現在我可以節省地建構容器
# 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/
它將複製並覆蓋具有相同名稱的任何現有配置。
如果您想在建構映像之前測試配置,請將其安裝在容器的執行時。