суббота, 28 февраля 2015 г.

Dockerfile

Build cache - когда мы отбилдили какойнибудь Dockerfile последующие билды будут в разы быстрее, потому что будет билдится только новое, все остальные слои просто используются.
Но можно: docker build --no-cache=true {...}

FROM - базовый образ/имидж из которой создается текущий контейнер.
RUN - команды, которые будут запускаться при сборке этого образа. Каждая такая команда запускается в writable layer предыдущего образа, и потом комитится, создавая образ для следующей RUN строки, таким образом, если у нас изменения происходят на какой-то из строк RUN, то может использоваться кеш из образа который выше изменения, и только последующий перевыполняются и перезаписуют свои образы. Чем меньше RUN тем меньше дискогового пространства будет задействовано, но во время активного написания билда, полезно использовать много RUN, чтобы эффективные/быстрее пробовать/проверять стремные изменения, потом можно обьединить в один RUN, когда все оттестировано.
CMD - команды, которые будут запускаться каждый раз при запуске контейнера. По факту в виде shell form это запускается как /bin/bash -c "то что мы определили". И мы тут можем начинять и пайпами и переадресацией потоков и т.д.
Exec form - ["commOrArg1", "commOrArg2"] этот вариант не требует чтобы в контейнере была установлена оболочка, также каждая команда экранируется.
Команды cmd могут быть подменены на этапе запуска контейнера путем:
docker run ... {команда}
ENTRYPOINT - не может быть перегружена docker run ... в отличии от CMD. Зато все, что мы передаем таким способом на этапе запуска, интрепритируется как аргументы в ENTRYPOINT. Таким образом мы уже не можем попасть в запущеный контейнер через такой аргумент. Например:
ENTRYPOINT ["echo"]
И мы пытаемся:
# docker run -it mycontainer /bin/bash
Но мы не подключимся к нему, а получим:
# docker run -it mycontainer /bin/bash
/bin/bash
#

Чтобы все-таки ENTRYPOINT перегрузить полностью можно воспользоваться ключем --entrypoint.

В докер-файлах пользуются ENTRYPOINT чтобы определить процесс, который будет работать в контейнере, а CMD - чтобы определить дефолтовые параметры для него, которые также можно переопределить при запуске контейнера если что:

ENV var1=val1 var2=val2 - определение переменный окружения
VOLUME ["/data"] - создаеть отвязанное от контейнера хранилище, которое будет храниться в стандартном месте хостовой машины(var/lib/docker/vfs/dir/CONTAINERHASH), при удалении контейнера место останется с данными, также можно разделять с другими контейнерами общее хранилище или загружать оттуда некие индивидуальные настройки под контейнер.

EXPOSE 80 - указываем какой порт мы открываем из контейнера. А при запуске с помощью параметра -p мы уже определяем порт хоста, который подвязывается на порт контейнера и у нас получается пайп снаружи в контейнер.

ADD vs COPY
COPY - копирует файлы с указанного места ОС-хозяина в контейнер.
ADD - тут можно указывать первым аргументом и место/ресурс в файловой системе и URL удаленного сетевого ресурса, если ресурсы заархивирован, то он еще и розархивируется в контейнере.
Всегда лучше использовать COPY, если мы имеем дело с местом в ОС, и только если нам нужен архив или ресурс из сети, то тогда ADD.

Docker volumes

Концепция выделения хранилища из контейнеров и разделения хранилищ между контейнерами.
На данный момент концепция сырая и пользоваться ею означает, что мы привязываем наши контейнеры к конкретной хост-машине. Или же нам придется всегда предподготавливать хост-машины для горизонтального масштабирования(хотя это и так всегда я думаю нужно, но вопрос цены и трудозатрат всегда актуален).

Запуск apache web-server и папки проекта

So here’s what I figured I would need to do:
  • Run apache in the foreground from the project root.
  • Craft a minimal apache configuration file for serving PHP from a single doc root.
  • Extra credit: get apache to log to the console in the foreground.

пятница, 27 февраля 2015 г.

Private Docker Registry

Registry - там где хранятся образы докер.

1. Можем воспользоваться открытым реджистри. 
# docker login [registry_url] --username=coreer
Password:
Login Succeeded! 
# docker push myrepositoty/myimage:mytag

if [registry_url] == empty then docker logs in "https://hub.docker.com/"

2. Можем подключить из своей сети несекьюрный(http или https публичного ключа которого мы не имеем) реджистри.
Debian family: /etc/default/docker
Redhat family: /etc/sysconfig/docker
Добавляем строку DOCKER_OPTS="--insecure-registry registry.mydomain.com"

3. Или добавить сертифакат в доверенные. 
# cp devdockerCA.crt /usr/local/share/ca-certificates/
# update-ca-certificates

4. Поднять себе локально реджистри
# docker run -d -p 5000:5000 --restart=always --name registry registry:2

registry v1 - проект на python, который предоставляет возможность поднять сервис с регистром для доков(образов), который мы можем развернуть в своей сети. И заливать туда приватные доки и качать от туда.

registry v2 - проект на golang. Уже стабилен.


Docker основные команды

docker run
  --cpu-shares=
  --memory=
docker run -it ubuntu:14.04 /bin/bash
-i - interective
-t - подключить tty 
ubuntu - repository name
14.04 - image name
/bin/bash - команда которую выполнить при старте контейнера PID1 (родитель всех процессов - в Linux это init)

docker run -d ubuntu:14.04 /bin/nginx start
-d detache запустить в фоне

четверг, 26 февраля 2015 г.

curl и wget


сURL -- это утилита для приема передачи файлов в роли клиента через разные протоколы (http,ftp,scp,smtp и многие другие), ипользуя урл синтаксис. Это часть проекта cURL, в который также входит библиоте libcurl, ее api можно использовать в своих приложениях.

Командная утилита очень богата, например для http, с помощью ее можно передавать куки, проводить аутентификацию, использовать запросы гет, пост, пут и др.

wget -- это гну этилита. Означает www get. Предназначение получать файлы с веб сервера. Работает с протоколами хттп, хттпс и фтп. Пожет скачивать рекурсивно(как веб-гусеница, скачивая все, на что есть ссылки с уже загруженного ресурса).

Это из

Чтобы скачать сайт целиком с помощью wget нужно выполнить команду:
wget -r -k -l 7 -p -E -nc http://site.com/

Справочник по командам wget и curl

wget — консольная утилита для скачивания файлов/сайтов, умеет выкачивать файлы рекурсивно, следуя по ссылкам автоматически.

вторник, 24 февраля 2015 г.

Установка docker на Ubuntu

1. Обновить ядро до версии >3.8 - потому что docker нуждается в фичах cgroup & namespaces:
user@host$ apt-cache search linux-headers-$(uname -r)
linux-headers-3.2.0-76-generic - Linux kernel headers for version 3.2.0 on 64bit x86 SMP
linux-headers-3.2.0-76-generic-pae - Linux kernel headers for version 3.2.0 on 64bit x86 SMP
user@host$
user@host$
user@host$
user@host$ sudo apt-get install linux-image-generic-lts-trusty linux-headers-generic-lts-trusty
....
user@host$ sudo shutdown -r now
....
user@host$ apt-cache search linux-headers-$(uname -r)
linux-headers-3.8.0-44-generic - Linux kernel headers for version 3.8.0 on 64bit x86 SMP

2. сама установка https://docs.docker.com/installation/ubuntulinux 

пятница, 20 февраля 2015 г.

ldd

ldd (List Dynamic Dependencies) - *nix утилита, которая позволяет узанть какими разделяемыми библиотеками ОС пользуется переданный как параметр бинаркник.
Стремные бинарники лучше не проверять, потому что утилита их запускает.

вторник, 17 февраля 2015 г.

Работа с юзерами

Создать юзера и поставить ему пароль:
# adduser tom
# passwd tom

Добавить новосозданного юзера в группы:
# useradd -G admins,ftp,www,developers jerry


Создать новую группу:
# groupadd developers


Поставить основную группу новосозданному юзеру:
# useradd -g developers tony
А теперь посмотрим где он и что он
# id tony


Добавить существующего юзера в группу:
usermod -a -G ftp tony


Установить существующему юзеру основную группу:
# usermod -g www tony


суббота, 14 февраля 2015 г.

Терминалы Linux

Терминал - это интерфейс через который мы совершаем управление ОС.

пятница, 13 февраля 2015 г.

Возможные загрузчики Linux

PXELINUX - для загрузки по сети.
SYSLINUX - для загрузки из USB устройства
ISOLINUX - для закрзки из оптического устройства
EXTLINUX - альтернатива GRUB

PXE

PXE - Preboot eXecution Environment(пикси), спецификация описывает стандартизированную слиент-серверную среду, которая загружает софтверную сборку, полученную из сети, на PXE-настоенный клиент.

Hardware: на клиенте для этого нужен PXE-совместимый Network Interface Controller (NIC: к сети -  Ethernet, WIFI, Token ring, ATM; к метеринке - встроенный, PCI, USB, FireWire etc).

Протоколы по которым происходит передача: DHCP(Dynamic Host Configuration Protocol - для динамического распространения по сети конфигурационных параметров(IP адреса для интрефейсов и сервисов), позволяет не вносить админу в новый узел сети это руками), TFTP(Trivial File Transfer Protocol - для простого get и put из/на сервер).

Процес:
1) DHCP request ->    <- dhcp="" p="" response="">2) TFTP get ->  <- p="" pxelinux.0="">3) TFTP get Config ->  <- default="" p="" pxelinux.cfg="">4) Retrieve Kernel(по какому протоколу?) ->   <- -="" disk="" initrd="" linux="" nitial="" p="" ram="">5) Загрузка и дальнейший старт или инсталяция.


среда, 11 февраля 2015 г.

AWS Terminology

AWS - Amazon Web Services
IAM - Identity and Access Management. Users&Groups, Accesses through policies.
AMI - Amazon Machine Image. Образ виртуальной машины: архитектура железа, ос.
EC2 - Elastic Cloud. Создание AMI, загрузка их в S3, безопасность и сетевые настройки доступа к AMI, планирование расходов на облачную инфраструктуру.
S3 - Simple Storage Service. Файорвый хостинг. На пример им пользуется Dropbox, Ubuntu One.
CloudFront - реализация CDN сервиса от Amazon.