- Запустить вашу любимую базу данных в докере,
- Подключиться к ней, создать там пару таблиц, сделать в них пару записей.
- Выйти, остановить и удалить контейнер (не образ).
- Запустить контейнер заново. Убедиться, что таблицы и записи с них на месте.
В качестве решения прислать в чат лог из терминала. (Спрашивать совета можно. Помогать друг-другу тоже)
docker run --name docker_workshop --rm -v ~/database_directory:/var/lib/postgresql/data -e POSTGRES_PASSWORD=mysecretpassword -d postgres:12-alpine
Заходим в psql внутри контейнера:
docker exec -it docker_workshop bash
psql -U postgres
Проверяем, что таблицы с планетами не существует, создаем ее и добавляем туда одну запись, после чего выходим и из psql, и из контейнера:
postgres=# \d
Did not find any relations.
postgres=# CREATE TABLE planets (name varchar);
CREATE TABLE
postgres=# \d
List of relations
Schema | Name | Type | Owner
--------+---------+-------+----------
public | planets | table | postgres
(1 row)
postgres=# SELECT * FROM planets;
name
------
(0 rows)
postgres=# INSERT INTO planets (name) VALUES ('Mars');
INSERT 0 1
postgres=# SELECT * FROM planets;
name
------
Mars
(1 row)
postgres=# \q
bash-5.0# exit
exit
```
Проверяем, что контейнер есть, стопаем его, и убеждаемся, что он удаляется (потому что был запущен с флагом `--rm`):
```bash
ruslan@MacBook-Pro-Ruslan docker_workshop $ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f4472f3e833f postgres:12-alpine "docker-entrypoint.s…" 14 minutes ago Up 14 minutes 5432/tcp docker_workshop
ruslan@MacBook-Pro-Ruslan docker_workshop $ docker container stop f4472f3e833f
f4472f3e833f
ruslan@MacBook-Pro-Ruslan docker_workshop $ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Создаем контейнер по новой и опыть заходим в него и в psql внутри него:
docker run --name docker_workshop --rm -v ~/database_directory:/var/lib/postgresql/data -e POSTGRES_PASSWORD=mysecretpassword -d postgres:12-alpine
docker exec -it docker_workshop bash
bash-5.0# psql -U postgres
psql (12.5)
Type "help" for help.
Убеждаемся, что наша таблица на месте и с созданными ранее записями:
postgres=# SELECT * FROM planets;
name
------
Mars
(1 row)
Чтобы извне обратиться к инстансу psql, который крутится внутри контейнера, явно зададим порт (например 5000) для этого контейнера.
С помощью команды docker image inspect postgres:12-alpine
выясняем, каким портом пользуется этот инстанс:
...
"ExposedPorts": {
"5432/tcp": {}
}
...
Затем добавляем к нашей команде директиву -p 5000:5432
:
docker run --name docker_workshop --rm -v ~/database_directory:/var/lib/postgresql/data -p 5000:5432 -e POSTGRES_PASSWORD=mysecretpassword -d postgres:12-alpine
И заходим в postgres извне контейнера:
psql -h 0.0.0.0 -p 5000 -U postgres
Password for user postgres: # Вводим mysecretpassword
psql (12.3, server 12.5)
Type "help" for help.
postgres=# \d
List of relations
Schema | Name | Type | Owner
--------+---------+-------+----------
public | planets | table | postgres
(1 row)
postgres=# SELECT * FROM planets;
name
------
Mars
(1 row)
После того, как остановили и удалили контейнер, проверим, а точно ли это был тот инстанс, что крутился внутри него:
psql -h 0.0.0.0 -p 5000 -U postgres
psql: error: could not connect to server: could not connect to server: Connection refused
Is the server running on host "0.0.0.0" and accepting
TCP/IP connections on port 5000?