Docker: часть 1 – введение, установка и запуск

Автор: | 29/09/2015
 

docker_lxcDocker – система виртуализации, позволяющая запускать изолированные среды исполнения в рамках одной операционной системы.

Для реализации – используется система 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-ом, называется “контейнером“, а команда запуска состоит из трёх частей:

container_explainer

Контейнер – это собственно сама “операционная система”, запущенная 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 — управление контейнерами.