Памятка по работе с docker

------------------------------------------------------------
Установка Docker
------------------------------------------------------------
https://docs.docker.com/installation/ubuntulinux/

# $ wget -qO- https://get.docker.com/ | sh

При необходимости можно добавить юзеров в группу docker для запуска без рута.

Добавить в /etc/default/grub:
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
------------------------------------------------------------
Делаю отдельную директорию для докера
------------------------------------------------------------
На сервере есть lvm2:
# lvcreate -ndock -L30G /dev/vg
# mkfs.xfs /dev/vg/dock
# mkdir /srv/dock/
# mount /dev/vg/dock /srv/dock

и добавляем в fstab
/dev/vg/dock  /srv/dock      xfs     defaults        1       2

------------------------------------------------------------
Отдельный сетевой интерфейс для докера
------------------------------------------------------------
Вручную:
# tunctl -t tap10
# ip link set up dev tap10
# brctl addbr br10
# brctl addif br10 tap10
# ip link set up dev br10
# ip addr add 10.11.12.1/24 dev br10

или в /etc/network/interface
auto tap10
iface tap10 inet manual
        pre-up /usr/sbin/tunctl -u root -t tap10

auto br10
iface br10 inet static
        address 10.11.12.1
        netmask 255.255.255.0
        network 10.11.12.0
        broadcast 10.11.12.255
        bridge_ports tap10
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

------------------------------------------------------------
Настройки по умолчанию для докера
------------------------------------------------------------
# cat /etc/default/docker 
# Docker Upstart and SysVinit configuration file
# Customize location of Docker binary (especially for development testing).
#DOCKER="/usr/local/bin/docker"

# Use DOCKER_OPTS to modify the daemon startup options.
#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
DOCKER_OPTS="-g=/srv/dock/ -b br10 --dns 10.11.12.1 --ip=10.11.12.1"
# If you need Docker to use an HTTP proxy, it can also be specified here.
#export http_proxy="http://127.0.0.1:3128/"

# This is also a handy place to tweak where Docker's temporary files go.
#export TMPDIR="/mnt/bigdrive/docker-tmp"

------------------------------------------------------------
Добавление в локальную библиотеку первого основного образа ubuntu из официального репозитория
------------------------------------------------------------
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
# docker search ubuntu
NAME                       DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
ubuntu                     Ubuntu is a Debian-based Linux operating s...   1827      [OK]       
ubuntu-upstart             Upstart is an event-based replacement for ...   25        [OK]       
tutum/ubuntu               Ubuntu image with SSH access. For the root...   25                   [OK]
torusware/speedus-ubuntu   Always updated official Ubuntu docker imag...   25                   [OK]
ubuntu-debootstrap         debootstrap --variant=minbase --components...   10        [OK]       
rastasheep/ubuntu-sshd     Dockerized SSH service, built on top of of...   4                    [OK]
maxexcloo/ubuntu           Docker base image built on Ubuntu with Sup...   2                    [OK]
nuagebec/ubuntu            Simple always updated Ubuntu docker images...   2                    [OK]
nimmis/ubuntu              This is a docker images different LTS vers...   1                    [OK]
alsanium/ubuntu            Ubuntu Core image for Docker                    1                    [OK]

Думаю, что первый в списке подойдёт. Закачиваю:
# docker pull ubuntu
Проверяю:
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              latest              fa81ed084842                           188.3 MB

------------------------------------------------------------
Создание первого контейнера на основе локально-сохранённого образа ubuntu
------------------------------------------------------------
# docker run -it --name e0db \ # имя нового контейнера
-v /mnt/e0db/varlibmysql:/var/lib/mysql \ # пробросить папку на хост-машине
-v /mnt/e0db0/varlogmysql:/var/log/mysql \ #
внутрь контейнера
--net=none -h db.e0.local \ # без автонастройки сети, имя новой машины
--dns 10.11.12.1 --dns-search=e0.local \ # dns-настройки

-it \ For interactive processes (like a shell), you must use -i -t together in order to allocate a tty for the container process.
mysql /bin/bash # базовый образ и процесс внутри контейнера

ещё раз жму энтер и я уже в контейнере:
root@db.e0.local:/# ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
root@db.e0.local:/# exit

------------------------------------------------------------
Скрипт для запуска первого контейнера с назначением ему ip-адреса
------------------------------------------------------------
# cat start_e0db.sh
#!/bin/sh
NAME=e0db
CONT=cont0
DEV=pbx0br10
IF=br10
docker stop $NAME
docker start $NAME
pid=`docker inspect -f '{{ .State.Pid }}' $NAME`
mkdir -p /var/run/netns
ln -s /proc/$pid/ns/net /var/run/netns/$pid

# Создание пары интерфейсов pbx0br10 и cont0 с последующей
# привязкой pbx1br0 к бриджу и его "поднятие"
ip link add $DEV type veth peer name $CONT
brctl addif $IF $DEV
ip link set $DEV up

# Поместим cont0 в контейнер, переименуем в eth0
# и включим с нобходимым IP-адресом
ip link set $CONT netns $pid
ip netns exec $pid ip link set dev $CONT name eth0
ip netns exec $pid ip link set eth0 address 5e:cc:8c:d4:d0:ac
ip netns exec $pid ip link set eth0 up
ip netns exec $pid ip addr add 10.11.12.50/24 dev eth0
ip netns exec $pid ip -6 addr del fe80::5ccc:8cff:fed4:d0ac/64 dev eth0
ip netns exec $pid ip route add default via 10.11.12.1

# запустим скрипт куда потом поместим service mysql start
docker exec $NAME /etc/rc.local
exit 0

------------------------------------------------------------
Запуск, останов контейнера. Списки локальных образов и контейнеров. Удаление лишних.
------------------------------------------------------------
# docker start e0db
Этот мой контейнер конечно запустится, но он был создан без поддержки сети, поэтому для его запуска использую ранее приведёный скрипт.
# docker stop e0db

Выдать список образов:
# docker images
Здесь мы видим список сохранённых локально образов, на основе которых можно создать новый контейнер.
Удалить образ:
# docker rmi $name-image
Если образ уже задействован, то есть на основе его создан контейнер, то удалить образ не получится. Вначале необходимо удалить созданный контейнер(-ы) или:
 создать новый образ на основе мешающей связки (старый образ + контейнер = новый образ)
 удалить контейнер
 удалить старый образ
 создать новый контейнер на основе нового образа

Выдать список всех контейнеров:
# docker ps -a
Удалить заранее остановленный контейнер:
# docker stop $name-container

------------------------------------------------------------
Работа внутри контейнера
------------------------------------------------------------
Присоединяемся к контейнеру:
# docker attach e0db
жму энтер и попадаю в bash контейнера
root@db.e0.local:/# apt-get update
root@db.e0.local:/# apt-get upgrade
root@db.e0.local:/# exit

по команде exit я вываливаюсь из контейнера, который останавливается. Чтобы этого не происходило, выхожу из контейнера по нажатию Ctrl+P, Ctrl+Q. 

------------------------------------------------------------
Сохранение контейнера в библиотеку образов и в архив
------------------------------------------------------------
Создаём новый образ из образа ubuntu и созданного на его основе контейнера e0db:
# docker commit e0db e0db_20150619
Видим, что в локальной библиотеке образов появился новый образ e0db_20150619
# docker images

Сохраняем этот образ в файл:
# docker save e0db_20150619 | gzip > e0db_20150619.tar.gz

На новой машине можно добавить этот образ в локальный репозиторий командой:
# gunzip -c e0db_20150619.tar.gz | docker load
И создать на его основе новый контейнер:
# docker run --name e0mysql --net=none -h mysql.e0.local --dns 10.13.14.1 --dns-search=e0.local -it e0db__20150619 /bin/bash
root@mysql.e0.local:/#

-------------------------------------------------------------
Заготовка по пробросу портов изнутри контейнера на хост-машину
------------------------------------------------------------------
# docker run -it -h galera.e.local --name galera ubuntu /bin/bash
docker run -it -p 0.0.0.0:3306:3306 -p 0.0.0.0:4444:4444 -p 0.0.0.0:4567:4567 -p 0.0.0.0:4568:4568 --name galera galera_le0d0 /bin/bash (в данном случае всё равно слушаются указанные порты на ipv6. Но я вижу, что в галере появляются сообщения, говорящие, что ноды пытаются связаться через порты ipv4)

Tags: