Docker manual

Docker manual
Photo by Bernd 📷 Dittrich / Unsplash

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 в одной из двух вариаций:

  1. расшарить папку из Хоста ОС (чтение - запись). Данный вариант называется "bind mounts"
  2. Создать и расшарить папку внутри 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 #детали о томе

Отличные статьи по Docker

Read more

Логи попыток входа по SSH

Логи попыток входа по SSH

Основанно на этой статье cat /var/log/auth.log grep "Failed password" /var/log/auth.log grep "failure" /var/log/auth.log Используя функционал команд awk, uniq и sort, можно определить, с каких IP-адресов было наибольшее количество неудачных попыток установления SSH-соединений: grep "Failed password"

Аутентификация SSH по ключу

Аутентификация SSH по ключу

1. Создайте ключ на локальном компьютере: запустите терминал и выполните команду ssh-keygen. Задайте пароль (кодовую фразу) для ключа, или можно несколько раз нажать Enter. cat ~/.ssh/id_rsa #посмотреть приватный ключ cat ~/.ssh/id_rsa.pub #посмотреть публичный ключ 1. Скопируйте ключ на сервер: выполните в терминале команду ssh-copy-id user@

Траблшутинг Linux

Траблшутинг Linux

Место на дисках, состояние дисков df -h #посмотреть свободное место на подключенных дисках df -i #колличество использованных inod в системе du -sh /tmp #показать сколько места занимают все файлы в дир /tmp sudo smartctl -a /dev/nvme0n1p5 #получить smart отчет о hdd cat /proc/mdstat #информация о софтовых raid массивах