Конструкция контейнера в Docker

Платформа Docker изначально создавалась для операционной системы Linux, а затем была адаптирована для Windows и macOS.

Что такое контейнер в Docker?

Процессы и подпроцессы в Docker выполняются изолированно. При этом используются два основополагающих принципа.

Пространство имен

Пространства имен позволяют изолировать один набор имен от других. Имена классов, объявленные в одном пространстве, не конфликтуют с себе подобными в другом.

Контрольная группа (cgroups)

Концепция контрольной группы позволяет распределять время процессора, системную память, пропускную способность сети и их комбинации между выполняемыми в системе группами задач (процессов).

Команды

Получить список всех активных контейнеров.

docker psr ps

Получить список всех активных и неактивных контейнеров.

docker ps -a

Получить список всех контейнеров с хэш-кодом.

docker ps -a -q

Построить контейнер.

docker run image_name
#Например, node, nginx, php...

Построить в интерактивном режиме и подключить терминал.

docker run image_name -it# -i: iterative
# -t: tty

Создать контейнер и запустить его в Bash.

docker run -it ubuntu bash

Уничтожить контейнер при остановке.

docker run -it ubuntu bash --rm

Чтобы открыть порт контейнера для локального компьютера, используйте -p.

docker run -p 8080:80 nginx
#8080: local machine port
#80: exposed container port

Чтобы успешно отсоединить Bash, используйте -d.

docker run -d -p 8080:80 nginx

Остановить контейнер.

docker stop container_name or hash

Удалить контейнер.

docker rm container_name or hash

Чтобы удалить работающий контейнер, используйте -f.

docker rm container_name or hash -f

Выполнить действие над уже созданным контейнером.

docker exec -it container_name bash

Предоставить локальные файлы контейнеру.

docker run -d -p 8080:80 --name test --mount type=bind source="${pwd}"/html,target=usr/share/nginx/html image_name

Source  —  это местонахождение файлов, а target  —  это адрес, по которому будет скопировано содержимое. Иначе говоря команда pwd указывает текущий адрес. Например:

$ pwd
 /c/Users/docker/Documents/docker/node

Что такое volume в Doker?

Volume  —  это данные, называемые томами. Они передаются из памяти компьютера в контейнер и обратно.

Перечислить все тома.

docker volume ls

Очистить все неиспользуемые тома.

docker volume prune

Создать том.

docker volume create volume_name

Проверить том.

docker volume inspect volume_name

Создать том при запуске контейнера.

docker run -d -p 80:8080 --mount type=volue,source=volume_name,target=usr/share/nginx/html nginx

Что такое images в Doker?

Образы (images) Doker состоят из послойно размещающихся файловых систем. Они являются основой создания приложений.

Загрузить образ.

docker pull image_name

Перечислить все загруженные образы.

docker images

Удалить образ.

docker rmi image_name

Использование файла Docker для построения образа

# syntax=docker/dockerfile:1
FROM node:12-alpine
RUN apk add --no-cache python g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
ENTRYPOINT ["script.sh"]
CMD ["node", "src/index.js"]
  • FROM  —  это базовый образ для создания собственного образа.
  • WORKDIR  —  каталог по умолчанию для загружаемого образа.
  • RUN  —  команды для загрузки или создания чего-либо.
  • COPY  —  это файлы, копируемые из памяти компьютера в контейнер.
  • CMD  —  это команды, которые можно передать при запуске контейнера.
  • ENTRYPOINT  —  это, в отличие от CMD, неизменяемые при создании образа команды, которые можно заменить при запуске контейнера.

ENTRYPOINT и CMD

ENTRYPOINT определяет всегда выполняемую при запуске контейнера команду. CMD используют для установки аргументов по умолчанию для ENTRYPOINT или для выполнения команды в контейнере. RUN запускает команды внутри образа Docker.

Построить образ.

docker build -t tiagosantosdev/image_name:latest .

Для другого названия файла docker используйте -f.

docker build -t  tiagosantosdev/hello-medium . -f Dockerfile.prod

Сети в Docker

В докере есть четыре типа сетей, по умолчанию используется bridge (мост).

bridge  —  сетевой драйвер по умолчанию. Этот тип сети будет создаваться, если не указывать драйвер. Мостовые сети обычно применяют для исполняемых в автономных контейнерах приложений, которым необходимо обмениваться данными.

host  —  применим для автономных контейнеров, удаляет сетевую изоляцию между контейнером и хостом Docker и напрямую использует сеть хоста.

overlay  —  оверлейные сети, они соединяют несколько демонов (daemons) Docker и позволяют сервисам swarm взаимодействовать друг с другом. Такие сети можно использовать для упрощения информационного обмена между сервисом swarm и автономным контейнером или между двумя автономными контейнерами на разных демонах Docker. При этом не нужна маршрутизация на уровне ОС между этими контейнерами.

macvlan  —  сети Macvlan, которые позволяют назначить MAC-адрес контейнеру, чтобы он отображался в сети как физическое устройство. Демон Docker направляет трафик в контейнеры по их MAC-адресам. В некоторых случаях драйвер macvlan  —  лучший выбор для старых версий приложений, которые должны напрямую подключаться к физической сети вместо следования через сетевой стек хоста Docker.

none  —  контейнеры отключены от всех сетей. Этот вариант обычно используется вместе с настраиваемым сетевым драйвером, недоступен для сервисов swarm.

Перечислить все сети.

docker network ls

Построить сеть.

docker create network create --driver bridge my_network

Построить контейнер с сетью.

docker run -d -it --name ubuntu --network my_network

Создать соединение с двумя уже созданными контейнерами.

docker network connect my_network my_container

Проверить сеть.

docker network inspect my_network

Использование многоэтапных (multi-stage) сборок

В подобном процессе используется контейнер для построения приложения, а затем создается новый контейнер с подготовленными к применению файлами. Уменьшается фактический размер контейнера.

Как использовать Docker Compose?

version: "3.9"  # Опционально с v1.27.0
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}

Загрузить все контейнеры.

docker-compose up -d

Остановить все контейнеры.

docker-compose down

Построить все образы.

docker-compose up --build

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи Tiago Santos: Container construction with Docker

Предыдущая статьяКак реализовать редактор форматированного текста в вашем React-приложении
Следующая статьяАнтишаблоны программирования