Docker никогда не удаляет data volumes, даже если контейнеры, которые их создали, удалены.
Для того чтобы посмотреть список осиротевших томов, используйте команду:
docker volume ls -qf dangling=true
Для удаления таких томов:
docker volume rm $(docker volume ls -qf dangling=true)
Как оптимально организовать хранение данных разного типа, если речь идет о доступе к ним из контейнеризованного приложения?
- Файлы с данными базы данных --> В Data Volume Container
- Файлы библиотек контейнеризованного приложения ---> В файловой системе контейнера
- Файлы со входными данными для анализа ---> В примонтированных директориях хоста
- Если в контейнере запущены приложения, слушающие на определенных портах, можно обеспечить доступ к этим портам с хоста. Для того чтобы пробросить порты контейнера при запуске необходимо использовать ключ -p:
docker run -d --name port-export -p <port_on_host_machine>:<port_inside_container> image
- Для подключения к уже запущенному контейнеру удобно использовать команду:
docker exec -it <container-name> bash
Для взаимодействия с базой данных удобно использовать утилиту psql которая уже установлена в образе. Синтаксис прост, для подключения к базе нужно указать пользователя (в нашем случае это postgres) и команду (если команду не указать, psql подключится к базе данных в интерактивном режиме). Пример:
psql -U postgres -c 'SELECT now()'
Также psql позволяет легко получить доступ к информации о структуре базы, например:
psql -U postgres -c '\dt'
выводит список таблиц БД. Полный список системных команд для psql доступен по команде:
psql -U postgres -c '\?'
По умолчанию psql подключается к базе данных postgres, в одной из таблиц которой записан ответ на задачу. Для получения ответа вам нужно запустить образ с базой данных в режиме демона, после запуска советуем проверить, что контейнер стартовал и работает, после чего подключиться к нему и выполнить нужные запросы к базе с использованием psql.
Example:
docker run -d --name db-stepik parseq/stepik-exec-docker
<- запустить образ с базой данных в режиме демона
docker exec -it db-stepik psql -U postgres
<- подключиться к нему..
postgres=# SELECT * FROM answers;
<- и выполнить нужные запросы к базе с использованием psql
Полезные ссылки:
-
Сети:
-
Сетевое взаимодействие в Docker:
С самого начала в докере доступны три сети:
docker network ls
По умлочанию все контейнеры в сети bridge
.
Недостатки дефолтной сети bridge
:
- Не льзя обращаться к другим контейрам по имени, только по IP адрессам.
- а получить IP адресс изнутри контейнера не легко.
- Раз в эту сеть попадают все контейнеры по умалчанию, что не желательно, в случае, когда нужно изоляция.
Создаем собственную сеть:
docker network create custom
(custom -> имя сети)
Можно посмотреть параметры созданной сети:
docker network inspect custom | more
Теперь создадим два контейнера и подключим их к сети custom
, посмотрим можно ли обращаься к ним по имени внутри сети:
docker run -it -rm --name one --network=custom ubuntu:16.04
...
Полезные команды для работы с образами
Удалить все образы, не помеченные тегами:
docker rmi $(docker images | grep '^<none>' | awk '{print $3}')
альтернативная команда:
docker rmi $(docker images -f "dangling=true" -q)
В Dockerfile избегайте команд apt-get upgrade и apt-get dist-upgrade, оптимальный синтаксис команды для установки пакетов выглядит так:
RUN apt-get update && apt-get install -y \
bzr \
cvs \
git \
mercurial \
subversion
Полное практическое руководство по Docker: с нуля до кластера на AWS