Проблема
Вы хотите использовать PostgreSQL и избегать ручной установки базы данных с помощью Docker-Compose.
Решение
В этом руководстве рассматривается использование Docker-Compose для установки и использования базы данных PostgreSQL.
Использование Docker-Compose имеет следующие преимущества:
- это может быть быстрее, повторяемо и автоматически
- это избавляет вас от установки базы данных непосредственно на вашем хост-компьютере
- он позволяет вам иметь несколько разных версий базы данных, если каждый из ваших проектов требует, чтобы вы использовали разные версии
Вот шаги, которые мы предпримем для этого урока:
- настроить docker-compose для использования контейнера postgresql
- войдите в контейнер postgresql
- создать таблицу
- добавлять и читать данные из таблицы
Передняя Материя
Код для этого примера контейнерной базы данных PostgreSQL можно найти здесь:
Мы будем использовать Docker Official Image of PostgreSQL, найденный здесь:
Настроить Docker-Compose
Мы настроим Docker-Compose для использования PostgreSQL, создав этот docker-compose.yml
:
# docker-compose.yml version: '3' services: database: image: "postgres" # use latest official postgres version env_file: - database.env # configure postgres volumes: - database-data:/var/lib/postgresql/data/ # persist data even if container shuts down volumes: database-data: # named volumes can be managed easier using docker-compose
Файл database.env
выглядит так:
# database.env POSTGRES_USER=unicorn_user POSTGRES_PASSWORD=magical_password POSTGRES_DB=rainbow_database
Войдите в PostgreSQL
Запустить базу данных
Запустите docker-compose up
, чтобы открыть базу данных.
$ docker-compose up Creating volume "postgresql-with-docker-compose_database-data" with default driver Pulling database (postgres:)... latest: Pulling from library/postgres 8d691f585fa8: Pull complete ... 6283090fa09d: Pull complete Digest: sha256:a4a944788084a92bcaff6180833428f17cceb610e43c828b3a42345b33a608a7 Status: Downloaded newer image for postgres:latest Creating postgresql-with-docker-compose_database_1 ... done Attaching to postgresql-with-docker-compose_database_1 database_1 | The files belonging to this database system will be owned by user "postgres". database_1 | This user must also own the server process. ... database_1 | 2019-11-17 20:33:02.208 UTC [1] LOG: database system is ready to accept connections
Docker-Compose загрузит образ только при первом запуске этой команды.
Подключиться к базе данных
Есть несколько способов подключения к контейнеру базы данных. В этом примере мы перейдем в контейнер базы данных и будем использовать psql
клиентское программное обеспечение, которое уже установлено в контейнере базы данных.
$ docker-compose run database bash # drop into the container shell database# psql --host=database --username=unicorn_user --dbname=rainbow_database Password for user unicorn_user: psql (12.0 (Debian 12.0-2.pgdg100+1)) Type "help" for help. rainbow_database=#
Когда будет предложено ввести пароль, введите пароль, который мы настроили в нашем docker-compose.yml
, например magical_password
.
Создать таблицу
Мы можем начать взаимодействие с базой данных, сначала создав таблицу базы данных.
rainbow_database=# \d # verify table does already not exist Did not find any relations. rainbow_database=# CREATE TABLE color_table(name TEXT); CREATE TABLE rainbow_database=# \d # verify table is created List of relations Schema | Name | Type | Owner --------+-------------+-------+-------------- public | color_table | table | unicorn_user (1 row)
Добавить и прочитать данные
Теперь мы можем добавлять данные в таблицу. А затем считайте данные из таблицы.
rainbow_database=# SELECT * FROM color_table; -- verify record does not already exist name ------ (0 rows) rainbow_database=# INSERT INTO color_table VALUES ('pink'); -- be sure to use single quotes INSERT 0 1 rainbow_database=# SELECT * FROM color_table; -- verify record is created name ------ pink (1 row)
Заключение
Поздравляю! Вы успешно использовали базу данных PostgreSQL внутри контейнера с Docker-Compose.
Если вы нашли эту учебную статью полезной и у вас есть другие технологии, которые вы хотите изучить, как начать работу, отправьте свои идеи на https://gitlab.com/zhao-li/tutorial-articles.
Спасибо за уделенное время 🙏
Примечания
Стоит отметить некоторые нюансы с сохранением данных с контейнерами.
Использование именованных томов
В нашем примере мы использовали named volumes
. Docker-Compose помогает нам управлять созданием и уничтожением этих томов. Эти тома позволяют данным сохраняться, даже если мы уничтожим контейнеры.
# docker-compose.yml services: database: ... volumes: - database-data:/var/lib/postgresql/data/ volumes: database-data:
Чтобы сообщить Docker-Compose об уничтожении тома и его данных, необходимо выполнить docker-compose down --volumes
Без объемов
Если мы удалим эти конфигурации томов, каждый раз, когда мы уничтожаем наш контейнер, все данные, которые мы храним, будут утеряны. Создайте данные и попробуйте.
Использование хост-томов
Если бы мы использовали следующую конфигурацию:
# docker-compose.yml services: database: ... volumes: - ./host-folder/:/var/lib/postgresql/data/
Данные будут храниться на главном компьютере. Чтобы удалить эти данные и запустить новую новую базу данных, вам придется вручную удалить файлы данных с главного компьютера, используя что-то вроде rm -rf ./host-folder/
.