【docker】Dockerfile笔记,alpine搭建php+apache2环境
docker⽤alpine搭建php+apache2/nginx环境,制作镜像,Dockerfile
记录⼀些⾃⼰踩过的坑
⼀、简介
1.1 Alpine简介
Alpine Linux 是⼀个⾯向安全,轻量级的基于musl libc与busybox项⽬的Linux发⾏版
不同于主流的基于gunc(glibc)的发⾏版本
它简洁⼩巧,官⽅的docker镜像才5M,其余基于alpine的镜像也都是50M左右,⽽其它的docker镜像都是⼀百多M起步
它具有较完整的⽣态环境,主流的linux应⽤都有其移植版本
它有⾃⼰的包管理软件:apk
值得注意的是,在 Alpine Linux 存储库上,只有每个包的最新版本可⽤。旧的软件包版本被丢弃,⼀旦被丢弃,就不能再使⽤apk add来安装
想⽤旧版本软件就需要安装旧版本的 alpine ,或根据本⽂后⾯的⽅法更改 /etc/apk/repositories
1.2 Dockerfile
⼆、alpine搭建php+apache2环境
# 安装软件
apk --no-cache --update \
add apache2 php-apache2 openrc
# 简单配置apache2,为了消除提⽰
vi /etc/f
# 到servername
/servername
# 添加配置,退出
ServerName localhost
# web⽬录
cd /var/www/localhost/htdocs
# 初始化openrc
openrc
# 启动apache2
rc-service apache2 start
这⾥踩的坑是,apache2 nginx这种,都需要openrc的⽀持,先要执⾏⼀下 openrc 初始化,不然运⾏ rc-service apache2 start,可能提⽰
WARNING: nginx is already starting
那么就是启动失败
鄙⼈额外踩的坑是,为了复现问题装低版本的php,了个alpine 3.7 的镜像,结果 rc-service apache2 start 还提⽰启动⽹络失败,这种⽹络问题似乎只有低版本才会出现
networking failed to start
暂时妥协(往后看,后续已经解决低版本alpine中这个问题),⽤新版本镜像,⽆此⽹络问题
可以通过修改 /etc/apk/repositories ,来更改 apk 安装应⽤的版本
注意,排坑:
改了 /etc/apk/repositories ,⽤低版本,如果构建时不能访问,则可以尝试放弃 https 使⽤ http ,如 3.7 中默认的 repositories 是 http ,⽤ https 有可能⽆法访问
别⽤ 3.7 版本,构建中可能出现
ERROR: libressl2.6-libcrypto-2.6.5-r0: trying to overwrite etc/ssl/cert.pem owned by ca-certificates-bundle-20191127-r5.
ERROR: libressl2.6-libcrypto-2.6.5-r0: trying to overwrite etc/ssl/opensslf owned by libcrypto1.1-1.1.1l-r0.
三、alpine php+apache2 DockerFile
把在容器⾥的操作记录下来写进相应位置即可
下⾯给出我制作的 alpine-php5-apache2 的 DockerFile
因为我要复现问题,需要php5,最新能⽀持php5的版本是 alpine:3.8,但是在使⽤过程中也遇到⼀些问题,不过最后都解决了
DockerFile
FROM alpine:3.8
LABEL maintainer="wwwblogs/yunmuq/p/15509873.html"
LABEL description="alpine php5 apache2 base web server"
EXPOSE 80
COPY src/ /var/www/localhost/htdocs.pre/
COPY start.sh /start.sh
RUN chmod 755 /start.sh \
&& apk --no-cache --update add apache2 php5-apache2 openrc \
&& rm -rf /var/www/localhost/htdocs \
&& \cp -rf /var/www/localhost/htdocs.pre /var/www/localhost/htdocs \
&& rm -rf /var/www/localhost/htdocs.pre \
&& chmod -R 755 /var/www/localhost/htdocs \
&& sed -i 222i\ServerName\ localhost:80 /etc/f \
&& openrc && touch /etc/network/interfaces /run/openrc/softlevel \
&& echo -e "auto lo\niface lo inet loopback\nauto eth0\niface eth0 inet dhcp">/etc/network/interfaces
CMD ["/start.sh"]
php项目搭建先解释⼀下,start.sh 不更改权限,docker run ⽆法顺利运⾏;
apk --no-cache --update ⽆缓存,减少镜像的⼤⼩;
\cp -rf 反斜杠是直接使⽤cp命令,否则可能会使⽤ ~/.bashrc 中的-i别名
/var/www/localhost/htdocs 权限要设置好,否则访问时 apache2 提⽰403:
apache2 You don't have permission to access
sed -i 222i 在⽂件222⾏插⼊ ServerName localhost:80,sed中空格要转义
openrc 和 touch 都是初始化 openrc
最后⼀⾏是⽹络配置,这⾥解决了,必须配置才能启动,⽹上说的⽤httpd启动作者没成功过
/etc/network/interfaces ⽂件并不是touch⼀下就好了,需要有配置,参考:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
采⽤dhcp,缺点是从 docker run 到web启动时间有点长。其实可以⽤脚本,根据 /etc/hosts netstat -r 来配置静态 ip 以下是start.sh
#!/bin/sh
openrc
rc-service apache2 start
tail -f -s 30 /dev/null
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论