Депрокрастинируем Docker: контейнеры здесь и сейчас
-
Upload
ruslan-sharipov -
Category
Software
-
view
119 -
download
1
Transcript of Депрокрастинируем Docker: контейнеры здесь и сейчас
Депрокрастинируем Docker: контейнеры здесь и сейчас
29-ый Омский IT субботник, 06-06-2015https://vk.com/omskit
Денис Нелюбин@den_gelin
Руслан Шарипов@sharipov_ru
Что такое Docker?
Docker is an open platform for developers and sysadmins to build, ship, and run distributed
applications
Зачем?
- Собрал один раз - запустил идентичное окружение везде
- Иммутабельность: нет проблемы с уже установленным набором софта
- Изоляция рантайма- Выделение ресурсов
Отличия Docker от VMs
Отличия Docker от VMs
- Контейнеры запускаются в той же операционной системе,что и хост
- AuFS в качестве файловой системы- Ресурсы между хостом и контейнером расшарены- Быстрый запуск (секунды против минут для
полностью виртуализированной системы)- VM живёт вечно, контейнер - запускается и
удаляется
Docker architecture
Как работает Docker
- изоляция root fs- изоляция процессов- абстракция над сетью- cgroups- capabilities
План мастер класса
Упражнение 1Работаем с образами, контейнерами, registry
Упражнение 2Пишем Dockerfile, тестируем с RSpec и Serverspec
Упражнение 3Деплоим webapp + db, оркестрируем ансиблом, балансим контейнеры через haproxy
План мастер класса
Упражнение 1Работаем с образами, контейнерами, registry
Docker image
Образ - неизменяемый слепок состояния файловой системы.
ubuntu:latest, postgresql:9.4, coreos/apache,vasya-pupkin/superimage:3.4
Docker image: fs layers
Docker image layers example
Base image, слои
Docker image
> docker images
Docker image: pull
> docker pull 192.168.200.100:5000/redis
Docker image: pull
> docker pull 192.168.200.100:5000/redis:latest
Docker image: pull
> docker pull 192.168.200.100:5000/redis:2.6.17
Docker images: просмотр слоёв
> docker images --tree
Docker images: “git log” для образов
> docker history redis
Docker images: “git log” для образов
> docker inspect redis
Docker images: “git log” для образов
> docker rmi IMAGE_ID
Docker image
Образы в публичных хабах могутсодержать небезопасные пакеты!
Docker container
Контейнер - linux процесс, запущенный на хосте с docker. Легковесный аналог виртуальных машин
Контейнеры запускаются из docker images (образов)
Docker container
Каждый контейнер имеет:
- файлововую систему- сеть- дерево процессов- выделенные ресурсы
Image -> container
IMAGE -> RUN -> CONTAINER
Image -> container
docker run -it ubuntu:14.04 /bin/bash
Image -> container
container:> ps aux
host:> ps aux
Image -> container
Контейнер жив то тех, пор, пока жив процесс с PID=1
container detach: Ctrl+P+Q
Image -> container
docker run -d ubuntu:latest /bin/bash -c “ping ya.ru”
Docker container
Docker commit
docker run -it 192.168.200.100:5000/ubuntu:14.04 /bin/bash
Docker commit
container> touch /tmp/hello_worldcontainer> exit
Docker commit
host> docker imageshost> docker commit IMAGE_ID name
Проброс портов
> docker run -d -p 6379:6379 192.168.200.100:5000/redis:latest
ENV vars
host> docker run -it -e MY_KEY=213323 192.168.200.100:5000/redis:latest bash
container>echo $MY_KEY
Containers: куда класть данные?
Верхний слой контейнера - Read+Write, но этот слой каждый раз новый и пустой
Containers: куда класть данные?
Для постоянных данных используютсяDocker volumes
Containers: куда класть данные?
Volumes: Demo
docker run -it -v /my-volume 192.168.200.100:5000/ubuntu:14.04 /bin/bash
Volumes: Demo
container> ls -l /container> cd /my-volume
Volumes: Demo
container> ls -l /container> cd /my-volumecontainer> echo hello-volume > \ /my-volume/new_filecontainer> exit
Volumes: Demo
host> docker inspect CONTAINER_ID
Volumes: Demo
host> docker inspect CONTAINER_ID
Volumes: Demo
--volumes-from=CONTAINER_ID
Volumes: Demo
Упражнение 1
Вопросы?
Docker
Пишем Dockerfile, тестируем с RSpec и Serverspec
Dockerfile
Dockerfile - текстовый файл со специальным синтаксисом и инструкциями, как собрать Docker-образ
Dockerfile: пример
FROM centos:centos6
RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpmRUN yum install -y npmCOPY . /src
RUN cd /src; npm installEXPOSE 8080CMD ["node", "/src/index.js”]
Dockerfile: задача
Собираем Dockerfile для mongodbПишем тесты c RSpec + serverspec
Dockerfile: задача
touch Dockerfiledocker build -t docker-mongo .
Dockerfile: задача
docker run -d --name db docker-mongo
Тестирование Dockerfile
RSpec
Задача: haproxy, docker, ansible
● Конфиг nginx HAProxy с двумя upstreams
● Ansible для доставки контейнеров куда угодно
● Билд, запуск● Zero-downtime: как делать правильно?
https://bitbucket.org/gelin/docker-deploy-sample
Image -> container
Как ещё можно деплоиться?
Docker compose (fig) + Swarm + Docker Machine => not production readyGoogle Kubernetes http://kubernetes.io
Amazon Elastic BeanstalkPanamax http://panamax.io
CloudifyCloud66
CoreOS + fleet + etcdApache Mesos
NewRelic Centurion => not production readyAnsible/Chef/Puppet + Docker
...и десятки других сервисов...