Docker: часть 2 — управление контейнерами

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

docker_lxcПервая часть — тут>>>.

Запуск контейнеров

Как говорилось в первой части — Docker использует LXC для запуска и управления контейнерами.

Это значит, что в рамках одной хост-системы вы можете запустить любую ОС, которая будет совместима с ядром хоста.

Например, имеется Docker, работающий на Debian 7:

# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.9 (wheezy)
Release:        7.9
Codename:       wheezy

С ядром:

# uname -r
3.16.0-0.bpo.4-amd64

Попробуем запустить CentOS 7.

Находим образ:

# docker search centos
NAME                                        DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos                                      The official build of CentOS.                   1399      [OK]
...

Вместо того, что бы сразу запустить контейнер с новым образом, как было показано в первой части — образ сначала можно загрузить в локальное хранилище с помощью опции pull:

# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
47d44cb6f252: Pull complete
f6f39725d938: Pull complete
f9a8cbc8dd13: Pull complete
f37e6a610a37: Pull complete
0f73ae75014f: Pull complete
Digest: sha256:2d9573acf37315cb8fe2a1420769c3b83f59d8f286fd8898a580578c0d5e66c6
Status: Downloaded newer image for centos:latest

Теперь — его можно запускать локально:

# docker run -ti --rm centos
[root@cd8cc357e1c3 /]# cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)

Обратите внимание на ID в строке приглашения комндой строки контейнера: root@cd8cc357e1c3.

Если на хост-машине выполнить:

# docker ps | grep centos
cd8cc357e1c3        centos              "/bin/bash"         4 minutes ago       Up 4 minutes                                 ecstatic_jones

То вы увидите, что ID контейнера == ID в консоли.

Сохранение изменений в контейнерах

Установим в этом CentOS-контейнере vim:

# yum install vim
# vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jun 10 2014 06:55:55)

Если мы выйдем и выключим контейнер — то при следующем запуске из этого образа VIM в нём уже не будет.

Что бы сохранить состояние контейнера — выполняем:

# docker commit cd8cc357e1c3 centos_with_vim
656188e54ccedc2fa26e353ced56a8ccb5be41fbc59e7f959c1407f99458023f

Где cd8cc357e1c3 — ID контейнера, а centos_with_vim — имя, под которым мы хотим его потом использовать:

# docker images | grep centos
centos_with_vim     latest              656188e54cce        52 seconds ago      298.2 MB
centos              latest              0f73ae75014f        3 weeks ago         172.3 MB

Запускаем его:

# docker run -ti --rm centos_with_vim
...
[root@cbe40ad5ccdd /]# vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jun 10 2014 06:55:55)

Другой вариант запустить контейнер и выполнить в нём команду — указать её после имени образа, который будет запущен:

# docker run -ti --rm centos_with_vim vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jun 10 2014 06:55:55)

Docker save и export — сохранение контейнера или образа

Кратко о разнице между save и export:

  • save — создаёт копию гостевой операционной системы, аналог ISO-образа;
  • export — создаёт копию контейнера.

Пример Docker save

Находим необходимый нам образ:

# docker images | grep vim
centos_with_vim     latest              656188e54cce        37 minutes ago      298.2 MB

Создаём его копию:

# docker save centos_with_vim > /home/setevoy/centos_with_vim.tar

Копируем архив на другой хост с Docker:

# scp /home/setevoy/centos_with_vim.tar setevoy@172.29.79.27:/home/setevoy

Проверяем имеющиеся образы:

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE

А теперь добавляем образ из созданной копии с помощью load:

# docker load < /home/setevoy/centos_with_vim.tar

Проверяем:

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos_with_vim     latest              656188e54cce        57 minutes ago      298.2 MB

Запускаем:

 # docker run -ti --rm centos_with_vim vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jun 10 2014 06:55:55)
...

Пример Docker export

На первом Docker-хосте находим ID нужного контейнера:

# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
cd8cc357e1c3        centos              "/bin/bash"         About an hour ago   Up About an hour                             ecstatic_jones

Експортируем его:

# docker export cd8cc357e1c3 > /home/setevoy/centos_with_vim_export.tar

Проверяем:

# tar tf /home/setevoy/centos_with_vim_export.tar  | head
.dockerenv
.dockerinit
bin
dev/
dev/console
dev/pts/
dev/shm/
etc/
etc/.pwd.lock
etc/BUILDTIME
...
 # ls -lh /home/setevoy/ | grep cent
-rw-r--r-- 1 root root 280M Sep 29 05:14 centos_with_vim_export.tar
-rw-r--r-- 1 root root 295M Sep 29 04:52 centos_with_vim.tar

Копируем его на тот же удалённый хост со вторым Docker, и пробуем там запустить:

# cat /home/setevoy/centos_with_vim_export.tar | docker import - centos_with_vim_export:exported
12b806f347a44cdf864f2518010ca5b1ef05a2894f04a5ddfe1545949c4df7d0
# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos_with_vim_export   exported            12b806f347a4        8 seconds ago       282 MB
centos_with_vim          latest              656188e54cce        About an hour ago   298.2 MB

Пробуем его запустить:

# docker run --rm centos_with_vim_export:exported vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jun 10 2014 06:55:55)
...

Больше информации — тут>>> и тут>>>.