Разное

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

Создаю в контейнере файл:

[email protected]:/# echo 'from container' > /e1/1

И убеждаюсь что он виден на хост машине:

[email protected]:~/e1$ cat 1
from container

И проверяю что это работает в обратную сторону. Создаю файл на хост машине:

[email protected]:~/e1$ echo 'from host' > 2

И в контейнере он появился:

[email protected]:/# 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.

В контенере создаю файл

[email protected]:/# echo 'from container e4' > /e4/4

Папки по имени /mnt/sda1/var/lib/docker/vfs/dir/56ce42d7366c198780ed3aa3dfed0a1c194a89cbfc6fa83121f07a58a28ff7ef
на моем маке не оказалось. Я залез в виртуальную машину докера ‘boot2docker ssh’
и там такая папка обнаружилась (только пришлось сделать sudo su):

[email protected]:~# 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

В этом новом контенере я вижу то же что и прошлый раз:

[email protected]:/# 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

Создадим новый образ из 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

.

Добавить комментарий

Ваш адрес email не будет опубликован.