如何使用 docker 容器作为 apache 服务器?

How to use docker container as apache server?

我刚开始使用 docker 并遵循了以下教程:https://docs.docker.com/engine/admin/using_supervisord/

FROM ubuntu:14.04
RUN apt-get update && apt-get upgrade
RUN apt-get install -y openssh-server apache2 supervisor
RUN mkdir -p /var/lock/apache2 /var/run/apache2 /var/run/sshd /var/log/supervisor
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
EXPOSE 22 80
CMD ["/usr/bin/supervisord"]

[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D

[program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"

构建并运行:

sudo docker build -t <yourname>/supervisord .
sudo docker run -p 22 -p 80 -t -i <yourname>/supervisord

我的问题是,当 docker 使用 IP http://88.xxx.x.xxx/ 在我的服务器上运行时,如何从我计算机上的浏览器访问在 docker 容器内运行的 apache 本地主机?我想使用 docker 容器作为网络服务器。

apache 的官方图片。图像文档包含有关如何使用此官方图像作为自定义图像基础的说明。

要了解它是如何完成的,请查看官方镜像使用的 Dockerfile:

https://github.com/docker-library/httpd/blob/master/2.4/Dockerfile

例子

确保 root 可以访问文件

sudo chown -R root:root /path/to/html_files

使用官方 docker 图像托管这些文件

docker run -d -p 80:80 --name apache -v /path/to/html_files:/usr/local/apache2/htdocs/ httpd:2.4

可以在端口 80 上访问文件。

您必须使用端口转发才能从外部世界访问您的docker容器。

来自Docker docs

By default Docker containers can make connections to the outside world, but the outside world cannot connect to containers.

But if you want containers to accept incoming connections, you will need to provide special options when invoking docker run.

那么,这是什么意思?您必须在主机上指定一个端口(通常是端口 80)并将该端口上的所有连接转发到 docker 容器。由于您是 docker 容器中的 运行 Apache,您可能还想将连接转发到 docker 容器中的端口 80。

这最好通过 docker run 命令的 -p 选项来完成。

sudo docker run -p 80:80 -t -i <yourname>/supervisord

命令中 -p 80:80 的部分表示您将端口 80 从主机转发到容器上的端口 80。

正确设置后,您可以使用浏览器浏览 http://88.x.x.x,连接将按预期转发到容器。

Docker docs-p 选项进行了详尽的描述。有几种指定标志的方法:

# Maps the provided host_port to the container_port but only 
# binds to the specific external interface
-p IP:host_port:container_port

# Maps the provided host_port to the container_port for all 
# external interfaces (all IP:s)
-p host_port:container_port

编辑: 最初发布此问题时,Apache Web 服务器没有官方 docker 容器。现在,存在现有版本。

启动 Apache 和 运行 的最简单方法是使用 official Docker container。您可以使用以下命令启动它:

$ docker run -p 80:80 -dit --name my-app -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4

通过这种方式,您只需在文件系统上安装一个文件夹,以便它在 docker 容器中可用,并且您的主机端口将转发到容器端口,如上所述。