Знакомство с Docker. Запускаем Apache в контейнере.

Пришло время познакомится с Docker.

Вкратце, что такое Docker. Точнее немного философии Docker. Это открытый программный продукт, позволяющий разворачивать приложения в изолированном контейнере. Да, можно рассматривать это каr такой себе мегасупер chroot. Философия докера подразумевает, что в одном контейнере можно развернуть одно приложение. Например, можно развернуть веб-сервер с каким-то веб-сайтом или веб-приложением и в дальнейшем это контейнер можно переносить на другой сервак, в продакшн, в облако и не нужно будет никаких зависимостей. Просто нужен будет докер и все будет работать.

Чем отличается Docker от виртуализации? Есть несколько типов виртуализации: OS-level, paravirtualization, virtualization, emulation. Но Docker не относится ни к какой виртуализации. Это скорее контейнеризация. На ОС ставится движок docker.io  и все. Потом вы качаете нужный образ, например, ubuntu  и разворачиваете его с нужным приложением. Образы для докера уже легковесны, вот к примеру, у меня последняя убунту весит  134.7 MB.

Очень наглядная картинка, чем Docker отличается от виртуальной машины:

 

vm-vs-docker

То есть, нам не нужно создавать виртуальную машину, ставить на нее ОС, все либы, кучу софта, просто для того чтоб машина работала. А еще потом развернуть на ней наше приложение или сайт.

Еще для примера, можно вспомнить концепции облачных вычислений SAAS, PAAS, IAAS.

SAAS – это приложения работающие в облаке, пример – Dropbox.

PAAS – это стек инструментов и сервис для разработки облачных приложений.

IAAS – это серверная инфраструктура для клиентов, сами клиенты уже используют сервера и хранилища, для своих облачных приложений.

Так вот, на примере этих концепций Docker и есть SAAS. То есть, мы подняли приложение в контейнере и как оно там живет и какие зависимости у него нас не волнует.

Ближе к делу, как говорится. Пощупаем на практике. Есть у меня ubuntu server 14.02, поставим на него Docker  и развернем контейнер с веб-сервером Apache.

Ставим докер очень просто

apt-get update
apt-get install docker.io

Запускаем

service docker start

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

docker images

Качнем образ ubuntu

docker pull ubuntu

Образ скачан и теперь на основе этого образа можно развернуть контейнер. Можно просто запустить контейнер командой

docker run  -name test -d -p 8888:80 ubuntu /bin/bash

test – имя контейнера

ubuntu – образ, который мы качнули

-p 8888:80 означает, что 80 порт контейнера проброшен на порт 8888 хостовой машины

-d означает daemon режим

В результате получаем контейнер с запущенным bash. Заходим и попадаем в шелл.

docker attach test

Получаем приглашение

root@1b3f9a138209:/#

1b3f9a138209 – это id нашего контейнера.

Теперь можно установить конечно apache2  и все, но не тут то было. Апач поднимется, но в автозагрузке его не будет и никакие инит-скрипты не помогут. Нужно собрать контейнер с Dockerfile, в котором укажем инструкции как  и что ставить.

Создаем в home директории файлик Dockerfile и пишем туда

FROM ubuntu:latest
MAINTAINER Test
RUN apt-get update
RUN apt-get install apache2 -y
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_SERVERADMIN admin@localhost
ENV APACHE_SERVERNAME localhost
ENV APACHE_SERVERALIAS docker.localhost
ENV APACHE_DOCUMENTROOT /var/www
ADD ./conf/apache2.conf /etc/apache2/apache2.conf

ADD ./conf/start.sh /start.sh
RUN chmod 0755 /start.sh
CMD [“bash”, “start.sh”]

В файле, как видно, указываем образ из которого будем делать контейнер. Указываем команды установки сервера Apache и переменные к нему. А также берем конфиг от апача с хостовой машины и добавляем скрипт start.sh

В директории ~/conf создаем скрипт start.sh пишем туда

#!/bin/bash

# Start apache
/usr/sbin/apache2 -D FOREGROUND

Делаем его исполняемым

chmod +x start.sh

Теперь нам нужно собрать свой образ с этим файлом. Именно образ, а не контейнер.

cd ~

docker build -t apache2 .

Имя образа будет apache2. Dockerfile он возьмет из директории, где вы запустили команду. Файл должен называться именно Dockerfile (первый символ в верхнем регистре).

Если все прошло успешно, то в списке образов будет образ apache2.

Теперь собираем контейнер

docker run -i -t –name test -d -p 8888:80 apache2

Смотрим что получилось. Команда

docker ps -a

Покажет нам все контейнеры и запущены они или нет.

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9be9493aa841 apache2:latest bash start.sh 3 hours ago Up 1 seconds 0.0.0.0:8888->80/tcp test

Все ок, видим что контейнер запущен. Проверим работает ли апач.

 curl 0.0.0.0:8888

И видим html код стандартной страницы apache. Все работает.

Полезные команды

docker start [container-id] – запустить контейнер

docker stop [container-id] – остановить контейнер

docker rm docker start [container-id] – удалить контейнер

docker rmi [image-id] – удалить образ системы

docker pull [image-id] – получить образ(centos, debian, ubuntu etc.)

docker top [container-id] – посмотреть список процессов контейнера

docker ps -a список всех контейнеров

 

Пока все, продолжение следует…

Comments

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *