После теории перейдем к практическим занятиям. Для этого нам понадобится Linux с установленным Docker
либо Doot2Docker
на Windows или OSX. Как это сделать, доступно написано на сайте разработчика. На тестовой машине у меня версия 1.3.2
:
┌─[ ~/blog ]
└─[root@core (пт січ 09 04:02:32)] ·> docker info
Containers: 15
Images: 302
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Dirs: 368
Execution Driver: native-0.2
Kernel Version: 3.13.0-43-generic
Operating System: Ubuntu 14.04.1 LTS
Создаем первый контейнер
Создаем наш первый контейнер на основание образа ubuntu:
docker run -i -t ubuntu /bin/bash
Команда run создала контейнер и выполнила /bin/bash
внутри нового контейнера. Ключ -i
открывает STDIN, а -t
говорит Docker открыть pseudo-tty в контейнер, что бы мы могли с ним работать. Вот он:
root@d40430154f65:/#
Теперь мы внутри контейнера 🙂
Внутри контейнера
Внутри контейнера доступны все команды образа, на основание которого он был создан. В нашем случае это Ubuntu Linux. Docker
также присваивает контейнеру свой уникальный IP:
root@d40430154f65:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
825: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 02:42:ac:11:01:38 brd ff:ff:ff:ff:ff:ff
inet 172.17.1.56/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:138/64 scope link
valid_lft forever preferred_lft forever
Контейнеру присвоен адрес 172.17.1.56
.
Так же, мы можем установить любой дополнительный софт внутри контейнера. Давайте поставим vim редактор:
root@d40430154f65:/# apt-get update && apt-get install vim
Но это так, забавы. Давайте сделаем что-то более интересное.
Привет, Jekyll!
Jekyll — это движок на Ruby
, который позволяет создать веб-сайт с простых текстовых файлов. Движок не использует базы данных, что позволит нам пока с этим не заморачиваться.
Я подготовил образ для создания контейнера. Образ создается с помощью простых команд в Dockerfile. Как видите из файла, здесь мы уже сталкиваемся с понятием Volumes
, нам нужно вынести файлы нашего будущего сайта за рамки контейнера. Помните? Пока существует контейнер — существуют и файлы. Что будет если мы пересоздадим контейнер? Правильно, все файлы будут уничтожены. Для этого в моем образе предусмотрен Volume /src
в котором и будет храниться исходник сайта (пример статьи).
mkdir src
Внутри src
можем создать тестовый файлик:
echo "<H1>Helo world</H1>" > src/index.html
Создаем контейнер и компилируем сайт:
docker run -v ${PWD}/src:/src vkovalyshyn/jekyll build
Новый ключ -v
отвечает за «проброс» внутрь контейнера локальной директории. Больше ничего этот контейнер не делает, соответственно он сразу же и остановиться.
Теперь можем запустить сайт:
docker run -d -v ${PWD}/src:/src -p 4000:4000 vkovalyshyn/jekyll serve --host 0.0.0.0
Новый ключ -d
отвечает за запуск контейнера в фоновом режиме, а ключ -p
— за проброс порта наружу. С помощью docker ps
можем увидеть наш контейнер:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
85f0766d4643 vkovalyshyn/jekyll:latest "jekyll serve --host 15 seconds ago Up 14 seconds 0.0.0.0:4000->4000/tcp sharp_kirch
Все, наш сайт в Docker
работает! Открываем страницу и любуемся результатом.
Что бы остановить контейнер, воспользуемся CONTAINER ID
:
docker stop 85f0766d4643
Удалить контейнер:
docker rm 85f0766d4643
Permalink