Установить docker, скачать образ nginx, запустить контейнер nginx. Настроить балансировку, как в задании про веб-сервер только в кач-ве FrontEnd использовать контейнер nginx.
Цель: в результате выполнения ДЗ вы получите базовые навыки работы с контейнерами docker.
В данном задании тренируются навыки:
- понимание предметной области задания;
- установка ПО на сервер, работа с файлами конфигурации;
- базовая работа с контейнерами.
Необходимо:
- установить docker;
- найти образ nginx и скачать его;
- запустить контейнер nginx на базе образа nginx;
- подключить конфигурационные файлы nginx из ДЗ с web-сервером в контейнер nginx.
Задание выполнялось на CentOS 7.
Для установки docker необходимо предварительно добавить его репозиторий в yum:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repoДлаее устанавливаем необходимые для работы docker пакеты:
sudo yum install docker-ce docker-ce-cli containerd.ioАктивируем и запускаем демон docker:
sudo systemctl enable docker && sudo systemctl start docker Проверяем состояние:
sudo systemctl status dockerТакже останавливаем и отключаем настроенный ранее локальный nginx во избежание конфликта:
sudo systemctl stop nginx && sudo systemctl disable nginxДля nginx контейнера будем использовать существующий файл конфигурации nginx, находящийся в /etc/nginx/nginx.conf. Однако, чтобы корректно работала переадресация на upstream необходимо изменить адреса backend-серверов с localhost на фактический адрес сервера.
Для этого узнаем текущие присвоенные адреса, а также наименование сетевого интерфейса docker:
ip aФрагмент вывода:
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:0b:d0:1b brd ff:ff:ff:ff:ff:ff
inet 10.0.1.1/24 brd 10.0.1.255 scope global noprefixroute dynamic eth1
valid_lft 9562sec preferred_lft 9562sec
inet6 fe80::15ec:c4e6:2425:fcae/64 scope link noprefixroute
valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:f9:71:00:31 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:f9ff:fe71:31/64 scope link
valid_lft forever preferred_lft forever
Исходя из полученного адреса исправляем секцию upstream:
upstream httpd {
server 172.17.0.1:8081;
server 172.17.0.1:8082;
server 172.17.0.1:8083;
}
Поскольку ранее на сервере был ограничен доступ к backend только с локальных адресов, то необходимо добавить в цепочку INPUT iptables правило для разрешения доступа из контейнера:
sudo iptables -A INPUT -p tcp --dport 8081:8083 -i docker0 -j ACCEPTПредварительно найдем подходящий образ nginx на https://hub.docker.com/. Это будет официальный образ nginx https://hub.docker.com/_/nginx.
Выполняем запуск контейнера с именем nginx-proxy, задаем соответствие порта 80 host-машины и порта 80 контейнера и монтируем каталог с файлами конфигурации в режиме только чтение:
sudo docker run --name nginx-proxy -p 80:80 -v /etc/nginx/:/etc/nginx/:ro -d nginxПри этом происходит загрузка наиболее свежего (latest) образа nginx и запуск контейнера.
Проверяем запущенные контейнеры:
sudo docker psТиповой вывод:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c7b696ccc98 nginx "/docker-entrypoint.…" 2 days ago Up 8 hours 0.0.0.0:80->80/tcp nginx-proxy
Проверяем доступность и балансировку нагрузки локально:
$ curl http://localhost
Apache8081
$ curl http://localhost
Apache8082
$ curl http://localhost
Apache8083
Убеждаемся, что запросы попадают именно в контейнер (приведены последние строки вывода):
$ sudo docker logs nginx-proxy
172.17.0.1 - - [09/Mar/2021:14:47:36 +0000] "GET / HTTP/1.1" 200 11 "-" "curl/7.29.0" "-"
172.17.0.1 - - [09/Mar/2021:14:47:37 +0000] "GET / HTTP/1.1" 200 11 "-" "curl/7.29.0" "-"
172.17.0.1 - - [09/Mar/2021:14:47:38 +0000] "GET / HTTP/1.1" 200 11 "-" "curl/7.29.0" "-"