Образовательный проект «SnakeProject» Михаила Козлова

Навигация

⇒ FreeBSD and Nix ⇐

CISCO

Voice(Asterisk\Cisco)

Microsoft

Powershell

Python

SQL\T-SQL

Общая

WEB Разработка

ORACLE SQL \ JAVA

Мото

Стрельба, пневматика, оружие

Саморазвитие и психология


Знакомство с Docker часть 3


 

Знакомство с Docker часть 3


Предыдущая часть:
http://snakeproject.ru/rubric/article.php?art=docker_2_01.2019


При запуске контейнера, если образа нет, он скачивается:

docker run -it ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
84ed7d2f608f: Pull complete
be2bf1c4a48d: Pull complete
a5bdc6303093: Pull complete
e9055237d68d: Pull complete
Digest: sha256:868fd30a0e47b8d8ac485df174795b5e2fe8a6c8f056cc707b232d65b8a1ab68
Status: Downloaded newer image for ubuntu:latest

 

Тут мы видим:
84ed7d2f608f, be2bf1c4a48d, a5bdc6303093, e9055237d68d
Это - слои, образ в докере состоит из слоев


Слои в терминологии докера называются "образами", что может вводить в заблуждение
Т.е. образ может содержать внутри себя слои "образы"

Т.е. к примеру образ Centos имеет:
Базовый образ 0 (файловая система и директории минимально нужные для запуска)
Образ 1 (на пример какое-то установленное ПО, веб-сервер, базы данных и т.п.)
Образ 2 (на пример еще какое-то установленное ПО или обновления)
и т.д.

Т.е. мы будем иметь в нашем случае три разных образа одного образа...

Все слои монтируются в режиме для чтения, поверх монтируется слой с возможностью перезаписи

При запуске контейнера еще монтируется слой bootfs перед базовым, после запуска контейнера он исчезает


Unable to find image 'ubuntu:latest' locally
Где 'ubuntu:latest':
Означает версию, если явно не указывать, то будет скачана последняя версия - latest

 

docker pull ubuntu - скачает последнюю версию образа ubuntu

docker pull -a ubuntu - скачает все версии образов ubuntu


Список скачанных образов:
docker images ubuntu
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              14.04               7e4b16ae8b23        3 weeks ago         188MB
ubuntu              latest              1d9c17228a9e        3 weeks ago         86.7MB
ubuntu              14.04.5             132b7427a3b4        19 months ago       188MB
ubuntu              12.04               5b117edd0b76        21 months ago       104MB
ubuntu              12.04.5             5b117edd0b76        21 months ago       104MB
ubuntu              14.04.4             0ccb13bf1954        2 years ago         188MB
ubuntu              14.04.3             3876b81b5a81        3 years ago         188MB
ubuntu              14.04.2             44ae5d2a191e        3 years ago         188MB
ubuntu              14.10               a8a2ba3ce1a3        3 years ago         194MB
ubuntu              14.04.1             ab1bd63e0321        3 years ago         188MB
ubuntu              12.10               3e314f95dcac        4 years ago         172MB

Тэги говорят нам о версии образа

ID образа, например 5b117edd0b76 повторяется дважды, указывает на один и тот-же образ


На диске образы будут храниться в /var/lib/docker/{driver-name}
По умолчанию это будет aufs, но может быть и overlay, overlay2, btrfs, devicemapper или zfs

 

Смена директории Docker

Делайте бэкапы перед сменой директории!!!

Расположение Docker по умолчанию - /var/lib/docker
Все существующие образы и контейнеры хранятся здесь
Если запущены какие-либо контейнеры, остановите, затем определите драйвер хранилища, используемый Docker
docker info
Docker Root Dir: /var/lib/docker


Создание файла Drop-In

Следующим шагом является создание файла вставки "docker.conf" в /etc/systemd/system/docker.service.d
По умолчанию, каталог docker.service.d не будет присутствовать, вам придется его создать


systemctl stop docker
mkdir /etc/systemd/system/docker.service.d
touch /etc/systemd/system/docker.service.d/docker.conf


Определить новое место хранения (на моей машине драйвер изначально при дефолтной установке определился как overlay2):
vi /etc/systemd/system/docker.service.d/docker.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --graph=/data/docker --storage-driver=overlay2


Копируем директорию докера:
cp -r /var/lib/docker /data/


systemctl daemon-reload && systemctl start docker


Проверяем:
ps -ax | grep docker
9804 ?        Ssl    0:00 /usr/bin/dockerd --graph=/data/docker --storage-driver=overlay2

docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              14.04               7e4b16ae8b23        3 weeks ago         188MB
ubuntu              latest              1d9c17228a9e        3 weeks ago         86.7MB
centos              latest              1e1148e4cc2c        6 weeks ago         202MB
ubuntu              14.04.5             132b7427a3b4        19 months ago       188MB
ubuntu              12.04               5b117edd0b76        21 months ago       104MB
ubuntu              12.04.5             5b117edd0b76        21 months ago       104MB
ubuntu              14.04.4             0ccb13bf1954        2 years ago         188MB
ubuntu              14.04.3             3876b81b5a81        3 years ago         188MB
ubuntu              14.04.2             44ae5d2a191e        3 years ago         188MB
ubuntu              14.10               a8a2ba3ce1a3        3 years ago         194MB
ubuntu              14.04.1             ab1bd63e0321        3 years ago         188MB
ubuntu              12.10               3e314f95dcac        4 years ago         172MB


Вариант без копирования\переноса директории сделать символическую ссылку и не создавть конфигурационный файл:
ln -s /data/docker /var/lib/docker

 

Подключиться к ранее запущенному контейнеру можно например по CONTAINER ID или NAMES:
docker ps -a
CONTAINER ID IMAGE  COMMAND     CREATED        STATUS                    PORTS    NAMES
3eedb76b59d1 ubuntu "/bin/bash" 17 seconds ago Exited (0) 10 seconds ago          modest_fermat


docker attach 3eedb76b59d1
You cannot attach to a stopped container, start it first


Необходимо стартануть конетейнер прежде:
docker start 3eedb76b59d1


По выходу с помощью "Exit" контейнер снова остановится
Для выхода без остановки используйте сочетание клавиш Right Ctrl + P + Q


Выполнить команду не заходя в контейнер:
docker run centos /bin/bash -c "echo 'testfile' > /tmp/testfile"

Видим наш контейнер:
docker ps -a
CONTAINER ID   IMAGE    COMMAND                  ...
34042afce686   centos   "/bin/bash -c 'echo …"   ...

Создадим новый образ с именем "NewImageName", который будет иметь все изменения:
docker commit 34042afce686 newimagename
sha256:9af4feb50b2c1b896bc93974efc9a5bc15d049f95fbfcb4bd3197a2eca737bb2

docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
newimagename        latest              9af4feb50b2c        16 seconds ago      202MB

Посмотрим историю изменений образа:
docker history newimagename
IMAGE               CREATED              CREATED BY                                      ...
9af4feb50b2c        About a minute ago   /bin/bash -c echo 'testfile' > /tmp/testfile    ...


Сохранить образ в файл:
docker save -o /tmp/newimagename.tar newimagename


Развернуть этот файл на любом другом сервере docker, сначала посмотрим содержимое архива:
tar -tf /tmp/newimagename.tar
9af4feb50b2c1b896bc93974efc9a5bc15d049f95fbfcb4bd3197a2eca737bb2.json
a95c45423f187795e35dab840f24cbf66549bec52fdc419f7c96296f375f5530/
a95c45423f187795e35dab840f24cbf66549bec52fdc419f7c96296f375f5530/VERSION
a95c45423f187795e35dab840f24cbf66549bec52fdc419f7c96296f375f5530/json
a95c45423f187795e35dab840f24cbf66549bec52fdc419f7c96296f375f5530/layer.tar
f6afe6d9be35217c08579ac3d29894892d4871dccc98916b285f5e13c942a8a6/
f6afe6d9be35217c08579ac3d29894892d4871dccc98916b285f5e13c942a8a6/VERSION
f6afe6d9be35217c08579ac3d29894892d4871dccc98916b285f5e13c942a8a6/json
f6afe6d9be35217c08579ac3d29894892d4871dccc98916b285f5e13c942a8a6/layer.tar
manifest.json
repositories


Развернуть файл в докер:
docker load -i /tmp/newimagename.tar
Loaded image: newimagename:latest


Запустить контейнер:
docker run -it newimagename /bin/bash

Проверяем:
cat /tmp/testfile
testfile


Запустим долгоиграющую команду и выйдем Right Ctrl + P + Q:
ping 8.8.8.8 -c 50


Узнаем id нашего контейнера:
docker ps
CONTAINER ID IMAGE        COMMAND     CREATED           STATUS           PORTS NAMES
93ad8ebb3170 newimagename "/bin/bash" About an hour ago Up About an hour       frosty_hodgkin


Посмотрим процессы, запущенные внутри контейнера:
docker top 93ad8ebb3170
UID   PID    PPID  C STIME TTY TIME     CMD
root  11027  11010 0 14:48 ?   00:00:00 /bin/bash
root  11226  11027 0 15:34 ?   00:00:00 ping 8.8.8.8


Дать команду существующему контейнеру в интерактивном или фоновом режиме:

docker exec -it 93ad8ebb3170 ping 8.8.8.8 -c 10

docker exec -it -d 93ad8ebb3170 ping 8.8.8.8 -c 10

docker top 93ad8ebb3170
UID  PID    PPID   ...  CMD
root 11027  11010  ...  /bin/bash
root 12475  11010  ...  ping 8.8.8.8

 

Физически конетейнеры хранятся по умолчанию в папке:
/var/lib/docker/containers/


Информацию по контейнеру можно вывести так:
docker inspect 93ad8ebb3170

По сути это 2 файла json, физически находящихся внутри папки контейнера:
ls -l /data/docker/containers/...81dfa82bdf6c97849358.../ | grep "\.json"
-rw------- 1 root root 2787 Jan 21 14:35 config.v2.json
-rw-r--r-- 1 root root 1421 Jan 21 14:35 hostconfig.json


Удалить запущенный контейнер:
docker rm 93ad8ebb3170 -f

 

docker attach подключает нас к процессу с pid 1
Если мы пробовали на конетейнерах с оболочкой, запущенной с pid 1
Машина например с веб-сервером нам не ответит взаимностью
Посему можно использовать ssh или nsenter

ns - сокращение от namespace

nsenter получает pid контейнера, который мы можем узнать с помощью docker inspect


Пример, загрузим контейнер и подключимся:

docker pull nginx
docker run -d library/nginx

docker ps
CONTAINER ID  IMAGE
67d66a2aac63  nginx


docker inspect 67d66a2aac63 | grep "Pid"
            "Pid": 13222,
            "PidMode": "",
            "PidsLimit": 0,


nsenter -m -u -n -p -i -t 13222 /bin/bash
/usr/sbin/nginx -v
nginx version: nginx/1.15.8
exit

При выходе из контейнера - exit, контейнер не остановится т.к. не будет закончен процесс с pid 1

 

Более простой вариант подключения (принимает CONTAINER ID или NAMES):
docker exec -it 67d66a2aac63 /bin/bash
/usr/sbin/nginx -v
nginx version: nginx/1.15.8
exit

При выходе из контейнера - exit, контейнер не остановится т.к. не будет закончен процесс с pid 1

 


Комментарии пользователей

Эту новость ещё не комментировалиНаписать комментарий
Анонимам нельзя оставоять комментарии, зарегистрируйтесь!

Контакты Группа ВК Сборник материалов по Cisco, Asterisk, Windows Server, Python и Django, SQL и T-SQL, FreeBSD и LinuxКод обмена баннерами Видео к IT статьям на YoutubeВидео на другие темы Смотреть
Мои друзья: Советы, помощь, инструменты для сис.админа, статическая и динамическая маршрутизация, FreeBSD

© Snakeproject.ru создан в 2013 году.
При копировании материала с сайта - оставьте ссылку.

Рейтинг@Mail.ru
Рейтинг@Mail.ru Яндекс.Метрика





Поддержать автора и проект