Docker volume: Use volumes | Docker Documentation
Начало работы с Docker. Часть третья. Категория: ОС Linux • Разное
Что такое Docker Volumes
Том — это файловая система, которая расположена на хост-машине за пределами контейнеров. Тома представляют собой средства для постоянного хранения информации и могут совместно использоваться разными контейнерами. Созданием и управлением томами занимается Docker.
Попробуем просто создать несколько томов:
$ docker volume create --name data-www $ docker volume create --name data-sql $ docker volume create --name data-tmp
Для того, чтобы просмотреть список томов:
$ docker volume ls DRIVER VOLUME NAME local data-sql local data-tmp local data-www
Посмотреть информацию об отдельном томе:
$ docker volume inspect data-www [ { "CreatedAt": "2020-03-20T14:44:01+03:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/data-www/_data", "Name": "data-www", "Options": {}, "Scope": "local" } ]
Если том больше не нужен, его можно удалить:
$ docker volume rm data-tmp
Чтобы удалить все тома, которые не используются контейнерами:
$ docker volume prune
Теперь смонтируем том data-www
при запуске контейнера:
$ docker run -it -v data-www:/var/www ubuntu:latest # mkdir /var/www/html # touch /var/www/html/index.php # exit
Если вспомнить, что данные тома находятся в /var/lib/docker/volumes/data-www/_data
, то теперь в этой директории есть поддиректория html
, а внутри поддиректории — файл index.php
.
Инструкция VOLUME в Dockerfile
Эта инструкция устарела и использовать ее не рекомендуется. Но давайте все таки познакомимся с ней поближе для общего понимания. Создадим в домашней директории каталог test
и внутри него — файл Dockerfile
:
$ cd ~ $ mkdir test $ cd test $ nano Dockerfile
FROM ubuntu:latest VOLUME /etc
Соберем образ из этого Dockerfile
:
$ docker build . --tag ubuntu-share-etc
Запустим новый контейнер:
$ docker run -it --name share-etc ubuntu-share-etc
Теперь посмотрим, какие тома существуют:
$ docker volume ls DRIVER VOLUME NAME local 8bda345c875c99d61f9646a9b0922934a7eaab83366c04159f6023654237f090 local data-sql local data-www
Где физически расположены тома, мы уже знаем. Так что посмотрим содержимое нового тома:
$ cd ~ $ sudo ls /var/lib/docker/volumes/8bda345c875c99d61f9646a9b0922934a7eaab83366c04159f6023654237f090/_data/ adduser.conf debconf.conf fstab hosts ld.so.conf lsb-release opt profile.d rc5.d security subuid alternatives debian_version gai.conf init.d ld.so.conf.d machine-id os-release rc0.d rc6.d selinux sysctl.conf apt default group issue legal mke2fs.conf pam.conf rc1.d rcS.d shadow sysctl.d bash.bashrc deluser.conf gshadow issue.net libaudit.conf mtab pam.d rc2.d resolv.conf shells systemd bindresvport.blacklist dpkg host.conf kernel login.defs networks passwd rc3.d rmt skel terminfo cron.daily environment hostname ld.so.cache logrotate.d nsswitch.conf profile rc4.d securetty subgid update-motd.d
Это содержимое каталога /etc
контейнера. Так что мы можем, используя инструкцию VOLUME
, сохранять на основной системе любые директории контейнера. И при удалении контейнера тома будут по-прежнему существовать. Впрочем, можно вместе с удалением контейнера удалить и связанный с ним том:
$ docker container rm -v share-etc
Был удален контейнер share-etc
и связанный с ним том 8bda345c875c99d61f9646a9b0922934a7eaab83366c04159f6023654237f090
.
Порты контейнера
Docker позволяет получить доступ к какому-то из портов контейнера, пробросив его наружу — в основную операционную систему. По умолчанию, мы не можем достучаться к какому-либо порту контейнера. Однако, интсрукция EXPOSE
в Dockerfile
позволяет объявить, к какому из портов можно обратиться из основной системы.
Создадим в домашней директории каталог www
и внутри него — файлы Dockerfile
и index.php
:
$ cd ~ $ mkdir www $ cd www
$ nano Dockerfile
# Образ с DockerHub, включает Apache и PHP FROM php:7.2-apache # Копируем все файлы проекта в контейнер COPY . /var/www/html # Сообщаем, какие порты контейнера слушать EXPOSE 80
$ nano index.php
<h2>Hello from Apache</h2> <?php phpinfo(); ?>
Создадим новый образ из Dockerfile
:
$ docker build . --tag apache-php72
Запустим контейнер и укажем, что порт 80 контейнера будет связан с портом 8080 хоста:
$ docker run -p 8080:80 apache-php72 AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.4. Set the 'ServerName' directive globally to suppress this message AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.4. Set the 'ServerName' directive globally to suppress this message [Sat Mar 21 10:19:35.224973 2020] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.38 (Debian) PHP/7.2.29 configured -- resuming normal operations [Sat Mar 21 10:19:35.233317 2020] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
Запускаем браузер и открываем http://localhost:8080
:
Установка Docker Compose
Docker применяется для управления отдельными контейнерами (сервисами), из которых состоит приложение. Docker Compose используется для одновременного управления несколькими контейнерами, входящими в состав приложения. Этот инструмент предлагает те же возможности, что и Docker, но позволяет работать с более сложными приложениями.
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" \ > -o /usr/local/bin/docker-compose $ sudo chmod +x /usr/local/bin/docker-compose $ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
$ docker-compose --version docker-compose version 1.25.4, build 8d51620a
Файл docker-compose.yml
Набор сервисов, которые нужны для работы приложения, определяется с помощью файла docker-compose.yml
. У нас уже есть директория www
— создадим в ней еще один файл:
$ nano docker-compose.yml
version: '3' services: app: build: context: . ports: - 8080:80
Теперь построчно разберёмся с параметрами:
version
— какая версияdocker-compose.yml
используетсяservices
— контейнеры, которые нужно запуститьapp
— имя сервиса, может быть любым, но осмысленнымbuild
— шаги, описывающие процесс билдингаcontext
— где находитсяDockerfile
для контейнераports
— соответствие портов хоста и контейнера
Теперь проект надо собрать — это похоже на сборку образа в Docker, но здесь идет сборка нескольких образов. Хотя в нашем случае образ всего один:
$ docker-compose build
Проверим, что был создан новый образ:
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE -------------------------------------------------------------------------------------------- www_app latest ce3c26a2cb52 17 seconds ago 410MB apache-php72 latest eb9a7fb87880 22 hours ago 410MB ubuntu-share-etc latest ebc1eef0eca3 42 hours ago 64.2MB php 7.2-apache 4e96f7d06518 2 days ago 410MB php-cli-script latest 9fff2bf618ad 2 days ago 398MB tokmakov/apache2_ubuntu latest 18073a80c28b 3 days ago 191MB php 7.2-cli 555ec78042a1 3 weeks ago 398MB ubuntu latest 72300a873c2c 4 weeks ago 64.2MB hello-world latest fce289e99eb9 14 months ago 1.84kB
Теперь запустим эти сервисы, которые создали (хотя у нас всего один сервис):
$ docker-compose up Creating network "www_default" with the default driver Creating www_app_1 ... done Attaching to www_app_1 app_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.2. Set the 'ServerName' directive globally to suppress this message app_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.2. Set the 'ServerName' directive globally to suppress this message app_1 | [Sun Mar 22 08:31:46.482140 2020] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.38 (Debian) PHP/7.2.29 configured -- resuming normal operations app_1 | [Sun Mar 22 08:31:46.486761 2020] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
Запускаем браузер и открываем http://localhost:8080
:
Остановим работу контейнера с помощью Ctrl+C
и посмотрим на список контейнеров:
$ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -------------------------------------------------------------------------------------------------------------------------------- d06fb87577e6 www_app "docker-php-entrypoi…" 13 minutes ago Exited (0) 27 seconds ago www_app_1 a6e37dee6924 apache-php72 "docker-php-entrypoi…" 2 hours ago Exited (0) 2 hours ago beautiful_turing ................................................................................................................................ 8aa1a9458932 php-cli-script "php /script.php 8" 2 days ago Exited (0) 2 days ago optimistic_maxwell 37def446ae84 ubuntu "/bin/bash" 4 days ago Exited (0) 2 days ago apache2_ubuntu
Поиск:
CLI • Docker • Linux • Ubuntu • Виртуализация • Команда • Настройка • Процесс • Установка
В случае Docker данные будут храниться внутри контейнера.
И когда мы удалим контейнер, все данные будут потеряны.
В этом руководстве мы узнаем, как создавать тома Docker, как подключать их к контейнерам и как один и тот же том можно использовать для хранения данных в двух или более контейнерах.
Если вы еще не знаете основ Docker, обратитесь к следующему руководству:
Почему нам нужны тома для Docker?
- При удалении контейнеров тома не будут удалены.
- Присоединяйте или отсоединяйте тома к контейнерам.
- Позволяет разделить тома (хранилище / данные) между различными контейнерами.
- Позволяет отделение контейнеров от хранилиша.
- Позволяет Хранить том на удаленном хосте или в облаке.
Мы можем иметь логическое разделение данных, а также контейнер.
Мы можем сохранить данные таким образом, что если мы удалим контейнер, то и наши данные все равно будут присутствовать на хосте.
Таким образом, после уничтожения контейнера мы можем присоединить отом к любым существующим контейнерам, а также к новым контейнерам.
Начало работы с томами Docker
Команда docker volume отобразит подробную информацию о командах volume, с помощью которых мы можем создать том, проверить подробные данные тома, перечислить доступные тома и удалить их.
Создание томов Docker
Синтаксис для создания тома Docker:
docker volume create <volume_name>
Пример:
# docker volume create devops_volume
Приведенная выше команда создаст том Docker с именем devops_volume.
Список Docker томов
Чтобы показать список всех созданных томов Docker, запустите:
# docker volume ls
Проверка томов Docker
Команда docker volume inspect предоставит вам подробную информацию о создании тома, расположении, имени и области действия.
Синтаксис:
docker volume inspect <volume_name>
Позвольте мне показать вам детали тома Docker с именем devops_volume.
# docker volume inspect devops_volume
Создание контейнеров с прикрепленным к ним томом
Синтаксис:
docker container create --name <container_name> -it --mount source<volume_name>,target=/<folder_Name> <image_name>
Пример:
# docker container create --name myBusyBox1 -it --mount source=devops_volume,target=/app busybox
Чтобы проверить, был ли создан контейнер, используйте команду docker ps -a:
Удалить тома Docker
Синтаксис для удаления тома:
docker volume rm <volume_name>
Давайте удалим том с именем devops_volume.
# docker volume rm devops_volume
На снимке экрана показано, что мы пытаемся удалить том, но не можем удалить его, потому что том уже используется.
Итак, во-первых, нам нужно убить контейнер и освободить том.
И тогда мы можем удалить его.
Для этого сначала удалите все работающие контейнеры, используя команду:
# docker rm –f $(docker ps -aq)
А затем удалите том:
# docker volume rm devops_volume
Удалить все тома одновременно
Используя команду docker rm, мы можем удалять один том за раз.
Если у нас есть несколько томов и мы хотим удалить все тома, мы должны использовать команду prune.
Давайте создадим несколько томов:
Теперь удалите все тома Docker одновременно, используя команду:
# docker volume prune
Видите?
Мы удалили все тома за один раз.
Поделитесь статьей:
docker compose volumes, сохранение данных на диске
В docker compose volumes — логические тома, которые задаются для каждого контейнера. Это директива в файле, определяющая связь точки монтирования на диске с другой точкой монтирования в контейнере. Все, что находится в volumes сохраняется на диске после удаления контейнера. Остальные данные хранятся в памяти.
Основное предназначение Docker в быстром разворачивании окружения на любой машине из готовых образов, которые можно дорабатывать. Контейнер — временная структура, все изменения выполненные в нем существуют пока существует сам контейнер. На диске данные не сохраняются если они не вынесены в постоянную структуру — volume.
Для примера возьмем с dockerhub инструкцию для образа с wordpress, в немного измененном виде будем использовать ее.
Проект будет представлять собой сайт на wordpress с базой данных MySQL.
Сразу создадим каталоги под сайт и базу на хост машине. За счет биндинга они будут связаны с контейнерами
mkdir -p /home/site/db
На машине должны быть установлены сам Docker и docker-compose. Создаем docker-compose.yml
cd /home && mcedit docker-compose.yml
version: '2' services: wordpress: image: wordpress restart: always ports: - 8080:80 environment: WORDPRESS_DB_PASSWORD: example links: - mysql:db volumes: - /home/site:/var/www/html mysql: image: mysql:5.7 restart: always environment: MYSQL_ROOT_PASSWORD: example volumes: - /home/site/db:/var/lib/mysql
В файле 2 сервиса. Структура типовая, 80 порт из контейнера пробрасывается на порт 8080 хост машины. Используются стандартные образы с dockerhub.
Для каждого контейнера заданы блоки volumes:
— /home/site:/var/www/html для сайта
— /home/site/db:/var/lib/mysql для базы данных
Они определяют, что данные из временной структуры — контейнера будут сохраняться на хост машине.
Содержимое /var/www/html в /home/site, содержимое /var/lib/mysql в/home/site/db
Эта информация будет изменена при жизни контейнера и останется на хост машине после его удаления.
Запустим контейнеры
docker-compose -f docker-compose.yml up -d
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bf264537c63d wordpress «docker-entrypoint.s…» About a minute ago Up About a minute 0.0.0.0:8080->80/tcp home_wordpress_1
ae9cd7efb0a8 mysql:5.7 «docker-entrypoint.s…» About a minute ago Up About a minute 3306/tcp, 33060/tcp home_mysql_1
Они успешно стартовали, с хоста обращаться к сервису можно только по порту 8080, на который пробрасываются запросы.
netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 851/sshd
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 1049/master
tcp 0 0 91.226.83.234:10010 0.0.0.0:* LISTEN 31694/docker-contai
tcp6 0 0 :::8080 :::* LISTEN 24286/docker-proxy
tcp6 0 0 :::22 :::* LISTEN 851/sshd
В браузере обратившись к IP адресу серверу и порту 8080 можно запустить установку CMS, затем попасть в административный раздел.
Внесем минимальные изменения в структуру перового поста. Поменяем заголовок «Hello World» на «Hello Docker» и единственное существующее по-умолчанию предложение.
Пересоздадим существующую структуру
Останавливаем контейнеры
docker-compose stop
И удаляем их
docker-compose rm
Going to remove home_wordpress_1, home_mysql_1
Are you sure? [yN] y
Removing home_wordpress_1 … done
Removing home_mysql_1 … done
Контейнеров нет, с ключем -a выводятся все контейнеры, в т.ч. незапущенные
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Файлы при этом сохранены на диске
ls /home/site/
db readme.html wp-blog-header.php wp-config-sample.php wp-includes wp-login.php wp-signup.php
index.php wp-activate.php wp-comments-post.php wp-content wp-links-opml.php wp-mail.php wp-trackback.php
license.txt wp-admin wp-config.php wp-cron.php wp-load.php wp-settings.php xmlrpc.php
Также как и содержимое /var/lib/mysql из контейнера
ls /home/site/db/
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 performance_schema public_key.pem server-key.pem wordpress
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 mysql private_key.pem server-cert.pem sys
При обращении к тому же URL:8080 сейчас будет возникать ошибка — веб-сервер, являющийся частью контейнера не работает.
Запускаем контейнеры через docker-compose вновь
docker-compose -f docker-compose.yml up -d
Creating home_mysql_1
Creating home_wordpress_1
Сейчас можно убедиться в том, что сайт вновь стал открываться и контент отображается в том же виде. При старте информация из docker-compose.yml считалась.
Были задействованы те же каталоги, что использовались ранее, с имеющимися данными.
Читайте про управление контейнерами вручную. В docker compose volumes задаются в файлы, при ручном создании контейнера их можно указывать с ключем -v.
Эксперименты с докерными volumes
Я понял что я не до конца понимаю как все устроно в docker volumes, поэтому
решил провести пару экспериментов.
В документации написано что бываеют 2 штуки:
- Data volumes
- Data volume containers
Эксперимент 1. Пробрасывание локальной папки в докер.
Итак, у меня есть хост машина по имени air и на ней я запускаю контейнер. Хочу
сделать так чтобы папка /Users/bessarabov/e1 из хост машины была доступна в
контейнере как /e1
docker run \
-it \
--volume /Users/bessarabov/e1:/e1 \
ubuntu:14.04 \
/bin/bash
Создаю в контейнере файл:
root@6c9da8f68a9e:/# echo 'from container' > /e1/1
И убеждаюсь что он виден на хост машине:
bessarabov@5:~/e1$ cat 1
from container
И проверяю что это работает в обратную сторону. Создаю файл на хост машине:
bessarabov@5:~/e1$ echo 'from host' > 2
И в контейнере он появился:
root@6c9da8f68a9e:/# cat /e1/2
from host
Эксперимент 2. Какие настройки контейнера?
Продолжаю работать с контейнером из эксперимента 1. На хост машине запускаю
команду чтобы посмотреть настройки контейнера:
$ docker inspect --format="{{.Volumes}}" 6c9da8f68a9e
map[/e1:/Users/bessarabov/e1]
А вот полный вывод команды ‘docker inspect 6c9da8f68a9e’.
Эксперимент 3. —volumes-from
Продолжаю работать с тем же конейнером. Хочу понять как будет действовать
команда —volumes-from. Запускаю новый контейнер:
docker run \
-it \
--volumes-from 6c9da8f68a9e \
ubuntu:14.04 \
/bin/bash
Смотрю на хост машине его настроки:
$ docker inspect --format="{{.Volumes}}" 27f31c5bc0ee
map[/e1:/Users/bessarabov/e1]
А вот полный вывод команды ‘docker inspect 27f31c5bc0ee’.
А вот diff этих двух inspect.
Эксперимент 4. —volume с одним параметром
Создаю новый контейнер. Но в отличии от эксперимента 1, передаю только один
параметр в —volume:
docker run \
-it \
--volume /e4 \
ubuntu:14.04 \
/bin/bash
Вот его настройки:
$ docker inspect --format="{{.Volumes}}" d1849bdd9153
map[/e4:/mnt/sda1/var/lib/docker/vfs/dir/56ce42d7366c198780ed3aa3dfed0a1c194a89cbfc6fa83121f07a58a28ff7ef]
И полный вывод команды docker inspect.
В контенере создаю файл
root@d1849bdd9153:/# echo 'from container e4' > /e4/4
Папки по имени /mnt/sda1/var/lib/docker/vfs/dir/56ce42d7366c198780ed3aa3dfed0a1c194a89cbfc6fa83121f07a58a28ff7ef
на моем маке не оказалось. Я залез в виртуальную машину докера ‘boot2docker ssh’
и там такая папка обнаружилась (только пришлось сделать sudo su):
root@boot2docker:~# cat /mnt/sda1/var/lib/docker/vfs/dir/56ce42d7366c198780ed3aa3dfed0a1c194a89cbfc6fa83121f07a58a28ff7ef/4
from container e4
Эксперимент 5. Еще один контейнер и —volumes-from
Создаю новый, но подключаю к новому все volumes из контенера, созданного в
эксперименте 4.
docker run \
-it \
--volumes-from d1849bdd9153 \
ubuntu:14.04 \
/bin/bash
В этом новом контенере я вижу то же что и прошлый раз:
root@77431816df7d:/# cat /e4/4
from container e4
Смотрю на хост машине данне об про этот контенер и вижу точно такие же
настройки, как и в случае эксперимента 4:
$ docker inspect --format="{{.Volumes}}" 77431816df7d
map[/e4:/mnt/sda1/var/lib/docker/vfs/dir/56ce42d7366c198780ed3aa3dfed0a1c194a89cbfc6fa83121f07a58a28ff7ef]
Ну и полный вывод команды docker inspect.
Резюме и TODO
После того как я провел все эти небольшие эксперименты и еще раз прочитал
доку, все стало понятнее.
Но еще остались моменты, которые я хочу прояснить.
Во первых, можно ли создать контенер в котором создан volume /data, а потом
прикрутить этот volume в другой контенер по другому пути (например, /site).
Во вторых, хочу проэксперементирвать, чтобы убедится что вот эта фраза правда:
If you remove containers that mount volumes, including the initial dbdata
container, or the subsequent containers db1 and db2, the volumes will not be
deleted. To delete the volume from disk, you must explicitly call docker rm -v
against the last container with a reference to the volume. This allows you to
upgrade, or effectively migrate data volumes between containers.
(у меня, нет причин не доверять документации докера, но если это правда, то
получается что все что все volumes продолжают хранится на машине на которой
живет докер).
Иван Бессарабов
[email protected]
11 ноября 2014
Продвинутое конфигурирование Docker Compose (перевод)
Docker Compose обладает целым рядом нетривиальных способов применения, которые мы рассмотрим в этой заметке. Это очередной перевод статьи, которую мы разбирали при подготовке материалов нашего курса Python для Web-разработки.
Контроль порядка запуска
Docker Compose запускает контейнеры в порядке зависимостей, используя опцию depends_on, чтобы указывать, когда запускается сервис. Для определения порядка запуска Compose применяет depends_on, links, volumes_from и network_mode: «service: …».
Если контейнер должен дождаться состояния “ready” другого контейнера, можно использовать инструменты wait-for-it или dockerize. Они будут проверять хосты и порты до тех пор, пока TCP соединение не будет подтверждено. Для включения принудительного ожидания в композицию необходимо добавить entrypoint:
version: '2'
services:
web:
build: .
ports:
- "80:8000"
depends_on:
- db
entrypoint: "./wait-for-it.sh db:5432"
db:
image: postgres
Вы всегда можете самостоятельно написать скрипт-обёртку, если возникнет необходимость в усилении контроля.
Запуск нескольких копий Compose проекта
Если вам понадобится несколько копий окружений с одинаковой композицией (или docker-compose.yml файлом), просто запустите docker-compose up -p new_project_name.
Переменные среды
Переменные среды оболочки могут быть использованы для установки значений в композициях:
Установить переменные среды:
$ TAG="latest"
$ echo $TAG
latest
$ DB="postgres"
$ echo $DB
postgres
Использовать переменную среды в Docker Compose файле:
db:
image: "${DB}:$TAG"
Docker Compose принимает и ${DB}, и $TAG. Также можно задать переменные среды в контейнерах:
web:
environment:
- PRODUCTION=1
Можно даже передать переменные среды внутрь контейнеров:
$ PRODUCTION=1
$ echo $PRODUCTION
1
Файл окружения
Для гарантии передачи переменной среды, необходимо хранить её в файле среды. Назовите файл .env и сохраните в рабочей директории. Docker Compose игнорирует пустые строки (используйте их для лучшей читаемости) и код, начинающийся с # (то есть комментарии). Вы можете присвоить переменные для дальнейшей подстановки, а также задать переменные Compose CLI:
COMPOSE_API_VERSION
COMPOSE_FILE
COMPOSE_HTTP_TIMEOUT
COMPOSE_PROJECT_NAME
DOCKER_CERT_PATH
DOCKER_HOST
DOCKER_TLS_VERIFY
Пример файла среды:
# ./.env
# для нашей промежуточной среды
COMPOSE_API_VERSION=2
COMPOSE_HTTP_TIMEOUT=45
DOCKER_CERT_PATH=/mycerts/docker.crt
EXTERNAL_PORT=5000
Использование нескольких файлов Docker Compose
Используйте несколько файлов Docker Compose, если необходимо изменять приложение под разные среды (разработка, промежуточная среда и продакшн) или запускать задачи администрирования через Compose приложение. Это предоставляет способ совместного использования общих конфигов.
Docker Compose по умолчанию читает два файла: docker-compose.yml и docker-compose.override.yml. В файле docker-compose-override.yml можно хранить переопределения для существующих сервисов или определять новые. Чтобы использовать несколько файлов (или файл переопределения с другим именем), необходимо передать -f в docker-compose up (порядок имеет значение):
$ docker-compose up -f my-override-1.yml my-overide-2.yml
Когда две опции конфигурации совпадают, новое значение заменяет или расширяет первоначальное.
В этом примере новое значение переписывает старое и command запускает my_new_app.py:
# оригинальный сервис
command: python my_app.py
# новый сервис
command: python my_new_app.py
При использовании опции с несколькими значениями (ports, expose, external_links, dns, dns_search и tmpfs), Docker Compose объединяет значения (в примере ниже Compose открывает порты 5000 и 8000):
# оригинальный сервис
expose:
- 5000
# новый сервис
expose:
- 8000
Если используются environment, labels, volumes, или devices, Docker Compose объединяет результаты. В следующем примере три переменные среды становятся FOO=Hello и BAR=«Python Dev!»:
# оригинальный сервис
environment:
- FOO=Hello
- BAR=World
# новый сервис
environment:
- BAR="Python Dev!"
Различные среды
Начнём с базового Docker Compose файла для приложения (docker-compose.yml):
web:
image: "my_dockpy/my_django_app:latest"
links:
- db
- cache
db:
image: "postgres:latest"
cache:
image: "redis:latest"
На сервере разработки мы хотим открыть порты, смонтировать код как том и создать веб-изображение (docker-compose.override.yml):
web:
build: .
volumes:
- ".:/code"
ports:
- "8883:80"
environment:
DEBUG: "true"
db:
command: "-d"
ports:
- "5432:5432"
cache:
ports:
- "6379:6379"
docker-compose up автоматически читает файл переопределения и применяет его. Также понадобится продакшн версия Docker Compose приложения, которую назовём docker-compose.production.yml:
web:
ports:
- "80:80"
environment:
PRODUCTION: "true"
cache:
environment:
TTL: "500"
Когда понадобится развернуть продакшн файл, просто запустим следующее:
$ docker-compose -f docker-compose.yml -f docker-compose.production.yml up -d
Примечание: Docker Compose читает docker-compose.production.yml, но не docker-compose.override.yml.
Задачи администрирования
Необходимо запустить административную копию приложения, чтобы иметь возможность выполнять определённые задачи, например, бэкапить базу данных. Используя уже упомянутый файл docker-compose.yml, создадим файл docker-compose.admin.yml:
dbadmin:
build: database_admin/
links:
- db
А затем, выполним следующую команду:
$ docker-compose -f docker-compose.yml -f docker-compose.admin.yml run dbadmin db-backup
Расширение сервисов
Совместно использовать конфигурации можно с помощью поля extends. Также оно позволяет делиться опциями между разными проектами.
Создать common-services.yml (можно назвать его как угодно):
webapp:
build: .
ports:
- "8000:8000"
volumes:
- "/data"
Создать базовый docker-compose.yml. Например:
web:
extends:
file: common-services.yml
service: webapp
Кроме этого, определить (или переопределить) конфигурацию и добавить другие сервисы можно локально:
web:
extends:
file: common-services.yml
service: webapp
environment:
- DEBUG=1
cpu_shares: 5
links:
- db
important_web:
extends: web
cpu_shares: 10
db:
image: postgres
Распространённые проблемы
Контроль порядка запуска
Docker Compose ждёт только запуска контейнера перед тем, как перейти к следующему. В случае, если одна часть приложения становится недоступна, Docker Compose рассчитывает на гибкость оставшейся части приложения.
Файл окружения
Если вы определяете переменные среды в оболочке или через командную строку во время работы docker-compose, эти переменные будут иметь приоритет над .env файлом.
Не стоит хранить переменные среды в системе контроля версии. Если вы используете файл среды, добавьте его в локальный файл игнорирования и создайте образец env.sample, похожий на следующий пример (если предполагается, что используется файл .env, описанный выше):
COMPOSE_API_VERSION= # должно быть 2
COMPOSE_HTTP_TIMEOUT= # мы используем 30 на продакшне и 120 в разработке
DOCKER_CERT_PATH= # храните путь сертификации здесь
EXTERNAL_PORT= # установите внешний порт здесь (запомните, 5000 для Flask и 8000 для Django)
Использование нескольких файлов Docker Compose
Обратите внимание, Docker Compose объединяет файлы в заданном вами порядке.
Расширение сервисов
Сервисы никогда не делят links, volumes_from или depends_on, используя extends; links и volumes_from всегда должны быть определены локально.
The end
С вопросами, предложениями и замечаниями — welcome в комментарии. А если хочется похоливарить в режиме реального времени — присоединяйтесь к нам на Дне открытых дверей курса.
Начало работы с Docker. Часть третья. Категория: ОС Linux • Разное
Что такое Docker Volumes
Том — это файловая система, которая используется на хост-машине за пределами контейнеров. Тома предоставьте себе средства для постоянного хранения информации и люди, инстинктивно, инсайдеры. Созданием и управлением томами занимается Docker.
Попробуем просто создать несколько томов:
$ docker volume create --name data-www $ docker volume create --name data-sql $ docker volume create --name data-tmp
Для того, чтобы просмотреть список томов:
$ docker volume ls НАЗВАНИЕ ОБЪЕМА ДРАЙВЕРА локальные данные-sql локальные данные-tmp местные данные-www
Посмотреть информацию об отдельном томе:
$ docker volume осмотр данных-www [ { "CreatedAt": "2020-03-20T14: 44: 01 + 03: 00", «Водитель»: «местный», "Ярлыки": {}, "Mountpoint": "/ var / lib / docker / volume / data-www / _data", "Имя": "данные-www", "Параметры": {}, «Объем»: «местный» } ]
Если том больше не нужен, его можно удалить:
$ докер том rm data-tmp
Чтобы удалить все тома, которые не используются контейнерами:
$ docker volume prune
Теперь смонтируем том data-www
при запуске контейнера:
$ docker run -it -v data-www: / var / www ubuntu: последний # mkdir / var / www / html # коснитесь / var / www / html / index.php # exit
Если вспомнить, что данные находятся в / var / lib / docker / volume / data-www / _data
, то теперь в этой директории есть поддиректория html
, а внутри поддиректории — файл index.php
.
Инструкция VOLUME в Dockerfile
Эта инструкция устарела и использовать ее не рекомендуется. Но давайте все таки познакомимся с ней поближе для понимания. Создадим в домашней директории каталог test
и внутри него — файл Dockerfile
:
$ кд ~ $ mkdir тест $ cd test $ nano Dockerfile
ОТ ubuntu: последняя ОБЪЕМ / и т. Д.
Соберем образ из этого Dockerfile
:
$ сборка докеров.--tag ubuntu-share-etc
Запустим новый контейнер:
$ docker run -it --name share-etc ubuntu-share-etc
Теперь посмотрим, какие тома существуют:
$ docker volume ls НАЗВАНИЕ ОБЪЕМА ДРАЙВЕРА местный 8bda345c875c99d61f9646a9b0922934a7eaab83366c04159f6023654237f090 локальные данные-sql местные данные-www
Где физически размещен тома, мы уже знаем. Так что посмотрим содержимое нового тома:
$ кд ~ $ sudo ls / var / lib / docker / volume / 8bda345c875c99d61f9646a9b0922934a7eaab83366c04159f6023654237f090 / _data / Добавить пользователя.conf debconf.conf fstab hosts ld.so.conf lsb-release opt profile.d rc5.d subuid безопасности альтернативы debian_version gai.conf init.d ld.so.conf.d идентификатор машины os-release rc0.d rc6.d selinux sysctl.conf apt проблема группы по умолчанию легальная mke2fs.conf pam.conf rc1.d rcS.d shadow sysctl.d Проблема с bash.bashrc deluser.conf gshadow.net libaudit.conf mtab pam.d rc2.d resolv.conf оболочки systemd bindresvport.blacklist dpkg host.conf ядро login.defs network passwd rc3.d rmt skel terminfo cron.daily имя хоста среды ld.so.cache logrotate.d nsswitch.conf profile rc4.d securetty subgid update-motd.d
Это содержимое каталога / etc
контейнера. Так что мы используем, используя инструкцию ТОМ
, правила на основной системе любых директории контейнера.И при удалении контейнера тома будут по-прежнему существовать. Впрочем, можно вместе с удалением контейнера удалить и связанный с ним том:
$ док-контейнер rm -v share-etc
Был удален контейнер и т. Д.
и связанный с ним том 8bda345c875c99d61f9646a9b0922934a7eaab83366c04159f6023654237f090
.
Порты контейнера
Докер позволяет получить доступ к какому-то из портов контейнера, пробросив его наружу — в основную операционную систему.По умолчанию, мы можем достучаться к какому-либо порту контейнера. Однако, интсрукция EXPOSE
в Dockerfile
позволяет объявить к какому из портов можно обратиться из основной системы.
Создадим в домашней директории каталог www
и внутри него — файлы Dockerfile
и index.php
:
$ кд ~ $ mkdir www $ cd www
$ nano файл Dockerfile
# Образец с DockerHub, включает Apache и PHP С php: 7.2-apache # Копируем все файлы проекта в контейнер КОПИРОВАТЬ. / var / www / html # Сообщаем, какие порты контейнера слушать EXPOSE 80
$ nano index.php
Привет от Apache
php phpinfo (); ?>
Создадим новый образ из Dockerfile
:
$ сборка докеров. --tag apache-php72
Запустим контейнер и укажем, что порт 80 контейнера будет связан с портом 8080 хоста:
$ docker run -p 8080: 80 apache-php72 AH00558: apache2: не удалось надежно определить полное доменное имя сервера с использованием 172.17.0.4. Установите глобальную директиву ServerName для подавления этого сообщения AH00558: apache2: не удалось надежно определить полное доменное имя сервера с использованием 172.17.0.4. Установите глобальную директиву ServerName для подавления этого сообщения [Сб, 21 марта, 10:19: 35.224973 2020] [mpm_prefork: notice] [pid 1] AH00163: Apache / 2.4.38 (Debian) PHP / 7.2.29 настроен - возобновление нормальной работы [Сб, 21 марта, 10:19: 35.233317 2020] [core: notice] [pid 1] AH00094: Командная строка: 'apache2 -D FOREGROUND'
Запускаем браузер и открываем http: // localhost: 8080
:
Установка Docker Compose
Докер используется для управления отдельными контейнерами (сервисами), из которых состоит приложение.Docker Compose используется для одновременного управления контейнерами, входящими в состав приложения. Этот инструмент предлагает те же возможности, что и Docker, но позволяет работать с более сложными приложениями.
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s) - $ (uname -m)" \ > -o / usr / local / bin / docker-compose $ sudo chmod + x / usr / local / bin / docker-составить $ sudo ln -s / usr / local / bin / docker-compose / usr / bin / docker-compose
$ docker-compose --version docker-compose версия 1.25.4, сборка 8d51620a
Файл docker-compose.yml
Набор сервисов, которые нужны для работы приложения, определяется с помощью файла docker-compose.yml
. У нас уже есть директория www
— создадим в ней еще один файл:
$ nano docker-compose.yml
версия: '3' Сервисы: приложение: сборка: контекст:. порты: - 8080: 80
Теперь построчно разберёмся с:
-
версия
— какая версияdocker-compose.yml
используется -
услуги
— контейнеры, которые нужно запустить -
app
— имя сервиса, может быть любым, но осмысленным -
build
— шаги, описывающие процесс билдинга -
контекст
— где находитсяDockerfile
для контейнера -
портов
— соответствие портов хоста и контейнера
Теперь проект надо собрать — это похоже на сборку образов в Docker.Хотя в нашем случае образ всего один:
$ сборка docker-compose
Проверим, что был создан новый образ:
$ образы докеров РЕПОЗИТОРНЫЙ ТЕГ ИДЕНТИФИКАТОР ИЗОБРАЖЕНИЯ СОЗДАННЫЙ РАЗМЕР -------------------------------------------------- ------------------------------------------ www_app последнее ce3c26a2cb52 17 секунд назад 410MB apache-php72 последнее eb9a7fb87880 22 часа назад 410MB ubuntu-share-etc последняя версия ebc1eef0eca3 42 часа назад 64.2 МБ php 7.2-apache 4e96f7d06518 2 дня назад 410MB php-cli-script последнее 9fff2bf618ad 2 дня назад 398MB tokmakov / apache2_ubuntu последнее 18073a80c28b 3 дня назад 191MB php 7.2-cli 555ec78042a1 3 недели назад 398MB ubuntu последнее 72300a873c2c 4 недели назад 64.2MB hello-world latest fce289e99eb9 14 месяцев назад 1.84 КБ
Теперь запустим эти сервисы, которые созданы (хотя у нас всего один сервис):
$ docker-compose up Создание сети www_default с драйвером по умолчанию Создание www_app_1 ... готово Присоединение к www_app_1 app_1 | AH00558: apache2: не удалось надежно определить полное доменное имя сервера с использованием 172.18.0.2. Установите глобальную директиву ServerName для подавления этого сообщения app_1 | AH00558: apache2: не удалось надежно определить полное доменное имя сервера с использованием 172.18.0.2. Установите глобальную директиву ServerName для подавления этого сообщения app_1 | [Вс, 22 марта, 08:31: 46.482140 2020] [mpm_prefork: notice] [pid 1] AH00163: Apache / 2.4.38 (Debian) PHP / 7.2.29 настроен - возобновление нормальной работы app_1 | [Вс, 22 марта, 08:31: 46.486761 2020] [core: notice] [pid 1] AH00094: Командная строка: 'apache2 -D FOREGROUND'
Запускаем браузер и открываем http: // localhost: 8080
:
Остановим работу контейнера с помощью Ctrl + C
и посмотрим на список контейнеров:
$ док-контейнер ls -a КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАНА СОСТОЯНИЕ НАЗВАНИЯ ПОРТОВ -------------------------------------------------- -------------------------------------------------- ---------------------------- d06fb87577e6 www_app "docker-php-entrypoi…" 13 минут назад Завершился (0) 27 секунд назад www_app_1 a6e37dee6924 apache-php72 "docker-php-entrypoi…" 2 часа назад Завершился (0) 2 часа назад beautiful_turing ................................................... .................................................. ........................... 8aa1a9458932 php-cli-script "php /script.php 8" 2 дня назад Завершился (0) 2 дня назад optimistic_maxwell 37def446ae84 ubuntu "/ bin / bash" 4 дня назад Завершился (0) 2 дня назад apache2_ubuntu
Поиск:
CLI • Docker • Linux • Ubuntu • Виртуализация • Команда • Настройка • Процесс • Установка
.
В случае Docker данные будут храниться внутри контейнера.
И когда мы удалили контейнер, все данные будут потеряны.
В этом случае мы узнаем, как создать тома Docker, как подключать их к контейнерам и как один и тот же том можно использовать для хранения данных в двух или более контейнерах.
Если вы еще не знаете основание Docker, обратитесь к следующему руководству:
Почему нам нужны тома для Docker?
- При удалении контейнеров тома не будут удалены.
- Присоединяйте или отсоединяйте тома к контейнеру.
- Позволяет разделить тома (хранилище / данные) между различными контейнерами.
- Позволяет отделение контейнеров от хранилиша.
- Позволяет Хранить том на удаленном хосте или в облаке.
Мы можем иметь логическое разделение данных, а также контейнер.
Мы можем сохранить данные таким образом, что если мы удалим контейнер, то и наши данные все равно присутствуют на хосте.
Таким образом, после уничтожения контейнера мы можем присоединить отом к любому существующим контейнерам, а также к новым контейнерам.
Начало работы с томами Docker
Команда тома докера показывает подробную информацию о томе, с помощью которого мы можем создать том, проверить подробные данные тома, перечислить доступные тома и удалить их.
Создание томов Docker
Синтаксис для создания тома Docker:
docker volume create
Пример:
# docker volume create DevOps_volume
Приведенная выше команда создаст том Docker с именем DevOps_volume.
Список Docker томов
Чтобы показать список всех созданных томов Docker, запустите:
# docker volume ls
Проверка томов Docker
Команда осмотр тома докера предоставит вам подробную информацию о создании тома области действия.
Синтаксис:
docker volume inspect
Позвольте мне показать вам детали тома Docker с именем DevOps_volume.
# docker volume осмотреть DevOps_volume
Создание контейнеров с прикрепленным к ним томом
Синтаксис:
docker container create --name-it --mount source , target = /
Пример:
# docker container create --name myBusyBox1 -it --mount source = DevOps_volume, target = / app busybox
Чтобы проверить, был ли контейнер создан, используйте команду docker ps -a:
Удалить тома Докер
Синтаксис для удаления тома:
docker volume rm
Давайте удалим том с именем DevOps_volume.
# docker volume rm DevOps_volume
На снимке экрана показано, что мы пытаемся удалить том, но не пытаемся удалить его, потому что том уже используется.
Итак, во-первых, нам нужно убить контейнер и освободить том.
И тогда мы можем удалить его.
Для этого сначала удалите все работающие контейнеры, используя команду:
# docker rm –f $ (docker ps -aq)
А затем удалите том:
# docker volume rm DevOps_volume
Удалить все тома одновременно
Используя команду docker rm, мы можем удалить один том за раз.
Если у нас есть несколько томов, мы хотим удалить все тома, мы должны использовать команду prune.
Давайте создадим несколько томов:
Теперь удалите все тома Docker одновременно, используя команду:
# docker volume prune
Видите?
Мы удалили все тома за один раз.
Поделитесь статьей:
.
томов docker compose, сохранение данных на диске
В docker compose volume — логические тома, которые задаются для каждого контейнера. Это директива в файле, определяющая связь точки монтирования на другой точке монтирования в контейнере. Все, что находится в томах , сохраняется на диске после удаления контейнера . Остальные данные хранятся в памяти.
Основное предназначение Docker в быстром разворачивании окружения на любой машине из готовых образов, которые можно дорабатывать.Контейнер — временная структура, все изменения выполненные в нем существуют пока сам контейнер. На диске данные не сохраняются, если они не переносятся в постоянную структуру — , объем .
Для примера возьмем с dockerhub: инструкция для образа с wordpress, в немного измененном виде будем использовать ее.
Проект будет представлять собой сайт на wordpress с базой данных MySQL.
Сразу создадим каталоги под сайт и базу на хост машине.За счет биндинга они будут связаны с контейнерами
мкдир -p / главная / сайт / db
На машине должны быть установлены сам Docker и docker-compose. Создаем docker-compose.yml
cd / home && mcedit docker-compose.yml
Версия
: '2' Сервисы: wordpress: изображение: wordpress перезапуск: всегда порты: - 8080: 80 среда: WORDPRESS_DB_PASSWORD: пример ссылки: - mysql: db объемы: - / главная / сайт: / var / www / html mysql: изображение: mysql: 5.7 перезапуск: всегда среда: MYSQL_ROOT_PASSWORD: пример объемы: - / главная / сайт / БД: / var / lib / mysql
В файле 2 сервиса. Структура типовая, 80 порт из контейнера пробрасывается на порт 8080 хост машины. Используются стандартные образы с dockerhub.
Для каждого контейнера заданы блоков объемы:
— / главная / сайт: / var / www / html для сайта
— / home / site / db: / var / lib / mysql для базы данных
Они определяют, что данные из временной структуры — контейнера будут сохраняться на хост машине.
Содержимое / var / www / html в / home / site , содержимое / var / lib / mysql в / home / site / db
Эта информация будет изменена при жизни контейнера и останется на хост машине после его удаления.
Запустим контейнеры
docker-compose -f docker-compose.yml вверх -d
докер пс
КОНТЕЙНЕР ID ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАНО СОСТОЯНИЕ ИМЕНА ПОРТОВ
bf264537c63d wordpress «docker-entrypoint.s… »Около минуты назад вверх Около минуты 0.0.0.0:8080->80/tcp home_wordpress_1
ae9cd7efb0a8 mysql: 5.7« docker-entrypoint.s… »Около минуты назад вверх Около минуты 3306 / tcp , 33060 / TCP home_mysql_1
Они успешно стартовали, с хоста обращаться к сервису можно только по порту 8080, на который пробрасываются запросы.
netstat -nltp
Активные подключения к Интернету (только серверы)
Proto Recv-Q Send-Q Local Address Внешний адрес Состояние PID / имя программы
tcp 0 0 0.0.0.0: 22 0.0.0.0:* LISTEN 851 / sshd
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 1049 / master
tcp 0 0 91.226.83.234:10010 0.0 .0.0: * LISTEN 31694 / docker-contai
tcp6 0 0 ::: 8080 ::: * LISTEN 24286 / docker-proxy
tcp6 0 0 ::: 22 ::: * LISTEN 851 / sshd
В браузере обратившись к IP адресу серверу и порту 8080 можно запустить установку CMS, затем попасть в административный раздел.
Внесем минимальные изменения в структуре перового поста. Поменяем заголовок « Hello World » на « Hello Docker » и единственное существующее по-умолчанию предложение.
Пересоздадим происходит существующая среда
Останавливаем контейнеры
docker-compose stop
И удаляем их
докер-компоновка RM
Собираюсь удалить home_wordpress_1, home_mysql_1
Вы уверены? [yN] y
Удаление home_wordpress_1… done
Удаление home_mysql_1… done
Контейнеров нет, с ключем -a выводятся все контейнеры, в т.ч. незапущенные
докер ps -a
КОНТЕЙНЕР ID ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАЕТСЯ СОСТОЯНИЕ ИМЕНА ПОРТОВ
файлов при этом сохранены на диске
ls / главная / участок /
db readme.html wp-blog-header.php wp-config-sample.php wp-includes wp-login.php wp-signup.php
index.php wp-activate.php wp-comments -post.php wp-content wp-links-opml.php wp-mail.php wp-trackback.php
license.txt wp-admin wp-config.php wp-cron.php wp-load.php wp-settings.php xmlrpc.php
Также как и содержимое / var / lib / mysql из контейнера
LS / home / site / db /
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 performance_schema public_key.pem server-key.pem wordpress
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 mysql private_key.pem server-cert.pem sys
При обращении к тому же URL: 8080 сейчас возникает ошибка — веб-сервер, являющийся частью контейнера не работает.
Запускаем контейнеры через docker-compose вновь
docker-compose -f docker-compose.yml вверх -d
Создание home_mysql_1
Создание home_wordpress_1
Сейчас можно убедиться в том, что сайт стал открываться и отображается в том же виде.При старте информация из docker-compose.yml считалась.
Были задействованы те же каталоги, что использовались ранее, с имеющимися данными.
Читайте про управление контейнерами вручную. В docker compose volume задаются файлы, при ручном создании контейнера их можно указывать с ключем -v.
.
Эксперименты с докерными объемами
Я понял что я не до конца понимаю как все устроно в томах докеров, поэтому
решил провести пару экспериментов.
В документации написано что бываеют 2 штуки:
- Объемы данных
- Контейнеры объемов данных
Эксперимент 1. Пробрасывание локальной папки в докер.
Итак, у меня есть хост машина по имени воздуха и на ней я запускаю контейнер. Хочу
сделать так чтобы папка / Users / bessarabov / e1 из хост машины была доступна в
контейнере как / e1
запуск докера \
-Это \
--volume / Users / bessarabov / e1: / e1 \
убунту: 14.04 \
/ bin / bash
Создаю в контейнере файл:
root @ 6c9da8f68a9e: / # echo 'from container'> / e1 / 1
И убеждаюсь что он виден на хост машине:
бессарабов @ 5: ~ / e1 $ cat 1
из контейнера
И проверяю что это работает в обратную сторону. Создаю файл на хост машине:
бессарабов @ 5: ~ / e1 $ echo 'from host'> 2
И в контейнере он появился:
корень @ 6c9da8f68a9e: / # cat / e1 / 2
от хозяина
Эксперимент 2.Какие настройки контейнера?
Продолжаю работать с контейнером из эксперимента 1. На хост машине запускаю
команду чтобы посмотреть настройки контейнера:
$ docker inspect --format = "{{. Volumes}}" 6c9da8f68a9e
карта [/ e1: / Users / bessarabov / e1]
А вот полный вывод команды ‘docker inspect 6c9da8f68a9e’.
Эксперимент 3. -тома-от
Продолжаю работать с тем же конейнером. Хочу понять как будет действовать
команда —volumes-from.Запускаю новый контейнер:
запуск докера \
-Это \
--volumes-from 6c9da8f68a9e \
убунту: 14.04 \
/ bin / bash
Смотрю на хост машине его настроки:
$ docker inspect --format = "{{. Volumes}}" 27f31c5bc0ee
карта [/ e1: / Users / bessarabov / e1]
А вот полный вывод команды ‘docker inspect 27f31c5bc0ee’.
А вот diff этих двух inspect.
Эксперимент 4. —volume с одним параметром
Создаю новый контейнер.Но в отличии от эксперимента 1, передаю только один
параметр в —volume:
запуск докера \
-Это \
--volume / e4 \
убунту: 14.04 \
/ bin / bash
Вот его настройки:
$ docker inspect --format = "{{. Volumes}}" d1849bdd9153
карта [/ e4: / mnt / sda1 / var / lib / docker / vfs / dir / 56ce42d7366c198780ed3aa3dfed0a1c194a89cbfc6fa83121f07a58a28ff7ef]
И полный вывод команды docker inspect.
В контенере создаю файл
root @ d1849bdd9153: / # echo 'from container e4'> / e4 / 4
Папки по имени / mnt / sda1 / var / lib / docker / vfs / dir / 56ce42d7366c198780ed3aa3dfed0a1c194a89cbfc6fa83121f07a58a28ff7ef
на моем маке не оказалось.Я залез в виртуальную машину докера ‘boot2docker ssh’
и там такая папка обнаружилась (только пришлось сделать sudo su):
root @ boot2docker: ~ # cat / mnt / sda1 / var / lib / docker / vfs / dir / 56ce42d7366c198780ed3aa3dfed0a1c194a89cbfc6fa83121f07a58a28ff7ef / 4
из контейнера е4
Эксперимент 5. Еще один контейнер и —объёмы-от
Создаю новый, но подключаю к новому все тома из контенера, созданного в
эксперименте 4.
запуск докера \
-Это \
--volumes-from d1849bdd9153 \
убунту: 14.04 \
/ bin / bash
В этом новом контенере я вижу то же что и прошлый раз:
корень @ 77431816df7d: / # cat / e4 / 4
из контейнера е4
Смотрю на хосте данне об этом контенер и вижу точно такие же
настройки, как и в случае эксперимента 4:
$ docker inspect --format = "{{. Volumes}}" 77431816df7d
карта [/ e4: / mnt / sda1 / var / lib / docker / vfs / dir / 56ce42d7366c198780ed3aa3dfed0a1c194a89cbfc6fa83121f07a58a28ff7ef]
Ну и полный вывод команды docker inspect.
Резюме и TODO
После того как я провел все эти небольшие эксперименты и еще раз прочитал
доку, все стало понятнее.
Но еще остались моменты, которые я хочу прояснить.
Во первых, можно ли создать контенер в котором создан том / данные, а потом
прикрутить этот том в другой контенер по другому пути (например, / site).
Во втором хочу проэксперементирвать, чтобы убедится что вот эта фраза правда:
Если вы удалите контейнеры, которые монтируют тома, включая исходные dbdata
контейнера или последующих контейнеров db1 и db2, тома не будут
удалено.Чтобы удалить том с диска, вы должны явно вызвать docker rm -v
против последнего контейнера со ссылкой на том. Это позволяет вам
обновлять или эффективно переносить тома данных между контейнерами.
(у меня, нет причин не доверять документации докера, но если это правда, то
получается что все что все объемы продолжают хранится на машине на которой
живет докер).
Иван Бессарабов
[email protected]
11 ноября 2014
.