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.

9.7 KiB

Решения

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

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

Добавление GPG ключа официального репозитория Docker

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

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

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

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

1.

sudo docker run hello-world

2.

sudo docker pull busybox

3.

sudo docker run busybox echo 'Hello, World!'

4.

sudo docker run -it busybox

Внутри контейнера:

echo 'Hello, World!'
exit

Вообще, под "интерактивным режимом" здесь понимается именно два флага: -i и -t.
Флаг -i, или собственно --interactive, означает, что stdin контейнера открыт и идет с хоста.
А вот флаг -t, хотя и не обязателен, создает для контейнера псевдо-TTY. Чем чревато его отсутствие -
студентам надо погуглить или напороться на это самим.

5.

sudo docker run --name hello_world busybox echo 'Hello, World!'

После этого:

sudo docker start -a hello_world

Здесь важен флажок -a, т.е. чтобы stdout контейнера приаттачился, чтобы 'Hello, World!' вывелся на экран.

6.

sudo docker create --name hello_world_delayed_start busybox echo 'Hello, World!'
sudo docker start -a hello_world_delayed_start

7.

sudo docker run -d --name infinite_print busybox ash -c 'while true; do date +%T; sleep 1; done'

Для просмотра логов:

sudo docker logs infinite_print

8.

Для вывода работающих контейнеров:

sudo docker ps

или

sudo docker container ls

Для вывода всех контейнеров:

sudo docker ps -a

или

sudo docker container ls -a

Для вывода остановленных контейнеров:

sudo docker ps -a -f status=exited -f status=created

или

sudo docker container ls -a -f status=exited -f status=created

9.

sudo docker container prune -f

или же

sudo docker rm $(docker ps -a -q -f status=exited -f status=created)

10.

sudo docker attach infinite_print

В параллельном терминале, для паузы:

sudo docker pause infinite_print

Для возобновления работы:

sudo docker unpause infinite_print

Для детача надо нажать комбинацию C-p C-q, но тут есть хитрость: Для того, чтобы это было возможно, надо чтобы контейнер, запущенный с -d был запущен еще с -it Т.е.

sudo docker run -dit --name infinite_print busybox ash -c 'while true; do date +%T; sleep 1; done'

Для остановки(мгновенно):

sudo docker kill infinite_print

или (если главный процесс не отвечает, придется немного подождать, прежде чем ему придет SIGKILL)

sudo docker stop infinite_print

или (но тогда контейнер будет не только остановлен но и удален)

sudo docker rm -f infinite_print

11.

echo 'Hello, World!' > ~/hello.txt
sudo docker run -it --name hello_with_file busybox

В параллельном терминале:

sudo docker cp ~/hello.txt hello_with_file:/

В терминале с интерактивным контейнером:

cat /hello.txt

12.

Листинг корневой директории:

sudo docker exec hello_with_file ls /

Дифф файловой системы:

sudo docker diff hello_with_file

Удаление файла:

sudo docker exec hello_with_file rm /hello.txt

3. Volumes

1.

Для монтирования директории:

docker run --mount type=bind,source=/home/stud,target=/home/stud -it busybox

Внутри контейнера

ls /home/stud

2.

docker volume create my-volume

Для просмотра свойств:

docker volume inspect my-volume

3.

Вывод всех томов:

docker voume ls

4.

 docker run -it --mount type=volume,source=my-volume,target=/data busybox

5.

Внутри контейнера:

echo 'Hello, world!' > /data/hello.txt

Потом - остановить контейнер, далее сделать например docker container prune, повторить запуск как на
предыдущем шаге, и внутри контейнера сделать:

cat /data/hello.txt

6.

docker container prune -f && docker volume prune -a -f

4. Сеть

1.

docker network create -d bridge --subnet=172.168.0.0/16 --gateway=172.168.0.1 my-network

2.

Просмотр всех сетей:

docker network ls

Просмотр свойств:

docker network inspect my-network

3.

docker run --name cats_app --mount type=bind,source=./cats_app,target=/app --network my-network -it python:3.12 /bin/bash

4.

Внутри контейнера:

cd /app && ./install.sh && ./run.sh

5.

docker run --network my-network --publish 8080:80 --mount type=bind,source=./cats_app/nginx.conf,target=/etc/nginx/nginx.conf nginx

6.

docker run --name cats_app --mount type=bind,source=./cats_app,target=/app --network my-network -p 127.0.0.1:5001:5000 -it python:3.12 /bin/bash

Внутри контейнера:

cd /app && ./install.sh && ./run.sh

7.

docker run --mount type=bind,source=./cats_app,target=/app --network host -it python:3.12 /bin/bash -c 'cd /app && ./install.sh && ./run.sh'

5. Работа с образами

1.

from busybox

entrypoint /bin/echo 'Hello, World!'

2.

В директории с Dockerfile:

docker build -t hello .

3.

docker image ls

Для просмотра свойств:

docker image inspect hello

4.

docker run hello

5.

from busybox

env name 'World'

entrypoint /bin/echo "Hello, $world!"

В директории с Dockerfile:

docker build -t hello . && docker run -e name=Student hello

Здесь будет интересно если студенты наткнутся на разницу в

entrypoint /bin/echo "Hello, $world!"

и

entrypoint ["/bin/echo", "Hello, $world!"]

6.

docker tag hello hello:1.0.0

7.

Сохранение:

docker save hello -o hello.tar

Удаление:

docker rmi -f $(docker images -q -f 'reference=hello:*')

Восстановление:

docker load -i hello.tar

8.

Предположим что Dockerfile находится в этой же директории, а исходники
приложения лежат в ./cats_app

from python:3.12

copy ./cats_app /app

workdir /app

run ./install.sh

entrypoint ["python3", "app.py"]

Создание образа:

docker build -t cats_app .

Запуск:

docker run -p 5000:5000 cats_app
docker run --name registry --detach -p 127.0.0.1:12345:5000 --mount type=bind,source=./registry,target=/var/lib/registry registry:2

Инструкции для более сложного сетапа можно посмотреть тут:

https://medium.com/@ManagedKube/docker-registry-2-setup-with-tls-basic-auth-and-persistent-data-8b98a2a73eec

Создание тегов для локального реестра:

docker tag hello localhost:12345/hello
docker tag hello:1.0.0 localhost:12345/hello:1.0.0
docker tag cats_app localhost:12345/cats_app

Загрузка образов:

docker push -a localhost:12345/hello
docker push -a localhost:12345/cats_app

Удаление из локальной инсталляции докера:

docker rmi -f $(docker images -q -f 'reference=*/hello:*')
docker rmi -f $(docker images -q -f 'reference=hello:*')
docker rmi -f $(docker images -q -f 'reference=*/cats_app:*')
docker rmi -f $(docker images -q -f 'reference=cats_app:*')

Запуск:

docker run -p 8080:5000 localhost:12345/cats_app
docker run localhost:12345/hello