You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

180 lines
4.9 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Решения
### 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
````