# Решения

### 1. Установка Docker

Инструкции доступны на https://docs.docker.com/engine/install/debian/

#### Добавление GPG ключа официального репозитория Docker
````bash
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
````

#### Добавление репозитория в apt
````bash
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
````

#### Установка пакетов Docker
````bash
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
````

### 2. Базовые команды

#### 1.
````bash
sudo docker run hello-world
````

#### 2.
````bash
sudo docker pull busybox
````

#### 3.
````bash
sudo docker run busybox echo 'Hello, World!'
````

#### 4.
````bash
sudo docker run -it busybox
````
Внутри контейнера:
````bash
echo 'Hello, World!'
exit
````
Вообще, под "интерактивным режимом" здесь понимается именно два флага: `-i` и `-t`.\
Флаг `-i`, или собственно `--interactive`, означает, что stdin контейнера открыт и идет с хоста.\
А вот флаг `-t`, хотя и не обязателен, создает для контейнера псевдо-TTY. Чем чревато его отсутствие -\
студентам надо погуглить или напороться на это самим.

#### 5.
````bash
sudo docker run --name hello_world busybox echo 'Hello, World!'
````
После этого:
````bash
sudo docker start -a hello_world
````
Здесь важен флажок `-a`, т.е. чтобы stdout контейнера приаттачился, чтобы 'Hello, World!' вывелся на экран.

#### 6.
````bash
sudo docker create --name hello_world_delayed_start busybox echo 'Hello, World!'
sudo docker start -a hello_world_delayed_start
````

#### 7.
````bash
sudo docker run -d --name infinite_print busybox ash -c 'while true; do date +%T; sleep 1; done'
````
Для просмотра логов:
````bash
sudo docker logs infinite_print
````

#### 8.
Для вывода работающих контейнеров:
````bash
sudo docker ps
````
или
````bash
sudo docker container ls
````
Для вывода всех контейнеров:
````bash
sudo docker ps -a
````
или
````bash
sudo docker container ls -a
````

Для вывода остановленных контейнеров:
````bash
sudo docker ps -a -f status=exited -f status=created
````
или
````bash
sudo docker container ls -a -f status=exited -f status=created
````

#### 9.
````bash
sudo docker container prune -f
````
или же
````bash
sudo docker rm $(docker ps -a -q -f status=exited -f status=created)
````

#### 10.
````bash
sudo docker attach infinite_print
````
В параллельном терминале, для паузы:
````bash
sudo docker pause infinite_print
````
Для возобновления работы:
````bash
sudo docker unpause infinite_print
````
Для детача надо нажать комбинацию C-p C-q, но тут есть хитрость:
Для того, чтобы это было возможно, надо чтобы контейнер, запущенный с -d был запущен еще с -it
Т.е.
````bash
sudo docker run -dit --name infinite_print busybox ash -c 'while true; do date +%T; sleep 1; done'
````
Для остановки(мгновенно):
````bash
sudo docker kill infinite_print
````
или (если главный процесс не отвечает, придется немного подождать, прежде чем ему придет SIGKILL)
````bash
sudo docker stop infinite_print
````
или (но тогда контейнер будет не только остановлен но и удален)
````bash
sudo docker rm -f infinite_print
````

#### 11.
````bash
echo 'Hello, World!' > ~/hello.txt
sudo docker run -it --name hello_with_file busybox
````
В параллельном терминале:
````bash
sudo docker cp ~/hello.txt hello_with_file:/
````
В терминале с интерактивным контейнером:
````bash
cat /hello.txt
````

#### 12.
Листинг корневой директории:
````bash
sudo docker exec hello_with_file ls /
````
Дифф файловой системы:
````bash
sudo docker diff hello_with_file
````
Удаление файла:
````bash
sudo docker exec hello_with_file rm /hello.txt
````
