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