Продолжаем осваивать основные команды Docker, которые так важны любому начинающему специалисту в сфере виртуализации.
Первую часть статьи можно найти здесь.
Оглавление:
- Docker Exec и Docker SSH в контейнере
- Запуск контейнеров в обособленном режиме и docker attach
- Проверка истории образа Docker
- Docker Inspect-ируем контейнеры
- Копирование файлов с локальной машины в контейнер
- Создание собственных образов Docker
Docker Exec и Docker SSH в контейнере
Вам часто потребуется взаимодействовать с оболочкой контейнера для создания службы или решения проблем. Вы можете использовать команду docker exec
для создания интерактивной оболочки. Давайте запустим контейнер из образа ubuntu с оболочкой bash:
$ docker run --name my_ubuntu -it ubuntu:latest bash
root@53db072fc29e:/#
Строка root@hash#
означает, что вы находитесь в оболочке bash контейнера Docker. Вы можете выполнять команды оболочки:
Кстати, ещё не читали цикл статей по полезным советам при работе в Bash? Советуем ознакомиться!
Из другой командной строки локальной машины можно составить список контейнеров Docker:
$ docker ps
Вы можете видеть, что 'my_ubuntu' запущен. Предположим, вы хотите зайти по ssh в контейнер 'my_ubuntu'. Вы можете использовать bash метод docker exec
:
$ docker exec -it my_ubuntu bash
root@53db072fc29e:/#
Обратите внимание, что ID КОНТЕЙНЕРА и хэш командной строки совпадают. Значит, ваша попытка выполнить docker SSH в контейнер 'my_ubuntu' была успешной.
Используйте docker exec
для ввода команд в ваш контейнер. Например, вы можете запустить команду ls
на вашем докер-контейнере 'my_ubuntu' прямо из командной строки:
Запуск контейнеров в обособленном режиме и использование docker attach
В приведенном выше примере вы запустили контейнер ubuntu в режиме, когда он связан с текущей сессией командной строки(присоединённый, далее - attached). Вместо этого вы можете запустить его в отдельном режиме(далее - detached)
$ docker run -it -d --name my_ubuntu_2 ubuntu:latest bash
e36ebe4914dd0b18ffee9eebde5ab070a545fbfde8d762f67f759661a9d0e703
Проверяем, какие контейнеры запущены:
$ docker ps
Можно использовать команду docker attach
для получения такого же результата как с docker exec:
$ docker attach my_ubuntu_2
root@e36ebe4914dd:/#
Проверка истории образа Docker
Сообщество Docker создает образы docker. Эти образы создаются "послойно"(in layers(англ) - этапами). Вы можете использовать команду docker history
, чтобы посмотреть, как создавались образы. Давайте сначала выясним, какие образы у нас есть:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 597ce1600cf4 4 days ago 72.8MB
nginx latest f8f4ffc8092c 7 days ago 133MB
ubuntu 16.04 b6f507652425 5 weeks ago 135MB
Теперь давайте проверим историю образа 'nginx':
$ docker history nginx
Вы можете использовать команду history для образа, чтобы узнать, какие изменения произошли за последнее время. Если вы заметили проблему после запуска контейнера из новой версии образа, который вы уже использовали, эта команда может помочь вам найти причину. В качестве альтернативы можно использовать и следующий вариант команды:
$ docker image history nginx
Docker Inspect-ируем контейнеры
Вы можете использовать команду docker inspect
для получения низкоуровневой информации о вашей системе. Выполните команду docker ps
, чтобы получить список контейнеров Docker:
$ docker ps
Используем идентификатор CONTAINER ID для проверки контейнера (Вы можете использовать также имя контейнера):
$ docker inspect b5316860b495 [
{
"Id": "b5316860b495e33e706958b6a1d265e1b9a95e409e51116d41f4bf477623f229",
"Created": "2021-10-06T00:00:38.725532524Z",
"Path": "/docker-entrypoint.sh",
"Args": [
...
...
...
"DriverOpts": null
}
}
}
}
]
Команда предоставит много информации в формате JSON. Вот трюк для поиска IP-адреса контейнера:
$ docker inspect b5316860b495 | grep "IPAddress"
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
или же аналог grep в PowerShell(Windows):
Использование docker cp
для копирования файлов с локальной машины в контейнер
Давайте снова глянем список контейнеров Docker:
$ docker ps
Контейнер NGINX запущен на порту 8080. Поэтому, если вы зайдете на http://localhost:8080
, то увидите следующее:
Давайте создадим этот index.html в вашем локальном каталоге:
<html>
<Header><title>My website</title></header>
<body>
Hello world
</body>
</html>
Давайте проверим папку, в которой находится файл index.html в контейнере NGINX, используя команду docker exec
с командой ls
:
(Помните, что мы можем обратиться к конкретному контейнеру по его имени или CONTAINER ID. У меня это - sleepy_ritchie)
Перезапишите файл index.html контейнера локальным файлом, который вы создали:
(команда должна быть выполнена из той директории, в которой создавался файл index.html)
$ docker cp index.html sleepy_ritchie:usr/share/nginx/html/
Теперь, если вы снова проверите http://localhost:8080
, вы должны увидеть приветствие "Hello world".
Вы можете использовать команду docker cp
для перемещения файлов между вашей локальной машиной и созданными вами контейнерами. Этот метод можно использовать для перезаписи конфигурационных файлов или других активов(assets(англ).
Создание собственных образов Docker
Предположим, вы хотите создать будущие контейнеры из созданного вами контейнера "Hello World". Но вы можете создавать контейнеры только из образов. Чтобы создать больше контейнеров "Hello World", вам нужно сохранить текущий контейнер "Hello World" в виде образа.
Для начала остановим контейнер:
$ docker stop sleepy_ritchie
Теперь посмотрим все контейнеры Docker:
$ docker ps -a
Из STATUS видно, что контейнер NGINX 'sleepy_ritchie' остановлен. Используйте команду docker commit
для создания нового образа:
$ docker commit fa6c91a0a0e1 nginx_hello_world_template
sha256:94ba076ec8fe770cceda5ee881a99118e705cf1c62dc9573346703d38053db6d
Теперь, если проверить образы, можно увидеть новый образ:
Вы можете использовать этот образ так же, как и другие образы, и создавать новые контейнеры Docker. Вместо страницы "Welcome NGINX" у вновь созданных контейнеров будет страница "Hello world". Пример использования:
$ docker run -it -d -p 8886:80 nginx_hello_world_template
10ea2a19f9164bb1d46782709e1c556b940c7562adf8029365fbc2df510fbb13
Удаление контейнеров и образов Docker
Контейнеры и образы Docker занимают место на жестком диске, поэтому неплохо периодически очищать их. Давайте сначала остановим все контейнеры Docker, а затем посмотрим все контейнеров, для этого мы воспользуемся следующими командами Docker:
$ docker ps -a
В остановленном состоянии находятся 3 контейнерf. Останавливаю контейнер-шаблон NGINX и my_ubuntu_2 дополнительно с помощью $ docker stop 6a92bda54c42
(или вместо ID - brave_wescoff) и $ docker stop d4f89e3aa44a
(или вместо ID - my_ubuntu_2) Теперь можем использовать команду docker rm
для удаления контейнеров:
$ docker rm 6a92bda54c42 538de4a05e86 d4f89e3aa44a 0ed99d33d375 fa6c91a0a0e1
6a92bda54c42
538de4a05e86
d4f89e3aa44a
0ed99d33d375
fa6c91a0a0e1
Вместо CONTAINER ID можно также использовать NAMES. Теперь ваш список контейнеров должен быть чистым:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Отобразим образы Docker:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx_hello_world_template latest 3f2787d2de47 12 minutes ago 133MB
ubuntu latest 597ce1600cf4 4 days ago 72.8MB
nginx latest f8f4ffc8092c 7 days ago 133MB
ubuntu 16.04 b6f507652425 5 weeks ago 135MB
Вы можете удалить образы docker, используя команду docker rmi
и IMAGE ID:
$ docker rmi 3f2787d2de47 597ce1600cf4 f8f4ffc8092c b6f507652425
Теперь список образов Docker должен быть чистым:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
Поздравляем!
Что ж, надеюсь, это мини-руководство поможет вам обрести уверенность в использовании всех основных команд Docker.
Изучи Docker на нашем курсе по Devops
Попробовать бесплатно
Оригинал статьи на английском можно найти здесь.