Docker – система виртуализации, позволяющая запускать изолированные среды исполнения в рамках одной операционной системы.
Для реализации – используется система LXC (Linux Containers), аналог jails
во FreeBSD.
Установка выполняется на:
# lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 7.9 (wheezy) Release: 7.9 Codename: wheezy
Последнюю версию Docker-а можно найти тут>>>.
Содержание
Обновление Debian
Для работы Docker требуется ядро > 3.8, тогда как Debian 7 идёт с 3.2:
# uname -r 3.2.0-4-amd64
Однако, репозиторий wheezy-backports
содержит подходящее ядро, которое мы и установим.
Создаём файл /etc/apt/sources.list.d/wheezy-backports.list
с таким содержимым:
deb http://ftp.us.debian.org/debian wheezy-backports main
Обновляем списки пакетов:
# apt-get update
Устанавливаем ядро:
# apt-get -t wheezy-backports install linux-image-amd64
И перезагружаем машину:
# reboot
Проверяем:
# uname -r 3.16.0-0.bpo.4-amd64
Теперь у нас имеется ядро “из Debian Jessie“.
Примечание: хотя в 99% случаев у вас всё заработает – но можно выполнить дополнительную проверку.
Устанавливаем lxc
:
# aptitude install lxc
И выполняем:
# lxc-checkconfig Kernel config /proc/config.gz not found, looking in other places... Found kernel config file /boot/config-3.16.0-0.bpo.4-amd64 --- Namespaces --- Namespaces: enabled Utsname namespace: enabled Ipc namespace: enabled Pid namespace: enabled User namespace: enabled Network namespace: enabled Multiple /dev/pts instances: enabled --- Control groups --- Cgroup: enabled Cgroup clone_children flag: enabled Cgroup device: enabled Cgroup sched: enabled Cgroup cpu account: enabled Cgroup memory controller: missing Cgroup cpuset: enabled --- Misc --- Veth pair device: enabled Macvlan: enabled Vlan: enabled File capabilities: enabled
Если какой-то из параметров != enabled
– возможны проблемы.
Например, выше видно, что:
Cgroup memory controller: missing
Проверить – включен ли параметр на самом деле можно в файле конфигурации ядра, в данном случае – /boot/config-3.16.0-0.bpo.4-amd64
:
# cat /boot/config-3.16.0-0.bpo.4-amd64 | grep CGROUP CONFIG_CGROUPS=y # CONFIG_CGROUP_DEBUG is not set CONFIG_CGROUP_FREEZER=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y # CONFIG_CGROUP_HUGETLB is not set CONFIG_CGROUP_PERF=y CONFIG_CGROUP_SCHED=y CONFIG_BLK_CGROUP=y # CONFIG_DEBUG_BLK_CGROUP is not set CONFIG_NETFILTER_XT_MATCH_CGROUP=m CONFIG_NET_CLS_CGROUP=m CONFIG_CGROUP_NET_PRIO=y CONFIG_CGROUP_NET_CLASSID=y
Параметр, который отвечает за управление памятью в cgroups
называется CONFIG_CGROUP_MEM_RES_CTLR
.
Однако, в более новых версиях ядра (3.6 и выше?) – он был переименован в CONFIG_MEMCG
, который и включен в текущем ядре:
# cat /boot/config-3.16.0-0.bpo.4-amd64 | grep CONFIG_MEMCG CONFIG_MEMCG=y CONFIG_MEMCG_DISABLED=y CONFIG_MEMCG_SWAP=y
Судя по этому>>> посту – lxc-checkconfig
просто некорректно отображает эту информацию.
Установка Docker
Устанавливаем сам Docker:
# curl -sSL https://get.docker.com > docker.sh
# bash docker.sh ... Starting Docker: docker. + sh -c 'docker version' Client: Version: 1.8.2 API version: 1.20 Go version: go1.4.2 Git commit: 0a8c2e3 Built: Thu Sep 10 19:12:52 UTC 2015 OS/Arch: linux/amd64 Server: Version: 1.8.2 API version: 1.20 Go version: go1.4.2 Git commit: 0a8c2e3 Built: Thu Sep 10 19:12:52 UTC 2015 OS/Arch: linux/amd64
Проверяем установку:
# docker info Containers: 2 Images: 9 Storage Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs: 13 Dirperm1 Supported: true Execution Driver: native-0.2 Logging Driver: json-file Kernel Version: 3.16.0-0.bpo.4-amd64 Operating System: Debian GNU/Linux 7 (wheezy) CPUs: 1 Total Memory: 1.963 GiB Name: debian ID: TB7W:ORXE:4AFQ:Y3YA:7PKL:DQUW:OHWB:HBQF:CTLC:YAIY:3I4A:66WW
# docker --version Docker version 1.8.2, build 0a8c2e3
# docker run --rm hello-world ... Hello from Docker. This message shows that your installation appears to be working correctly. ...
Лог по умолчанию ведётся в файле /var/log/docker.log
.
Контейнеры и образы Docker
Система, которая запускается Docker-ом, называется “контейнером“, а команда запуска состоит из трёх частей:
Контейнер – это собственно сама “операционная система”, запущенная Docker-ом. Образ (image) – файл, представляющий собой эту операционную систему со всем необходимым набором ПО.
При выполнении команды docker run hello-world
– выполняются следующие действия:
- проверяется, если ли образ
hello-world
в локальном хранилище; - если он не найден – то выполняется поиск и загрузка указанного образа с Docker Hub, который является общедоступным хранилищем образов;
- образ загружается на машину с Docker и запускается.
Для примера – запустим контейнер с Debian Wheezy.
С помощью опций -i
(interactive) и -t
(pseudo-TTY) – откроем на него консоль, а с помощью --rm
– укажем на необходимость удалить контейнер после завершения работы с ним:
# docker run -it --rm debian:wheezy Unable to find image 'debian:wheezy' locally wheezy: Pulling from library/debian ba249489d0b6: Pull complete 19de96c112fc: Pull complete library/debian:wheezy: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security. Digest: sha256:90de9d4ecb9c954bdacd9fbcc58b431864e8023e42f8cc21782f2107054344e1 Status: Downloaded newer image for debian:wheezy root@c3e506110ca3:/#
Для проверки уже имеющихся образов – на хост-машине выполните:
# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE debian wheezy 19de96c112fc 2 weeks ago 84.92 MB
Проверить запущенные контейнеры можно так:
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c3e506110ca3 debian:wheezy "/bin/bash" About a minute ago Up About a minute lonely_meitner
Проверить все контейнеры, в том числе отключенные:
# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c3e506110ca3 debian:wheezy "/bin/bash" About a minute ago Up About a minute lonely_meitner
Удалить локальную копию образа можно так:
# docker rmi 19d Untagged: debian:wheezy Deleted: 19de96c112fcca5b6de16611dc0a359b0b977c551921ca79ac5cf4a8bfff9351 Deleted: ba249489d0b6512128b60a4910e78fa2000c785d59e0599188a6802bd01155f2
Где 19d – первые три цифры ID образа, полученные при помощи docker images
.
Можно использовать как полный ID – так и только первые три символа.
Удалить контейнер можно так:
# docker rm c3e506110ca3
Если контейнер запущен – то перед удалением его необходимо остановить:
# docker rm e8573f0e8b4a Error response from daemon: Cannot destroy container e8573f0e8b4a: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f Error: failed to remove containers: [e8573f0e8b4a]
# docker stop e8573f0e8b4a e8573f0e8b4a
# docker rm e8573f0e8b4a e8573f0e8b4a
Сеть и Docker
По умолчанию – Docker запускает контейнеры в аналоге NAT – контейтеры “видят” интернет, но к ним самим подключиться нельзя.
Однако при запуске контейнера – ему можно указать переадресацию портов.
Например:
# docker run -p 127.0.0.1:2222:22 -ti debian:wheezy WARNING: Your kernel does not support memory swappiness capabilities, memory swappiness discarded. root@091cafd860bc:/#
Тут мы запустили новый контейнер, и задали переадресацию с локального порта хост-машины 127.0.0.1:2222
на порт 22
контейнера:
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 00d472641904 debian:wheezy "/bin/bash" 3 seconds ago Up 2 seconds 127.0.0.1:2222->22/tcp jolly_poincare
# netstat -anp | grep 2222 tcp 0 0 127.0.0.1:2222 0.0.0.0:* LISTEN 8031/docker-proxy
# telnet localhost 2222 Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Connection closed by foreign host.
В контейнере – устанавливаем необъодимые пакеты и добавляем ключ:
# apt-get update # apt-get install vim # apt-get install openssh-server # service ssh start [ ok ] Starting OpenBSD Secure Shell server: sshd. # cd /root/ # mkdir .ssh && chmod 700 .ssh # vim .ssh/authorized_keys # cat .ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAA***kS304IZ root@debian
И пробуем подключиться с хоста:
# ssh -i /root/.ssh/root_docker_1 root@localhost -p 2222 The authenticity of host '[localhost]:2222 ([127.0.0.1]:2222)' can't be established. ECDSA key fingerprint is 7e:e9:d5:f0:a3:38:91:45:18:6a:ec:29:a3:b1:46:62. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '[localhost]:2222' (ECDSA) to the list of known hosts. Linux nameless 4.0.9-gentoo #2 SMP Mon Jul 27 14:48:24 PDT 2015 x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. root@b252450a4d4e:~#
Готово.
Продолжение – Docker: часть 2 — управление контейнерами.