Apache是一个高稳定性的、商业级别的开源Web服务器,由于其良好的跨平台和安全性,Apache被广泛应用在多种平台和操作系统上。
一、使用 Docker Hub的官方 httpd镜像
官方 Docker Hub 上的查看 httpd 镜像版本, 拉取官方的镜像,不拉取也可以,构建时会自动拉取)。
1、docker run命令创建并启动容器,使用数据卷
[root@centos7 ~]# mkdir -p /root/apache_docker/public-html
[root@centos7 ~]# docker run -d --rm --name my-apache-app -p 80:80 -v /root/apache_docker/public-html:/usr/local/apache2/htdocs/ httpd:2.4.43
[root@centos7 ~]# vim /root/apache_docker/public-html/index.html
[root@centos7 ~]# cat /root/apache_docker/public-html/index.html
<!DOCTYPE html>
<html>
<body>
<p>Docker install Apache ok!</p>
</body>
</html>
打开浏览器,访问:
2、基于官方镜像编写 Dockerfile文件
1. 编写 Dockerfile文件
[root@centos7 apache_docker]# cat Dockerfile
FROM httpd:2.4
# 替换
RUN sed -i 's/#ServerName www.example.com:80/ServerName localhost:80/g' /usr/local/apache2/conf/httpd.conf
COPY ./public-html /usr/local/apache2/htdocs/
[root@centos7 apache_docker]# tree
.
├── Dockerfile
└── public-html
└── index.html
2. 构建自定义镜像,创建并启动容器
[root@centos7 apache_docker]# docker build -t apache-image:v2 .
[root@centos7 apache_docker]# docker run -d -p 81:80 apache-image:v2
ebc6ac005c1e6a3b1ae2366c7dc60e94e480e7a2f6aabcb6b9d5628faedca751
打开浏览器,访问:
上面都是基于官方提供的 Apache镜像,仅仅支持运行静态HTML文件,/usr/local/apache2/htdocs/目录为存放页面。
二、基于系统镜像,完全自己安装构建Apache的自定义镜像
使用上次添加SSH服务 ubuntu:18.04镜像作为基础镜像来构建。
1、创建上下文路径
创建一个 apache_ubuntu 工作目录,在其中创建Dockerfile文件、run.sh 文件和 public-html目录。
在 public-html目录下创建 index.html文件。
[root@centos7 ~]# mkdir -p /root/apache_ubuntu/public-html
[root@centos7 ~]# cd /root/apache_ubuntu/
[root@centos7 apache_ubuntu]# touch Dockerfile run.sh
[root@centos7 apache_ubuntu]# tree
.
├── Dockerfile
├── public-html
│ └── index.html
└── run.sh
[root@centos7 apache_ubuntu]# cat ./public-html/index.html
<!DOCTYPE html>
<html>
<body>
<p>Docker install Apache ok!</p>
</body>
</html>
[root@centos7 apache_ubuntu]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sshd2 ubuntu 1f075a2c9f56 23 hours ago 208MB
2、编写 Dockerfile文件
[root@centos7 apache_ubuntu]# cat Dockerfile
FROM sshd2:ubuntu
LABEL author="赵云"
# 安装apache需要的依赖
RUN set -eux && \
apt-get update && \
apt-get install -y --no-install-recommends libapr1-dev libaprutil1-dev libaprutil1-ldap && \
rm -rf /var/lib/apt/lists/*
RUN set -eux && \
apt-get update && \
apt-get install -y --no-install-recommends bzip2 ca-certificates dirmngr dpkg-dev gcc gnupg libbrotli-dev libcurl4-openssl-dev libjansson-dev liblua5.2-dev libnghttp2-dev libpcre3-dev libssl-dev libxml2-dev make wget zlib1g-dev && \
rm -r /var/lib/apt/lists/*
# 下载apache并编译安装
RUN wget https://www.apache.org/dist/httpd/httpd-2.4.46.tar.gz
RUN tar -zxvf httpd-2.4.46.tar.gz
WORKDIR httpd-2.4.46
RUN ./configure --prefix=/usr/local/apache2 --enable-modules=all --enable-mods-shared=all --enable-so
RUN make && make install
# 修改apache配置文件
RUN sed -i 's/#ServerName www.example.com:80/ServerName localhost:80/g' /usr/local/apache2/conf/httpd.conf
# 复制服务启动脚本并设置权限
ADD run.sh /usr/local/sbin/run.sh
RUN chmod 755 /usr/local/sbin/run.sh
#COPY /public-html /usr/local/apache2/htdocs/
#开放80端口
EXPOSE 80
CMD ["/usr/local/sbin/run.sh"]
RUN ./configure --prefix=/usr/local/apache2 --enable-modules=all --enable-mods-shared=all --enable-so
参数说明下:
(1)--prefix:指定安装目录,如果不指定的话,默认就是 /usr/local/apache2;
(2)--enable-modules=all:加载所有模块;
(3)--enable-mods-shared=all:所有模块使用动态编译的方式进行编译。如果不加此参数,默认为静态编译。
- 静态是直接编译进httpd中,
- 动态编译会提供一个module.so 文件,需要在httpd.conf配置文件中使用时用 loadmodule 这个语法来加载;
(4)--enable-so:其实使用动态编译方式(可以不写)时该模块会自动生效。
3、编写run.sh脚本
[root@centos7 apache_ubuntu]# cat run.sh
#!/bin/bash
# 后台运行
/usr/sbin/sshd -D &
# 前端运行
exec /usr/local/apache2/bin/httpd -D FOREGROUND
4、构建自定义镜像,创建并启动容器
[root@centos7 apache_ubuntu]# docker build -t apache:uv1 .
[root@centos7 apache_ubuntu]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
apache uv1 77d8232efcf7 8 seconds ago 602MB
[root@centos7 apache_ubuntu]# docker run -d -p 82:80 --name "apache82" apache:uv1
4054191b5811574eec390bf60dae880b9dea8bd7e009f56c50473e761d3fbd82
[root@centos7 apache_ubuntu]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4054191b5811 apache:uv1 "/usr/local/sbin/run…" 31 seconds ago Up 30 seconds 22/tcp, 0.0.0.0:82->80/tcp apache82
打开浏览器,访问:
访问的是 默认页面。上面的 #COPY /public-html /usr/local/apache2/htdocs/ 不小心被注释掉了。
使用数据卷,重新创建并启动
[root@centos7 apache_ubuntu]# docker run -d -p 83:80 -v /root/apache_ubuntu/public-html:/usr/local/apache2/htdocs/ apache:uv1
13f2246cd94b7b544a5340854869da2184bade8b7498c36a817306fc8c575ccb
[root@centos7 apache_ubuntu]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
13f2246cd94b apache:uv1 "/usr/local/sbin/run…" 2 seconds ago Up 1 second 22/tcp, 0.0.0.0:83->80/tcp peaceful_morse
官网下载比较慢,可以使用:https://mirror.bit.edu.cn/apache//httpd/httpd-2.4.46.tar.gz
因为这种方式我们加载了所有模块(--enable-modules=all),所以比方式一支持的更多。
—— Stay Hungry. Stay Foolish. 求知若饥,虚心若愚。