前几天,我已经在不依赖Docker Hub等外部镜像源的情况下,使用Podman成功构建了一个Ubuntu容器镜像。具体过程我写在这篇博文里了:Docker受限?试试Podman,手动搭建Ubuntu容器镜像。这次,我想在此基础上更进一步,构建一个能够运行PHP脚本的Apache服务器容器。以下是我此次尝试的详细过程:
首先,我创建了一个名为php_apache
的文件夹,并在其中新建了一个Containerfile
文件。这个文件包含了通过apt安装apache2和php7.4所需的指令:
# 使用之前构建的ubuntu镜像作为基础
FROM localhost/ubuntu:20.04
# 添加以下两行是为了避免apt安装apache2时出现终端交互选择时区,否则构建过程会卡住无法完成
ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai
# 使用apt安装apache2、php7.4及其他必要组件
RUN apt update && \
apt install -y locales \
apache2 \
php7.4 \
libapache2-mod-php7.4 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 初始化locales
RUN localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
RUN localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8
ENV LANG=zh_CN.utf8
# 暴露80端口
EXPOSE 80
接下来,我开始构建容器镜像:
E:\containers\php_apache>podman build . -t php_apache:7.4
STEP 1/8: FROM localhost/ubuntu:20.04
STEP 2/8: ARG DEBIAN_FRONTEND=noninteractive
--> ceeae673b880
STEP 3/8: ENV TZ=Asia/Shanghai
--> 90247c11d4e1
...
STEP 8/8: EXPOSE 80
COMMIT php_apache:7.4
--> ca6b007bee0c
Successfully tagged localhost/php_apache:7.4
ca6b007bee0c0ea0186b38ab9fa9a93d028b1552ec4cd7e9fa673cef94a2da59
构建过程看似顺利。为了确认是否成功,我列出了所有镜像:
E:\containers\php_apache>podman image list -a
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 613971bb71cd About a minute ago 245 MB
localhost/php_apache 7.4 ca6b007bee0c About a minute ago 245 MB
...
看到了localhost/php_apache
,说明构建确实成功了。虽然多了一些<none>
标签的镜像,但暂时不影响大局。我迫不及待地想要运行这个容器,看看效果如何:
E:\containers\php_apache>podman run --rm -it -p8080:80 localhost/php_apache:7.4 /bin/bash
root@6e79eb841220:/#
容器运行成功。然而,当我在浏览器中访问http://localhost:8080
时,却显示“当前无法使用此页面”。我猜想可能是Apache没有启动,于是尝试手动启动:
root@6e79eb841220:/# apache2
[Mon Aug 19 23:28:53.504823 2024] [core:warn] [pid 4] AH00111: Config variable ${APACHE_RUN_DIR} is not defined
apache2: Syntax error on line 80 of /etc/apache2/apache2.conf: DefaultRuntimeDir must be a valid directory, absolute or relative to ServerRoot
果然出错了,似乎是一些必要的环境变量没有定义。经过一番搜索,我找到了解决方法:
root@6e79eb841220:/# source /etc/apache2/envvars
root@6e79eb841220:/# apache2
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 10.88.0.16. Set the 'ServerName' directive globally to suppress this message
尽管还有一条错误信息,但Apache似乎已经成功启动了。当我再次在浏览器中访问http://localhost:8080
时,激动地看到了“It works!”的画面。
今天的尝试就到这里。虽然容器已经可以运行了,但还有很多需要完善的地方。由于时间已晚,我决定改天再继续优化。
下一步:实现自动启动Apache服务的折腾已经完成了,有兴趣的请点这个连接:https://blog.csdn.net/arthurchan2021/article/details/141371026