Как использовать контейнер докеров в качестве сервера apache?

Я только начал использовать докер и следил за следующим учебным пособием: 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

Мой вопрос: когда докер работает на моем сервере с IP http://88.xxx.x.xxx/, как я могу получить доступ к локальному хосту apache, запущенному внутри контейнера докеров из браузера на моем компьютере? Я хотел бы использовать контейнер докеров в качестве веб-сервера.

Ответы

Ответ 1

Вам нужно будет использовать переадресацию портов, чтобы иметь доступ к вашему контейнеру докера из внешнего мира.

Из Документы Docker:

По умолчанию контейнеры Docker могут подключаться к внешнему миру, но внешний мир не может подключаться к контейнерам.

Но если вы хотите, чтобы контейнеры принимали входящие соединения, вам нужно будет указать специальные опции при вызове docker run.

Итак, что это значит? Вам нужно будет указать порт на вашем хост-компьютере (обычно порт 80) и переадресовать все соединения на этом порту в контейнер докеров. Поскольку вы используете Apache в контейнере докера, вы, вероятно, захотите переправить соединение с портом 80 в контейнере докера.

Это лучше всего сделать с помощью опции -p для команды docker run.

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. Теперь существует существующая версия.

Самый простой способ запустить Apache - использовать официальный контейнер Docker. Вы можете запустить его, используя следующую команду:

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

Таким образом вы просто монтируете папку в своей файловой системе, чтобы она была доступна в контейнере докера, а ваш хост-порт перенаправляется в порт контейнера, как описано выше.

Ответ 2

Существует официальный образ apache. Документация изображения содержит инструкции о том, как вы можете использовать эти официальные изображения в качестве основы для пользовательского изображения.

Чтобы узнать, как это сделать, загляните в файл Docker, используемый официальным изображением:

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

Пример

Убедитесь, что файлы доступны для root

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

Размещение этих файлов с использованием официального изображения докеров

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

Файлы доступны на порту 80.