Skip to content

Instantly share code, notes, and snippets.

@ruvaleev
Last active December 9, 2020 09:00
Show Gist options
  • Save ruvaleev/70e33b39b807993ee8eddf5594bc465d to your computer and use it in GitHub Desktop.
Save ruvaleev/70e33b39b807993ee8eddf5594bc465d to your computer and use it in GitHub Desktop.
Docker workshop. DZ 1

Журнал

Задание 1

  1. Запустить вашу любимую базу данных в докере,
  2. Подключиться к ней, создать там пару таблиц, сделать в них пару записей.
  3. Выйти, остановить и удалить контейнер (не образ).
  4. Запустить контейнер заново. Убедиться, что таблицы и записи с них на месте.

В качестве решения прислать в чат лог из терминала. (Спрашивать совета можно. Помогать друг-другу тоже)

Выполнение

  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?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment