Docker manual
Base of Docker
sudo systemctl start docker #start docker demon manually
docker ps #показывает список запущенных контейнеров
docker ps -a #показывает список запущенных и остановленных контейнеров
docker container ls #аналогично
docker images #показывает список локальных образов
docker run hello-world #создание контейнера из образа hellp-world
--name simple_name #задаем имя контейнеру
--rm #автоматичесское удаление после остановки
docker rm "ID/name" #удалить контейнер
docker --help #help
docker system prune # удалить из системы контейнеры, которые уже не используются, ненужные сети и образы без имен и меток
docker run -it --rm busybox #подключится интерактивно через терминал sh к контейнеру, который был создан на основе образа busybox
# --rm автоматическое удаление контейнера после остановки
hostname #показать ID контейнера
hostname -i #показывает ip, присвоенный этому контейнеру
docker stop "ID/name" #остановка контейнера
docker kill "ID/name" #убить контейнер
docker container prune #удаляет все остановленные контейнеры
docker run -d nginx #запустить контейнер nginx и подключится к нему в фоновом режиме
docker container inspect "ID/name" #все детали контейнера
docker logs "ID/name" #посмотреть логи
docker exec -it "ID/name" bash #запускаем процесс bash внутри контейнера
/usr/share/nginx/html/index.html # index page for nginx
Mapping ports
Для открытия сервиса по определенному порту внутри контейнера
docker run -d -p 8080:80 nginx
# -p позволяет открыть порт 8080(внешний) на компе и пробросить его на порт 80(внутренний) внутри контейнера!
После этого можно в браузере переходить по 127.0.0.1:8080 и мы увидим index page for nginx
Mapping томов (valumes)
Замена содержимого папки /usr/share/nginx/html в контейнере на содержимое из ${PWD} на локальной машине
docker run -d -v ${PWD}:/usr/share/nginx/html nginx
# -v подлючение тома ${PWD} в контейнер по этому пути /usr/share/nginx/html
# PWD - переменная, содержащая текуший расположение в терминале, так же можно использовать абсолютные и относительные пути
Перенос строк
docker run \
--name simple_name \
-v ${PWD}:/usr/share/nginx/html \
-p 8080:80 \
-d \
--rm \
nginx
Создание Dockerfile
Docer image создается на основе Dockerfile (файл с инструкциями по созданию образа). Обычно Dockerfile помещают в корне приложения. При создании образа желательно указать имя и тег для образа. Используем Dockerfile когда билдим свой Docer image.
FROM python:alpine #базовый образ, alpine(тэг) - минимальная версия образа
WORKDIR /app #создаем рабочую дирректорию app в корне приложения
COPY . . #копирование фалов из локальной текущей папки в WORKDIR, и WORKDIR станет текущей папкой для всех последующих команд
CMD ["python", "main.py"] #команда, которая будет выполнена. Запустится процесс python с аргументом main.py
docker build . -t my-calendar:4.1.3 # созданин image с именем my-calendar и тэгом 4.1.3 на основе Dockerfile в текщей директории
docker-compose.yml
docker-compose необходим для запуска и настройки нескольких контейнеров в одном файле, позволяет автоматически создать образ на основе Dockerfile.
docker-compose автоматически создает изолированную сеть для взаимодействия контейнеров и поднимает DNS для взаимодействия между контейнерами используя имена сервисов а не ip
version: '3'
services:
app:
build: ./app
restart: always
mongo:
image: mongo
restart: always
docker-compose up -d # для запуска docker-compose и подключение к нему в фоновом режиме
docker-compose down # остановка и удаление всех контейнеров docker-compose
docker-compose up -d --build # перебилдить образы при изменении приложения
restart: always #перезапускать контейнер, если процесс остановился
Еще раз про Mapping volumes
Для сохранения данных после перезапуска контейнеров используется Mapping volumes в одной из двух вариаций:
- расшарить папку из Хоста ОС (чтение - запись). Данный вариант называется "bind mounts"
- Создать и расшарить папку внутри Docker (чтение - запись), в таком случае возможно расшарить папку для разных контейнеров. В этом случае обычно "Mountpoint": "var/lib/docker/volumes/..."
#подключение по варианту 1
version: '3'
services:
...
mysql:
image:mysql
...
volumes:
- /var/lib/mysql/exception_dir #папка иключение, которую не хотим перезапиывать
- ./mysql_data:/var/lib/mysql #mysql_data - папка на хосте
...
#подключение по варианту 2
version: '3'
services:
...
mysql:
image:mysql
...
volumes:
- /var/lib/mysql/exception_dir #папка иключение, которую не хотим перезапиывать
- mysql_data:/var/lib/mysql
...
volumes:
mysql_data: #создаем том внутри Docker
docker volume ls #показать все тома внутри Docker
docker inspect name_of_tom #детали о томе