Проблема

Вы хотите использовать PostgreSQL и избегать ручной установки базы данных с помощью Docker-Compose.

Решение

В этом руководстве рассматривается использование Docker-Compose для установки и использования базы данных PostgreSQL.

Использование Docker-Compose имеет следующие преимущества:

  • это может быть быстрее, повторяемо и автоматически
  • это избавляет вас от установки базы данных непосредственно на вашем хост-компьютере
  • он позволяет вам иметь несколько разных версий базы данных, если каждый из ваших проектов требует, чтобы вы использовали разные версии

Вот шаги, которые мы предпримем для этого урока:

  1. настроить docker-compose для использования контейнера postgresql
  2. войдите в контейнер postgresql
  3. создать таблицу
  4. добавлять и читать данные из таблицы

Передняя Материя

Код для этого примера контейнерной базы данных 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/.

использованная литература