Skip to content

Instantly share code, notes, and snippets.

@ayshvab
Last active October 18, 2017 10:38
Show Gist options
  • Save ayshvab/93c13701fdf293194398677b2491475d to your computer and use it in GitHub Desktop.
Save ayshvab/93c13701fdf293194398677b2491475d to your computer and use it in GitHub Desktop.
Docker stuff

15 Docker Hacks & Tips!

Работа с файлами в контейнерах Docker

Docker никогда не удаляет data volumes, даже если контейнеры, которые их создали, удалены.

Для того чтобы посмотреть список осиротевших томов, используйте команду:

docker volume ls -qf dangling=true

Для удаления таких томов:

docker volume rm $(docker volume ls -qf dangling=true)

Как оптимально организовать хранение данных разного типа, если речь идет о доступе к ним из контейнеризованного приложения?

  • Файлы с данными базы данных --> В Data Volume Container
  • Файлы библиотек контейнеризованного приложения ---> В файловой системе контейнера
  • Файлы со входными данными для анализа ---> В примонтированных директориях хоста

Взаимодействие контейнеров Docker

  • Если в контейнере запущены приложения, слушающие на определенных портах, можно обеспечить доступ к этим портам с хоста. Для того чтобы пробросить порты контейнера при запуске необходимо использовать ключ -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 network ls

По умлочанию все контейнеры в сети bridge. Недостатки дефолтной сети bridge:

  1. Не льзя обращаться к другим контейрам по имени, только по IP адрессам.
  • а получить IP адресс изнутри контейнера не легко.
  1. Раз в эту сеть попадают все контейнеры по умалчанию, что не желательно, в случае, когда нужно изоляция.

Создаем собственную сеть: 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment