- PostgreSQL в контейнере Docker
- Alex tools
- Не устанавливайте Postgres. Docker pull Postgres
- Получение образа Postgres Docker
- Создайте каталог, который будет служить точкой монтирования локального хоста для файлов данных Postgres
- Запустите контейнер Postgres
- Подключиться к Postgres
- Docker pull postgres windows
- Setup PostgreSQL on Windows with Docker
- Install Directly or not?
- Installing Docker
- What about Postgres?
- Connect to Postgres
- Wrapping Up
PostgreSQL в контейнере Docker
Ранее стал разбираться с использованием Docker`a: Как установить и использовать Docker в Ubuntu 18.04. А использовать хочется PostgreSQL в этих контейнерах. Это можно сделать, сейчас пока как.
Н о, в продолжение той статьи, рекомендую разобраться в основных отличиях образа и контейнера в Docker, а еще (вот это уже по желанию), подробнее почитать про слои и не только в Docker.
Подключение через psql с хостовой машины:
Подключение к контейнеру:
Внутри него подключение к psql:
Приступим к длинной статье со скриншотами и теми ошибками, которые я словил.
Сначала нужно найти образ с нужной версией PostgreSQL, я использую команду:
Буду использовать верхний (официальный) контейнер, 12 версия. Скачиваю его с помощью команды:
Нужно немного подождать, всё-такие размер образа составляет 314 мегабайт, так что зависит от скорости интернета.
Размер образов можно посмотреть командой:
Теперь можно контейнер запускать (в статье по ссылке выше отличие образов от контейнеров есть). Попробую сделать это вот такой командой:
Появляется ошибка (на самом деле, команду выше надо дополнить, тогда всё нормально будет, но на ошибку тоже нужно посмотреть):
Текст ошибки можете сами прочитать. Суть — нужно произвести различные инициализации, указать пароли и так далее, чтобы контейнер правильно сформировался. Я же этого не сделал еще, так что в базу зайти не могу. То есть, нужно правильно команду запуска сформировать.
Наверное, в данном случае лучше зайти на ту страницу, с которой производили скачивание образа postgres — со страницы хранилища контейнеров, dockerhub. В поле поиска вбиваем имя и находим результат:
Попадаем на страницу с описанием данного контейнера:
Описание большое, желательно всё прочитать. Я чутка поторопился, поискал в интернете интересующую меня информацию, мне ведь хотелось запустить контейнерный PostgreSQL и подключиться к нему. Поэтому, про официальную страницу помните и изучите её, а я далее покажу, что делал.
ВАЖНО: Возможно, что-то я делаю не правильно. Но я только начал изучать Docker, так что ошибки могут быть. Но код ниже работает 🙂
Итак, сначала предлагаю проверить, доступен ли «запущенный» выше PostgreSQL. Для этого я попробую запустить psql (можно установить с помощью команды apt и нужного пакета, там за версией надо следить) и подключиться к чему-нибудь:
Появляется ошибка — естественно, ведь PostgreSQL у меня не установлен.
Вот теперь запускаем контейнер с PostgreSQL следующей командой:
- —name — задаю имя контейнеру (у него всё-равно будет id-шник);
- POSTGRES_PASSWORD=postgres — устанавливаю пароль для роли postgres;
- -p — произвожу проброску порта хоста на порт контейнера.
С помощью команды:
Убедимся, что всё получилось:
Снова попробуем подключиться к контейнерному PostgreSQL с помощью psql, установленного на хостовой машине:
Обратите внимание, что нужно ввести тот пароль, который указали в команде run:
Всё получилось! Можно даже таблицу создать:
Теперь осталось подключиться к PostgreSQL из контейнера. Для этого необходимо выполнить вот такую команду:
- exec — параметр для подключения к запущенному контейнеру;
- mypg — имя контейнера (можно подставить Idшинк);
- bash — указываем, что нужно запустить интерпретатор при входе в контейнер.
Можно походить по директориям. Подключены как пользователь ОС root.
Внутри контейнера можно запустить psql и увидеть всё то, что было создано ранее. Для запуска psql достаточно указать роль через параметр -U:
Видим все те данные, которые были созданы с хоста. Еще можно найти каталог с данными и зайти туда — и можно там похозяйничать, если нужно.
Напоминаю, что, если удалить контейнер — все пользовательские (созданные нами) данные потеряются!
Например, я сейчас останавливаю мой контейнер, потом его удаляю, создаю заново, подключаюсь и вижу:
Можно свой образ сделать с этими данными, а потом его использовать.
Уф, ну вроде всё! Наверное, я буду контейнер с PostgreSQL использовать для различных тестирований — удобно и быстро, заморачиваться с виртуальной машиной не надо.
Alex tools
Не устанавливайте Postgres. Docker pull Postgres
- Получить ссылку
- Твиттер
- Электронная почта
- Другие приложения
С момента появления Docker нет необходимости непосредственно устанавливать программное обеспечение для разработки на локальном компьютере. Будь то серверы баз данных (например, Postgres), системы кеширования (например, Redis, Memcache) или системы обмена сообщениями (например, Kafka) — почти всегда можно найти или создать подходящий docker образ для использования во время разработки.
Установить программное обеспечение сложно. И это не имеет ничего общего с вашим опытом в качестве разработчика. Все видели значительную долю столкновений версий, эзотерических сообщений об ошибках сборки и отсутствующих ошибок зависимостей каждый раз, когда приступали к задаче установки нового программного обеспечения для использования. Тратили бесчисленное количество часов, копируя фрагменты кода из Stack Overflow в терминал и выполняли их, надеясь, что один из них волшебным образом решит проблемы установки и заставит программное обеспечение работать. Результатом являются в основном отчаяние, разочарование и потеря производительности.
Docker предоставляет выход из этой путаницы, сводя задачу установки и запуска программного обеспечения всего к двум командам (docker run и docker pull). В этом посте мы увидим этот процесс в действии, шаг за шагом посмотрев, как легко и просто настроить установку Postgres с помощью Docker.
В этом посте предполагается, что у вас есть действующая учетная запись Docker и запущен демон Docker.
Получение образа Postgres Docker
Чтобы получить образ для последней стабильной версии Postgres, просто запустите
Эта команда загрузит последнюю стабильную версию образа Postgres из официального репозитория Postgres Docker Hub. Чтобы получить версию, отличную от последней стабильной версии, мы можем предоставить соответствующее имя тега образа для команды docker pull:
Создайте каталог, который будет служить точкой монтирования локального хоста для файлов данных Postgres
Если мы хотим сохранить данные, сгенерированные экземпляром Postgres, работающим внутри контейнера, за пределами жизненного цикла контейнера, нам нужно сопоставить локальную точку монтирования как том данных с соответствующим путем внутри контейнера. Обычно я создаю папку томов (мы можем дать папке любое имя, которое нам нравится) в моем домашнем каталоге, а затем создаю подпапки для каждого приложения, для которого мне нужно создать точки монтирования тома данных.
Запустите контейнер Postgres
Запуск контейнера Postgres так же прост, как и запуск команды docker run
Мы предоставили несколько опций команде docker run:
- — rm: автоматически удалять контейнер и связанную с ним файловую систему при выходе. В общем, если мы запускаем много краткосрочных контейнеров, рекомендуется передать флаг rm команде docker run для автоматической очистки и избежать проблем с дисковым пространством. Мы всегда можем использовать опцию v (описанную ниже), чтобы сохранить данные за пределами жизненного цикла контейнера
- — name: идентифицирующее имя для контейнера. Мы можем выбрать любое имя, какое захотим. Обратите внимание, что два существующих (даже если они остановлены) контейнера не могут иметь одинаковые имена. Чтобы повторно использовать имя, вам нужно либо передать флаг rm команде docker run, либо явно удалить контейнер с помощью команды docker rm [имя контейнера].
- -e: выставить переменную среды с именем POSTGRES_PASSWORD со значением docker для контейнера. Эта переменная окружения устанавливает пароль суперпользователя для PostgreSQL. Мы можем установить POSTGRES_PASSWORD на что угодно. Я просто выбрал его для демонстрации. Есть дополнительные переменные среды, которые вы можете установить. К ним относятся POSTGRES_USER и POSTGRES_DB. POSTGRES_USER устанавливает имя суперпользователя. Если не указано, имя суперпользователя по умолчанию — postgres. POSTGRES_DB задает имя базы данных по умолчанию для настройки. Если не указан, по умолчанию используется значение POSTGRES_USER.
- -d: запускает контейнер в отдельном режиме (detached mode) или, другими словами, в фоновом режиме.
- -p: привязать порт 5432 на локальном хосте к порту 5432 в контейнере. Эта опция позволяет приложениям, работающим вне контейнера, иметь возможность подключения к серверу Postgres, работающему внутри контейнера.
- -v: Смонтировать $HOME/docker/volumes/postgres на хост-компьютере в путь к тому на стороне контейнера /var/lib/postgresql/data, созданный внутри контейнера. Это гарантирует, что данные postgres сохраняются даже после удаления контейнера.
Подключиться к Postgres
После запуска контейнера подключение к нему из приложения ничем не отличается от подключения к экземпляру Postgres, работающему вне контейнера Docker. Например, для подключения с помощью psql мы можем выполнить
Надеюсь, этот пост продемонстрировал, как легко и просто начать работать с Postgres в docker. Для большинства других приложений процесс такой же простой. Поэтому в следующий раз, когда вам нужно будет установить часть программного обеспечения, подумайте о том, как выполнить docker pull, прежде чем приступить к установке brew, yum install, apt-get install или любой другой команде, которая предназначена для вашего системного менеджера пакетов.
Docker pull postgres windows
This repository is archived!
I no longer have a need for PostgreSQL as a Windows container so I will not continue to maintain this repository.
If anyone still has a use case for this kind of container image I recommend to reimplement the refactored upstream entrypoint shell script in PowerShell. Batch script probably cannot be used without a lot of ugly hacks.
Supported tags and Dockerfile links
The above tags are manifest tags that consist of a set builds based on all available nanoserver releases, specifically:
- nanoserver:1909
- nanoserver:1903
- nanoserver:1809
- nanoserver:1803 (EOL 2019-11-12)
- nanoserver:1709 (EOL 2019-04-09)
- nanoserver:sac2016 (EOL 2018-10-09)
Your Docker client should pull down the correct image.
Maintained by: Stellirin
Supported architectures: (more info) windows-amd64
What is PostgreSQL?
How to use this image
This image includes EXPOSE 5432 (the postgres port), so standard container linking will make it automatically available to the linked containers. The default postgres user and database are created in the entrypoint with initdb .
For further details about usage see the official PostgreSQL container image.
About this container image
A Windows container to run PostgreSQL based on the EnterpriseDB distribution, which is found on the PostgeSQL for Windows download page.
This repository builds a Windows based Docker image that is functionaly similar to the official Linux based Docker image.
The resulting image has been (minimally) tested with a proprietary enterprise Java application. This image accepts typical SQL files, it can use TLS certificates in PEM format, and it allows the Java application to connect securely and process data.
So far, no differences in behaviour have been observed compared to the official Linux based container.
The Linux based Docker image cannot run on Windows as a LCOW container. This is due to differences in functionality between the NTFS and EXT4 file systems. Specifically, Linux commands such as chown do not work but the PostgreSQL images rely on them for security.
The entrypoint is written as a batch script because the database is run on windows/nanoserver , which doesn’t have PowerShell. Writing the entrypoint script was challenging due to batch script limitations, but this gives us a base image of less than 450MB versus nearly 5GB when windows/servercore is used.
The Dockerfile and the docker-entrypoint.cmd were strongly inspired by the equivalent files for the official Linux based Docker images. There are some minor deviations, but this is mostly to work around differences in batch script behaviour.
The files here are under the MIT licence, the same as the regular docker-library/postgres docker files. Just like docker-library/postgres , the licence here covers only the files in this repository. It doesn’t cover the PostgreSQL distribution, which has its own licence.
Setup PostgreSQL on Windows with Docker
Over the weekend I finally got the chance to start reading A Curious Moon by Rob Conery which is a book on learning PostgreSQL by following the fictional Dee Yan as she is thrown into database administrator role at an aerospace startup.
I have a lot of experience using Microsoft’s SQL Server, but up until now, I haven’t touched PostgreSQL. For personal projects SQL Server’s cost and be prohibitive and the release of Rob’s book added up to a good time to give PostgreSQL a try.
Install Directly or not?
On the download section of the official Postgres site, there is an option to download an installer. This is the route I was going to at first, but in Rob’s book, he suggests using a VM for Postgres installation on Windows. This kicked off a lot of searching on my part and didn’t find a good definitive answer on why that is or isn’t the way to do.
In the end, I decided to try and run the Postgres process using Docker instead installing directly on Windows or dealing with a full VM.
Installing Docker
Head to this link and click the Get Docker link to download the installer. After the install is complete you will have to log out and back in. When I logged back in I got a message about Hyper-V not being enabled.
After logging back in I then got the following message about hardware-assisted virtualization not being enabled.
After tweaking my BIOS settings and logging back in I was greeted by the Docker welcome screen.
Open a command prompt and run the following command.
You should output that starts with the following if your installation is working.
Hello from Docker!
This message shows that your installation appears to be working correctly.
What about Postgres?
Getting up and going with a container running Postgres was pretty simple and could be done with the following command which will create a container and expose the port used by Postgres so it can be accessed from the host.
The problem with this approach is if you ever need to rebuild the container for some reason, like a new version of Postgres is released, your data will be lost. Thankfully I found this blog post which shows how to use a secondary container for the data leaving the Postgres container able to be destroyed and recreated as needed. The following is the command I used to create my data container.
The above creates a container named PostgresData based on the Alpine image. It is important that the -v parameter matches the path that Postgres expects.
Now that we have a container that will keep our data safe let’s create the actual Postgres container with the following command.
The only difference from the first example run command is the addition of –volumes-from PostgresData which tells the container to use the PostgresData container.
If you run the docker ps -a command it will show you all your containers.
As you can see in my example I have two containers only one of which is actually running. Make sure you don’t remove the data container just because it will never show as running.
Connect to Postgres
To verify all was working I downloaded pgAdmin from here. Run the installer and then open the application. Right-click on Server and click Create > Server.
On the Create Server dialog enter a Name for your server and then switch over to the Connection tab.
On the Connection tab for Host use localhost and in the Password field use the password you used for POSTGRES_PASSWORD on the docker run command.
Click Save to close the dialog and connect to the server. The following is an example screenshot of what you will see showing the available databases on the server, which is just the default database in this case.
Wrapping Up
Make sure to check out the official docs here for more information as needed.
Other than the storage portion getting Postgres up and running in Docker was pretty simple. I hope like me this will give you a good jumping off point to learn more about both Docker and Postgres.
If anyone has any alternate ways to deal with persistent storage please leave a comment.