Ранее стал разбираться с использованием Docker`a: Как установить и использовать Docker в Ubuntu 18.04. А использовать хочется PostgreSQL в этих контейнерах. Это можно сделать, сейчас пока как.
Но, в продолжение той статьи, рекомендую разобраться в основных отличиях образа и контейнера в Docker, а еще (вот это уже по желанию), подробнее почитать про слои и не только в Docker.
docker pull postgres
docker run --name mypg -e POSTGRES_PASSWORD=postgres -d -p 5432:5432 postgres
Подключение через psql с хостовой машины:
psql -h localhost -p 5432 -U postgres
Подключение к контейнеру:
docker exec -it mypg bash
Внутри него подключение к psql:
psql -U postgres
Приступим к длинной статье со скриншотами и теми ошибками, которые я словил.
Сначала нужно найти образ с нужной версией PostgreSQL, я использую команду:
docker search postgres
Буду использовать верхний (официальный) контейнер, 12 версия. Скачиваю его с помощью команды:
docker pull postgres
Нужно немного подождать, всё-такие размер образа составляет 314 мегабайт, так что зависит от скорости интернета.
Размер образов можно посмотреть командой:
docker images
Теперь можно контейнер запускать (в статье по ссылке выше отличие образов от контейнеров есть). Попробую сделать это вот такой командой:
docker run -it postgres
Появляется ошибка (на самом деле, команду выше надо дополнить, тогда всё нормально будет, но на ошибку тоже нужно посмотреть):
Текст ошибки можете сами прочитать. Суть — нужно произвести различные инициализации, указать пароли и так далее, чтобы контейнер правильно сформировался. Я же этого не сделал еще, так что в базу зайти не могу. То есть, нужно правильно команду запуска сформировать.
Наверное, в данном случае лучше зайти на ту страницу, с которой производили скачивание образа postgres — со страницы хранилища контейнеров, dockerhub. В поле поиска вбиваем имя и находим результат:
Попадаем на страницу с описанием данного контейнера:
Описание большое, желательно всё прочитать. Я чутка поторопился, поискал в интернете интересующую меня информацию, мне ведь хотелось запустить контейнерный PostgreSQL и подключиться к нему. Поэтому, про официальную страницу помните и изучите её, а я далее покажу, что делал.
ВАЖНО: Возможно, что-то я делаю не правильно. Но я только начал изучать Docker, так что ошибки могут быть. Но код ниже работает 🙂
Итак, сначала предлагаю проверить, доступен ли «запущенный» выше PostgreSQL. Для этого я попробую запустить psql (можно установить с помощью команды apt и нужного пакета, там за версией надо следить) и подключиться к чему-нибудь:
psql -h localhost -p 5432 -U postgres
Появляется ошибка — естественно, ведь PostgreSQL у меня не установлен.
Вот теперь запускаем контейнер с PostgreSQL следующей командой:
docker run --name mypg -e POSTGRES_PASSWORD=postgres -d -p 5432:5432 postgres
- —name — задаю имя контейнеру (у него всё-равно будет id-шник);
- POSTGRES_PASSWORD=postgres — устанавливаю пароль для роли postgres;
- -p — произвожу проброску порта хоста на порт контейнера.
С помощью команды:
docker ps -a
Убедимся, что всё получилось:
Снова попробуем подключиться к контейнерному PostgreSQL с помощью psql, установленного на хостовой машине:
psql -h localhost -p 5432 -U postgres
Обратите внимание, что нужно ввести тот пароль, который указали в команде run:
Всё получилось! Можно даже таблицу создать:
Теперь осталось подключиться к PostgreSQL из контейнера. Для этого необходимо выполнить вот такую команду:
docker exec -it mypg bash
- exec — параметр для подключения к запущенному контейнеру;
- mypg — имя контейнера (можно подставить Idшинк);
- bash — указываем, что нужно запустить интерпретатор при входе в контейнер.
Можно походить по директориям. Подключены как пользователь ОС root.
Внутри контейнера можно запустить psql и увидеть всё то, что было создано ранее. Для запуска psql достаточно указать роль через параметр -U:
psql -U postgres
Видим все те данные, которые были созданы с хоста. Еще можно найти каталог с данными и зайти туда — и можно там похозяйничать, если нужно.
Напоминаю, что, если удалить контейнер — все пользовательские (созданные нами) данные потеряются!
Например, я сейчас останавливаю мой контейнер, потом его удаляю, создаю заново, подключаюсь и вижу:
docker stop mypg docker ps -a docker rm mypg docker run --name mypg -e POSTGRES_PASSWORD=postgres -d -p 5432:5432 postgres docker exec -it mypg bash psql -U postgres
Можно свой образ сделать с этими данными, а потом его использовать.
Уф, ну вроде всё! Наверное, я буду контейнер с PostgreSQL использовать для различных тестирований — удобно и быстро, заморачиваться с виртуальной машиной не надо.
Leave a Reply