push
This commit is contained in:
@@ -0,0 +1,223 @@
|
||||
## Установка Docker Engine на Debian/Ubuntu
|
||||
|
||||
Tиповой путь через официальный репозиторий Docker.
|
||||
Лучше проверить актуальную версию в [официальном гайде](https://docs.docker.com/engine/install/ubuntu/)
|
||||
|
||||
```
|
||||
sudo apt-get update
|
||||
sudo apt-get install ca-certificates curl
|
||||
sudo install -m 0755 -d /etc/apt/keyrings
|
||||
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
|
||||
sudo chmod a+r /etc/apt/keyrings/docker.asc
|
||||
|
||||
echo \
|
||||
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
|
||||
$(. /etc/os-release && echo "${VERSION_CODENAME:-$VERSION_CODENAME}") stable" | \
|
||||
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||
|
||||
sudo apt-get update
|
||||
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
|
||||
```
|
||||
|
||||
Проверяем:
|
||||
```
|
||||
sudo docker run --rm hello-world
|
||||
```
|
||||
|
||||
<img src="./assets/image_1777876998936.jpg" width="auto">
|
||||
|
||||
Опционально можно запускать без `sudo`,:
|
||||
|
||||
```
|
||||
sudo usermod -aG docker $USER
|
||||
# выйти из сессии и зайти снова
|
||||
docker run --rm hello-world
|
||||
```
|
||||
|
||||
<img src="./assets/image_1777877040047.jpg" width="auto">
|
||||
|
||||
Проверка версии:
|
||||
|
||||
```
|
||||
docker version
|
||||
docker info
|
||||
```
|
||||
|
||||
<img src="./assets/image_1777877076386.jpg" width="auto">
|
||||
|
||||
## Базовый жизненный цикл контейнера
|
||||
|
||||
Скачать образ и запустить интерактивную оболочку, образ автоматически скачивается с Docker Registry:
|
||||
|
||||
```
|
||||
docker run -it --rm debian:bookworm-slim bash
|
||||
```
|
||||
|
||||
Установка образа:
|
||||
|
||||
<img src="./assets/image_1777877203794.jpg" width="auto">
|
||||
|
||||
Мы указали `bash` в команде, по этому зашли в интерактивный терминал:
|
||||
|
||||
<img src="./assets/image_1777877288015.jpg" width="auto">
|
||||
|
||||
В контейнере, так же как и в линуксе, можно управлять файлами, директориями, сервисами, но ограничено.
|
||||
Выйти из bash - `exit`, контейнер остановится и `--rm` удалит его.
|
||||
|
||||
Коротко про флаги:
|
||||
|
||||
| Флаг | Смысл |
|
||||
| -------------------------------------- | --------------------------------- |
|
||||
| `-it` | интерактив + псевдо-TTY |
|
||||
| `--rm` | удалить контейнер после остановки |
|
||||
| `-d` | запустить контейнер в фон |
|
||||
| `--name` | имя контейнера |
|
||||
| `-p 8080:80` | проброс порта хост:контейнер |
|
||||
| `-v /путь/на/хосте:/путь/в/контейнере` | том (данные на хосте) |
|
||||
|
||||
Запуск веб-сервера в фоне:
|
||||
```
|
||||
docker run -d --name demo-nginx -p 8080:80 nginx:alpine
|
||||
```
|
||||
|
||||
<img src="./assets/image_1777877487366.jpg" width="auto">
|
||||
|
||||
Проверим работу на порту 8080:
|
||||
|
||||
<img src="./assets/image_1777877573260.jpg" width="auto">
|
||||
|
||||
Список контейнеров и логи:
|
||||
|
||||
`docker ps` - посмотреть список АКТИВНЫХ контейнеров
|
||||
`docker ps -a` - посмотреть список ВСЕХ контейнеров
|
||||
`docker logs demo-nginx` - вывод логов контейнера
|
||||
`docker logs -f demo-nginx` - смотреть логи контейнера в реальном времени
|
||||
|
||||
<img src="./assets/image_1777877711970.jpg" width="auto">
|
||||
|
||||
Остановка и удаление:
|
||||
|
||||
`docker stop demo-nginx` - остановка контейнера
|
||||
`docker rm demo-nginx` - удалить контейнер
|
||||
|
||||
<img src="./assets/image_1777877795229.jpg" width="auto">
|
||||
|
||||
## Вход в уже запущенный контейнер: `docker exec`
|
||||
|
||||
```
|
||||
docker run -d --name my-nginx -p 8080:80 nginx:alpine
|
||||
docker exec -it my-nginx sh
|
||||
```
|
||||
|
||||
Внутри можно смотреть файлы конфигурации, например `cat /etc/nginx/nginx.conf`, ставить утилиты в отладочных образах и т.д.
|
||||
|
||||
<img src="./assets/image_1777877943446.jpg" width="auto">
|
||||
|
||||
Так же интересный факт: мы уже устанавливали образ `nginx:alpine`, по этому нам его повторно скачивать не нужно, он хранится в docker cache. Единственный минус - занимает место на диске.
|
||||
## Копирование файлов **в** контейнер и **из** контейнера: `docker cp`
|
||||
|
||||
На хосте создадим простейший html файл:
|
||||
`echo '<h1>Hallo from DOCKER</h1>' > /tmp/index.html`
|
||||
|
||||
Затем копирует его прямо в наш docker контейнер:
|
||||
`docker cp /tmp/index.html my-nginx:/usr/share/nginx/html/index.html`
|
||||
<img src="./assets/image_1777878325863.jpg" width="auto">
|
||||
|
||||
Обновим страницу в браузере - должен отобразиться новый html.
|
||||
|
||||
<img src="./assets/image_1777878360584.jpg" width="auto">
|
||||
|
||||
Скопировать **из** контейнера на хост:
|
||||
```
|
||||
docker cp my-nginx:/etc/nginx/nginx.conf /tmp/nginx.conf.from-container
|
||||
```
|
||||
|
||||
<img src="./assets/image_1777878436523.jpg" width="auto">
|
||||
|
||||
Важно: `docker cp` удобен для отладки и разовых правок. Для поставки контента, файлов в образ используйте функцию `COPY` в `Dockerfile` или тома в Compose (смотреть дальше по гайду).
|
||||
|
||||
## Тома (volumes): данные переживают пересоздание контейнера
|
||||
|
||||
Именованный том:
|
||||
```
|
||||
docker volume create webdata
|
||||
docker run -d --name nginx-vol -p 8081:80 -v webdata:/usr/share/nginx/html nginx:alpine
|
||||
docker exec nginx-vol sh -c 'echo vol > /usr/share/nginx/html/index.html'
|
||||
```
|
||||
|
||||
Про каждую команду:
|
||||
`docker volume create webdata` - создаем именованный том `webdata` на нашем хосте.
|
||||
|
||||
`docker run -d --name nginx-vol -p 8081:80 -v webdata:/usr/share/nginx/html nginx:alpine` - создем контейнер `nginx-vol` на порту 8081 и монитируем ему том `webdata` в каталог контейнера `/usr/share/nginx/html`. В этом каталоге nginx подхватывает index.html файл.
|
||||
|
||||
`docker exec nginx-vol sh -c 'echo vol > /usr/share/nginx/html/index.html'` - выполняем команду ВНУТРИ контейнера `nginx-vol` через "sh -c" и передать ему команду `echo`.
|
||||
|
||||
<img src="./assets/image_1777879323365.jpg" width="auto">
|
||||
|
||||
<img src="./assets/image_1777879337998.jpg" width="auto">
|
||||
|
||||
Коротко, что мы сделали:
|
||||
Мы создали том `webdata` - это физическое место на нашем хосте. Мы к контейнеру примонтировали этот том `-v webdata:/usr/share/nginx/html`. То есть у контейнера теперь есть доступ к этому физическому месту(тому). Затем мы создали файл `index.html` в каталоге `/usr/share/nginx/html`, это означает, что мы фактически создали файл у себя на хосте. Файлы в томах никуда не пропадают при удалении контейнеров.
|
||||
|
||||
Проверим на деле:
|
||||
```
|
||||
docker stop nginx-vol
|
||||
docker rm nginx-vol
|
||||
docker run -d --name nginx-vol -p 8081:80 -v webdata:/usr/share/nginx/html nginx:alpine
|
||||
```
|
||||
|
||||
<img src="./assets/image_1777879905425.jpg" width="auto">
|
||||
|
||||
Новый контейнер взял файл с тома. Если мы зайдем в контейнер и удалим файл index.html, то он удалится и в томе(на хосте).
|
||||
|
||||
Bind-mount, привязка папки с хоста:
|
||||
|
||||
```
|
||||
mkdir -p ~/docker-html && echo '<h1>Bind mount edited</h1>' > ~/docker-html/index.html
|
||||
docker run -d --name nginx-bind -p 8082:80 -v ~/docker-html:/usr/share/nginx/html:ro nginx:alpine
|
||||
```
|
||||
|
||||
Про каждую команду:
|
||||
|
||||
`mkdir -p ~/docker-html && echo '<h1>Bind mount</h1>' > ~/docker-html/index.html` - в домашней директории юзера создаем папку `docker-html`, в которой создаем index.html файл.
|
||||
|
||||
`docker run -d --name nginx-bind -p 8082:80 -v ~/docker-html:/usr/share/nginx/html:ro nginx:alpine` - поднимает контейнер `nginx-bind` на порту 8082, к которому мы примонтировали нашу ЛОКАЛЬНУЮ папку `~/docker-html`. Это не именованный том из зоны docker, а непосредственно наша папка.
|
||||
|
||||
`:ro` - только чтение из контейнера, не дает перезаписывать наши файлы в папке `~/docker-html`.
|
||||
|
||||
<img src="./assets/image_1777880623434.jpg" width="auto">
|
||||
|
||||
Теперь поменяем в нашей локальной папке файл и посмотрим что будет:
|
||||
|
||||
<img src="./assets/image_1777880680918.jpg" width="auto">
|
||||
|
||||
Всё работает.
|
||||
## Сеть: как контейнеры видят друг друга
|
||||
|
||||
По умолчанию контейнеры в **bridge** могут общаться по IP. Удобнее создать **пользовательскую сеть** и обращаться по **имени контейнера**:
|
||||
|
||||
```
|
||||
docker network create app-net
|
||||
docker run -d --name backend --network app-net nginx:alpine
|
||||
docker run -it --rm --network app-net alpine wget -qO- http://backend
|
||||
```
|
||||
|
||||
<img src="./assets/image_1777881503149.jpg" width="auto">
|
||||
|
||||
Мы создали виртуальную докер сеть `app-net`, создали первый контейнер с nginx с сетью `app-net`, затем второй контейнер с такой же сетью. Со второго контейнера мы обратились к первому по его названию.
|
||||
|
||||
<img src="./assets/image_1777881422205.png" width="auto">
|
||||
|
||||
## Очистка среды
|
||||
|
||||
```
|
||||
docker stop my-nginx nginx-vol nginx-bind backend
|
||||
docker rm my-nginx nginx-vol nginx-bind backend
|
||||
docker volume rm webdata
|
||||
docker network rm app-net
|
||||
```
|
||||
|
||||
## Что дальше
|
||||
|
||||
- Часть **3** — сборка своего образа, `Dockerfile`, многоэтапные сборки, `COPY` vs монтирование.
|
||||
- Часть **4** — полный пример **Docker Compose** из репозитория `docker/examples/multi-service`.
|
||||
Reference in New Issue
Block a user